mirror of https://gitlab.com/bashrc2/epicyon
Optional notifications for the arrival of posts from low frequency follows
parent
0eb405ef5b
commit
71c2794a19
30
daemon.py
30
daemon.py
|
@ -286,6 +286,8 @@ from bookmarks import undoBookmark
|
|||
from petnames import setPetName
|
||||
from followingCalendar import addPersonToCalendar
|
||||
from followingCalendar import removePersonFromCalendar
|
||||
from notifyOnPost import addNotifyOnPost
|
||||
from notifyOnPost import removeNotifyOnPost
|
||||
from devices import E2EEdevicesCollection
|
||||
from devices import E2EEvalidDevice
|
||||
from devices import E2EEaddDevice
|
||||
|
@ -2087,6 +2089,34 @@ class PubServer(BaseHTTPRequestHandler):
|
|||
self.server.POSTbusy = False
|
||||
return
|
||||
|
||||
# person options screen, on notify checkbox
|
||||
# See htmlPersonOptions
|
||||
if '&submitNotifyOnPost=' in optionsConfirmParams:
|
||||
notify = None
|
||||
if 'notifyOnPost=' in optionsConfirmParams:
|
||||
notify = optionsConfirmParams.split('notifyOnPost=')[1]
|
||||
if '&' in notify:
|
||||
notify = notify.split('&')[0]
|
||||
if notify == 'on':
|
||||
addNotifyOnPost(baseDir,
|
||||
chooserNickname,
|
||||
domain,
|
||||
optionsNickname,
|
||||
optionsDomainFull)
|
||||
else:
|
||||
removeNotifyOnPost(baseDir,
|
||||
chooserNickname,
|
||||
domain,
|
||||
optionsNickname,
|
||||
optionsDomainFull)
|
||||
usersPathStr = \
|
||||
usersPath + '/' + self.server.defaultTimeline + \
|
||||
'?page=' + str(pageNumber)
|
||||
self._redirect_headers(usersPathStr, cookie,
|
||||
callingDomain)
|
||||
self.server.POSTbusy = False
|
||||
return
|
||||
|
||||
# person options screen, permission to post to newswire
|
||||
# See htmlPersonOptions
|
||||
if '&submitPostToNews=' in optionsConfirmParams:
|
||||
|
|
23
inbox.py
23
inbox.py
|
@ -86,6 +86,7 @@ from categories import guessHashtagCategory
|
|||
from context import hasValidContext
|
||||
from speaker import updateSpeaker
|
||||
from announce import isSelfAnnounce
|
||||
from notifyOnPost import notifyWhenPersonPosts
|
||||
|
||||
|
||||
def storeHashTags(baseDir: str, nickname: str, postJsonObject: {}) -> None:
|
||||
|
@ -1850,6 +1851,18 @@ def _likeNotify(baseDir: str, domain: str, onionDomain: str,
|
|||
pass
|
||||
|
||||
|
||||
def _notifyPostArrival(baseDir: str, handle: str, url: str) -> None:
|
||||
"""Creates a notification that a new post has arrived
|
||||
"""
|
||||
accountDir = baseDir + '/accounts/' + handle
|
||||
if not os.path.isdir(accountDir):
|
||||
return
|
||||
notifyFile = accountDir + '/.newNotifiedPost'
|
||||
if not os.path.isfile(notifyFile):
|
||||
with open(notifyFile, 'w+') as fp:
|
||||
fp.write(url)
|
||||
|
||||
|
||||
def _replyNotify(baseDir: str, handle: str, url: str) -> None:
|
||||
"""Creates a notification that a new reply has arrived
|
||||
"""
|
||||
|
@ -2275,6 +2288,7 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int,
|
|||
|
||||
_updateLastSeen(baseDir, handle, actor)
|
||||
|
||||
postIsDM = False
|
||||
isGroup = _groupHandle(baseDir, handle)
|
||||
|
||||
if _receiveLike(recentPostsCache,
|
||||
|
@ -2512,6 +2526,15 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int,
|
|||
|
||||
# save the post to file
|
||||
if saveJson(postJsonObject, destinationFilename):
|
||||
if not postIsDM:
|
||||
# should we notify that a post from this person has arrived?
|
||||
handleNickname = handle.split('@')[0]
|
||||
handleDomain = handle.split('@')[1]
|
||||
if notifyWhenPersonPosts(baseDir, nickname, domain,
|
||||
handleNickname, handleDomain):
|
||||
postId = removeIdEnding(postJsonObject['id'])
|
||||
_notifyPostArrival(baseDir, handle, postId)
|
||||
|
||||
# If this is a reply to a muted post then also mute it.
|
||||
# This enables you to ignore a threat that's getting boring
|
||||
if isReplyToMutedPost:
|
||||
|
|
|
@ -0,0 +1,104 @@
|
|||
__filename__ = "notifyOnPost.py"
|
||||
__author__ = "Bob Mottram"
|
||||
__license__ = "AGPL3+"
|
||||
__version__ = "1.2.0"
|
||||
__maintainer__ = "Bob Mottram"
|
||||
__email__ = "bob@freedombone.net"
|
||||
__status__ = "Production"
|
||||
__module_group__ = "Calendar"
|
||||
|
||||
import os
|
||||
from utils import removeDomainPort
|
||||
|
||||
|
||||
def _notifyOnPostArrival(baseDir: str, nickname: str, domain: str,
|
||||
followingNickname: str,
|
||||
followingDomain: str,
|
||||
add: bool) -> None:
|
||||
"""Adds or removes a handle from the following.txt list into a list
|
||||
indicating whether to notify when a new post arrives from that account
|
||||
"""
|
||||
# check that a following file exists
|
||||
domain = removeDomainPort(domain)
|
||||
followingFilename = baseDir + '/accounts/' + \
|
||||
nickname + '@' + domain + '/following.txt'
|
||||
if not os.path.isfile(followingFilename):
|
||||
print("WARN: following.txt doesn't exist for " +
|
||||
nickname + '@' + domain)
|
||||
return
|
||||
handle = followingNickname + '@' + followingDomain
|
||||
|
||||
# check that you are following this handle
|
||||
if handle + '\n' not in open(followingFilename).read():
|
||||
print('WARN: ' + handle + ' is not in ' + followingFilename)
|
||||
return
|
||||
|
||||
notifyOnPostFilename = baseDir + '/accounts/' + \
|
||||
nickname + '@' + domain + '/notifyOnPost.txt'
|
||||
|
||||
# get the contents of the notifyOnPost file, which is
|
||||
# a set of handles
|
||||
followingHandles = ''
|
||||
if os.path.isfile(notifyOnPostFilename):
|
||||
print('notify file exists')
|
||||
with open(notifyOnPostFilename, 'r') as calendarFile:
|
||||
followingHandles = calendarFile.read()
|
||||
else:
|
||||
# create a new notifyOnPost file from the following file
|
||||
print('Creating notifyOnPost file ' + notifyOnPostFilename)
|
||||
followingHandles = ''
|
||||
with open(followingFilename, 'r') as followingFile:
|
||||
followingHandles = followingFile.read()
|
||||
if add:
|
||||
with open(notifyOnPostFilename, 'w+') as fp:
|
||||
fp.write(followingHandles + handle + '\n')
|
||||
|
||||
# already in the notifyOnPost file?
|
||||
if handle + '\n' in followingHandles:
|
||||
print(handle + ' exists in notifyOnPost.txt')
|
||||
if add:
|
||||
# already added
|
||||
return
|
||||
# remove from calendar file
|
||||
followingHandles = followingHandles.replace(handle + '\n', '')
|
||||
with open(notifyOnPostFilename, 'w+') as fp:
|
||||
fp.write(followingHandles)
|
||||
else:
|
||||
print(handle + ' not in notifyOnPost.txt')
|
||||
# not already in the notifyOnPost file
|
||||
if add:
|
||||
# append to the list of handles
|
||||
followingHandles += handle + '\n'
|
||||
with open(notifyOnPostFilename, 'w+') as fp:
|
||||
fp.write(followingHandles)
|
||||
|
||||
|
||||
def addNotifyOnPost(baseDir: str, nickname: str, domain: str,
|
||||
followingNickname: str,
|
||||
followingDomain: str) -> None:
|
||||
_notifyOnPostArrival(baseDir, nickname, domain,
|
||||
followingNickname, followingDomain, True)
|
||||
|
||||
|
||||
def removeNotifyOnPost(baseDir: str, nickname: str, domain: str,
|
||||
followingNickname: str,
|
||||
followingDomain: str) -> None:
|
||||
_notifyOnPostArrival(baseDir, nickname, domain,
|
||||
followingNickname, followingDomain, False)
|
||||
|
||||
|
||||
def notifyWhenPersonPosts(baseDir: str, nickname: str, domain: str,
|
||||
followingNickname: str,
|
||||
followingDomain: str) -> bool:
|
||||
"""Returns true if receiving notifications when the given publishes a post
|
||||
"""
|
||||
if followingNickname == nickname and followingDomain == domain:
|
||||
return False
|
||||
notifyOnPostFilename = baseDir + '/accounts/' + \
|
||||
nickname + '@' + domain + '/notifyOnPost.txt'
|
||||
handle = followingNickname + '@' + followingDomain
|
||||
if not os.path.isfile(notifyOnPostFilename):
|
||||
# create a new notifyOnPost file
|
||||
with open(notifyOnPostFilename, 'w+') as fp:
|
||||
fp.write('')
|
||||
return handle + '\n' in open(notifyOnPostFilename).read()
|
|
@ -215,6 +215,21 @@ function notifications {
|
|||
fi
|
||||
fi
|
||||
|
||||
# send notifications for posts arriving from a particular person
|
||||
epicyonNotifyFile="$epicyonDir/.newNotifiedPost"
|
||||
if [ -f "$epicyonNotifyFile" ]; then
|
||||
if ! grep -q "##sent##" "$epicyonNotifyFile"; then
|
||||
epicyonReplyMessage=$(notification_translate_text 'New post')
|
||||
epicyonNotifyFileContent=$(echo "$epicyonReplyMessage")" "$(cat "$epicyonNotifyFile")
|
||||
if [[ "$epicyonNotifyFileContent" == *':'* ]]; then
|
||||
epicyonReplyMessage="Epicyon: $epicyonNotifyFileContent"
|
||||
fi
|
||||
sendNotification "$USERNAME" "Epicyon" "$epicyonReplyMessage"
|
||||
echo "##sent##" > "$epicyonNotifyFile"
|
||||
chown ${PROJECT_NAME}:${PROJECT_NAME} "$epicyonNotifyFile"
|
||||
fi
|
||||
fi
|
||||
|
||||
# send notifications for replies to XMPP/email users
|
||||
epicyonReplyFile="$epicyonDir/.newReply"
|
||||
if [ -f "$epicyonReplyFile" ]; then
|
||||
|
|
|
@ -449,5 +449,6 @@
|
|||
"Import Theme": "استيراد الموضوع",
|
||||
"Export Theme": "موضوع التصدير",
|
||||
"Custom post submit button text": "عرف نشر إرسال نص زر",
|
||||
"Blocked User Agents": "عوامل المستخدم المحظورة"
|
||||
"Blocked User Agents": "عوامل المستخدم المحظورة",
|
||||
"Notify me when this account posts": "أعلمني عندما ينشر الحساب هذا"
|
||||
}
|
||||
|
|
|
@ -449,5 +449,6 @@
|
|||
"Import Theme": "Importació temàtica",
|
||||
"Export Theme": "Tema d'exportació",
|
||||
"Custom post submit button text": "Text de botó d'enviament de publicacions personalitzades",
|
||||
"Blocked User Agents": "Agents d'usuari bloquejats"
|
||||
"Blocked User Agents": "Agents d'usuari bloquejats",
|
||||
"Notify me when this account posts": "Aviseu-me quan publiqui aquest compte"
|
||||
}
|
||||
|
|
|
@ -449,5 +449,6 @@
|
|||
"Import Theme": "Thema Mewnforio",
|
||||
"Export Theme": "Thema Allforio",
|
||||
"Custom post submit button text": "Testun Post Post Post",
|
||||
"Blocked User Agents": "Asiantau defnyddwyr wedi'u blocio"
|
||||
"Blocked User Agents": "Asiantau defnyddwyr wedi'u blocio",
|
||||
"Notify me when this account posts": "Rhoi gwybod i mi pan fydd y cyfrifon cyfrif hwn"
|
||||
}
|
||||
|
|
|
@ -449,5 +449,6 @@
|
|||
"Import Theme": "Theme importieren",
|
||||
"Export Theme": "Theme exportieren",
|
||||
"Custom post submit button text": "Benutzerdefinierte Post-Senden Schaltfläche Text",
|
||||
"Blocked User Agents": "Blockierte Benutzeragenten"
|
||||
"Blocked User Agents": "Blockierte Benutzeragenten",
|
||||
"Notify me when this account posts": "Benachrichtigen Sie mich, wenn dieses Konto postet"
|
||||
}
|
||||
|
|
|
@ -449,5 +449,6 @@
|
|||
"Import Theme": "Import Theme",
|
||||
"Export Theme": "Export Theme",
|
||||
"Custom post submit button text": "Custom post submit button text",
|
||||
"Blocked User Agents": "Blocked User Agents"
|
||||
"Blocked User Agents": "Blocked User Agents",
|
||||
"Notify me when this account posts": "Notify me when this account posts"
|
||||
}
|
||||
|
|
|
@ -449,5 +449,6 @@
|
|||
"Import Theme": "Tema de importación",
|
||||
"Export Theme": "Tema de exportación",
|
||||
"Custom post submit button text": "POST POST PERSONALIZADO Botón Texto",
|
||||
"Blocked User Agents": "Agentes de usuario bloqueados"
|
||||
"Blocked User Agents": "Agentes de usuario bloqueados",
|
||||
"Notify me when this account posts": "Notifíqueme cuando se publique esta cuenta"
|
||||
}
|
||||
|
|
|
@ -449,5 +449,6 @@
|
|||
"Import Theme": "Import thème",
|
||||
"Export Theme": "Thème d'exportation",
|
||||
"Custom post submit button text": "Texte de bouton d'envoi postal personnalisé",
|
||||
"Blocked User Agents": "Agents d'utilisateur bloqués"
|
||||
"Blocked User Agents": "Agents d'utilisateur bloqués",
|
||||
"Notify me when this account posts": "Avertissez-moi quand ce compte publie"
|
||||
}
|
||||
|
|
|
@ -449,5 +449,6 @@
|
|||
"Import Theme": "Téama Iompórtáil",
|
||||
"Export Theme": "Téama Easpórtála",
|
||||
"Custom post submit button text": "Post saincheaptha Cuir isteach an cnaipe Téacs",
|
||||
"Blocked User Agents": "Gníomhairí úsáideora blocáilte"
|
||||
"Blocked User Agents": "Gníomhairí úsáideora blocáilte",
|
||||
"Notify me when this account posts": "Cuir in iúl dom nuair a phostófar an cuntas seo"
|
||||
}
|
||||
|
|
|
@ -449,5 +449,6 @@
|
|||
"Import Theme": "आयात विषय",
|
||||
"Export Theme": "निर्यात विषय",
|
||||
"Custom post submit button text": "कस्टम पोस्ट सबमिट बटन टेक्स्ट",
|
||||
"Blocked User Agents": "अवरुद्ध उपयोगकर्ता एजेंट"
|
||||
"Blocked User Agents": "अवरुद्ध उपयोगकर्ता एजेंट",
|
||||
"Notify me when this account posts": "यह खाता पोस्ट होने पर मुझे सूचित करें"
|
||||
}
|
||||
|
|
|
@ -449,5 +449,6 @@
|
|||
"Import Theme": "Tema dell'importazione",
|
||||
"Export Theme": "Esportare tema",
|
||||
"Custom post submit button text": "Pulsante di invio del post personalizzato",
|
||||
"Blocked User Agents": "Agenti utente bloccati"
|
||||
"Blocked User Agents": "Agenti utente bloccati",
|
||||
"Notify me when this account posts": "Avvisami quando questo account messaggi"
|
||||
}
|
||||
|
|
|
@ -449,5 +449,6 @@
|
|||
"Import Theme": "輸入テーマ",
|
||||
"Export Theme": "テーマをエクスポートします",
|
||||
"Custom post submit button text": "カスタムポスト送信ボタンテキスト",
|
||||
"Blocked User Agents": "ブロックされたユーザーエージェント"
|
||||
"Blocked User Agents": "ブロックされたユーザーエージェント",
|
||||
"Notify me when this account posts": "この口座投稿を通知する"
|
||||
}
|
||||
|
|
|
@ -449,5 +449,6 @@
|
|||
"Import Theme": "Mijara Import",
|
||||
"Export Theme": "Mijara Export",
|
||||
"Custom post submit button text": "Nivîsa bişkojka paşîn a paşîn",
|
||||
"Blocked User Agents": "Karmendên bikarhêner asteng kirin"
|
||||
"Blocked User Agents": "Karmendên bikarhêner asteng kirin",
|
||||
"Notify me when this account posts": "Dema ku ev postên hesabê min agahdar bikin"
|
||||
}
|
||||
|
|
|
@ -445,5 +445,6 @@
|
|||
"Import Theme": "Import Theme",
|
||||
"Export Theme": "Export Theme",
|
||||
"Custom post submit button text": "Custom post submit button text",
|
||||
"Blocked User Agents": "Blocked User Agents"
|
||||
"Blocked User Agents": "Blocked User Agents",
|
||||
"Notify me when this account posts": "Notify me when this account posts"
|
||||
}
|
||||
|
|
|
@ -449,5 +449,6 @@
|
|||
"Import Theme": "Importar tema",
|
||||
"Export Theme": "Exportar tema",
|
||||
"Custom post submit button text": "Texto de botão de envio de post personalizado",
|
||||
"Blocked User Agents": "Agentes de usuário bloqueados"
|
||||
"Blocked User Agents": "Agentes de usuário bloqueados",
|
||||
"Notify me when this account posts": "Notifique-me quando esta conta posts"
|
||||
}
|
||||
|
|
|
@ -449,5 +449,6 @@
|
|||
"Import Theme": "Импортировать тему",
|
||||
"Export Theme": "Экспортная тема",
|
||||
"Custom post submit button text": "Пользовательский пост Отправить кнопку текста",
|
||||
"Blocked User Agents": "Заблокированные пользовательские агенты"
|
||||
"Blocked User Agents": "Заблокированные пользовательские агенты",
|
||||
"Notify me when this account posts": "Сообщите мне, когда эта учетная запись"
|
||||
}
|
||||
|
|
|
@ -449,5 +449,6 @@
|
|||
"Import Theme": "Ingiza mandhari",
|
||||
"Export Theme": "Tuma mandhari",
|
||||
"Custom post submit button text": "Ujumbe wa Desturi Wasilisha Nakala ya kifungo",
|
||||
"Blocked User Agents": "Wakala wa watumiaji waliozuiwa"
|
||||
"Blocked User Agents": "Wakala wa watumiaji waliozuiwa",
|
||||
"Notify me when this account posts": "Nijulishe wakati akaunti hii ya akaunti."
|
||||
}
|
||||
|
|
|
@ -449,5 +449,6 @@
|
|||
"Import Theme": "进口主题",
|
||||
"Export Theme": "出口主题",
|
||||
"Custom post submit button text": "自定义发布提交按钮文本",
|
||||
"Blocked User Agents": "阻止用户代理商"
|
||||
"Blocked User Agents": "阻止用户代理商",
|
||||
"Notify me when this account posts": "此帐户帖子时通知我"
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@ from blocking import isBlocked
|
|||
from follow import isFollowerOfPerson
|
||||
from follow import isFollowingActor
|
||||
from followingCalendar import receivingCalendarEvents
|
||||
from notifyOnPost import notifyWhenPersonPosts
|
||||
from webapp_utils import htmlHeaderWithExternalStyle
|
||||
from webapp_utils import htmlFooter
|
||||
from webapp_utils import getBrokenLinkSubstitute
|
||||
|
@ -246,8 +247,21 @@ def htmlPersonOptions(defaultTimeline: str,
|
|||
'name="submitPetname">' + \
|
||||
translate['Submit'] + '</button><br>\n'
|
||||
|
||||
# checkbox for receiving calendar events
|
||||
# Notify when a post arrives from this person
|
||||
if isFollowingActor(baseDir, nickname, domain, optionsActor):
|
||||
checkboxStr = \
|
||||
' <input type="checkbox" class="profilecheckbox" ' + \
|
||||
'name="notifyOnPost" checked> 🔔' + \
|
||||
translate['Notify me when this account posts'] + \
|
||||
'\n <button type="submit" class="buttonsmall" ' + \
|
||||
'name="submitNotifyOnPost">' + \
|
||||
translate['Submit'] + '</button><br>\n'
|
||||
if not notifyWhenPersonPosts(baseDir, nickname, domain,
|
||||
optionsNickname,
|
||||
optionsDomainFull):
|
||||
checkboxStr = checkboxStr.replace(' checked>', '>')
|
||||
optionsStr += checkboxStr
|
||||
|
||||
checkboxStr = \
|
||||
' <input type="checkbox" ' + \
|
||||
'class="profilecheckbox" name="onCalendar" checked> ' + \
|
||||
|
|
Loading…
Reference in New Issue