diff --git a/README_commandline.md b/README_commandline.md index a68e5d586..0d8981214 100644 --- a/README_commandline.md +++ b/README_commandline.md @@ -408,3 +408,11 @@ python3 epicyon.py --screenreader picospeaker --notify yournickname@yourdomain - ``` This will then stay running and incoming posts will be announced as they arrive. + +## Desktop notifications + +You can get desktop notifications either by running the screen reader as shown above, or if you only want notifications and not spoken messages then you can run the client as follows, without the *screenreader* option: + +``` bash +python3 epicyon.py --notify yournickname@yourdomain --password [yourpassword] +``` diff --git a/epicyon.py b/epicyon.py index 874207ba0..5336a19fb 100644 --- a/epicyon.py +++ b/epicyon.py @@ -310,6 +310,9 @@ parser.add_argument("--positivevoting", type=str2bool, nargs='?', parser.add_argument("--debug", type=str2bool, nargs='?', const=True, default=False, help="Show debug messages") +parser.add_argument("--notificationSounds", type=str2bool, nargs='?', + const=True, default=True, + help="Play notification sounds") parser.add_argument("--authenticatedFetch", type=str2bool, nargs='?', const=True, default=False, help="Enable authentication on GET requests" + @@ -1932,7 +1935,7 @@ if args.notifications: runNotificationsClient(baseDir, proxyType, httpPrefix, nickname, domain, port, args.password, args.screenreader, args.language, - args.debug) + args.notificationSounds, args.debug) sys.exit() if federationList: diff --git a/notifications_client.py b/notifications_client.py index f6836c894..6e8431bbd 100644 --- a/notifications_client.py +++ b/notifications_client.py @@ -98,13 +98,37 @@ def _desktopNotification(notificationType: str, title + "\", '" + message + "'") +def _sayCommand(sayStr: str, screenreader: str, + systemLanguage: str, espeak=None) -> None: + """Speaks a command + """ + print(sayStr) + if not screenreader: + return + + cmdSpeakerName = 'screen reader' + pitch = getSpeakerPitch(cmdSpeakerName, + screenreader, 'They/Them') + rate = getSpeakerRate(cmdSpeakerName, screenreader) + srange = getSpeakerRange(cmdSpeakerName) + + if screenreader == 'espeak': + _speakerEspeak(espeak, pitch, rate, srange, sayStr) + elif screenreader == 'picospeaker': + _speakerPicospeaker(pitch, rate, + systemLanguage, sayStr) + + def runNotificationsClient(baseDir: str, proxyType: str, httpPrefix: str, nickname: str, domain: str, port: int, password: str, screenreader: str, - systemLanguage: str, debug: bool) -> None: + systemLanguage: str, + notificationSounds: bool, + debug: bool) -> None: """Runs the notifications and screen reader client, which announces new inbox items """ + espeak = None if screenreader: if screenreader == 'espeak': print('Setting up espeak') @@ -116,8 +140,13 @@ def runNotificationsClient(baseDir: str, proxyType: str, httpPrefix: str, print('Running ' + screenreader + ' for ' + nickname + '@' + domain) else: print('Running desktop notifications for ' + nickname + '@' + domain) + if notificationSounds: + print('Notification sounds ON') + else: + print('Notification sounds OFF') print('/q or /quit to exit') + originalScreenReader = screenreader domainFull = getFullDomain(domain, port) actor = httpPrefix + '://' + domainFull + '/users/' + nickname prevSay = '' @@ -155,47 +184,57 @@ def runNotificationsClient(baseDir: str, proxyType: str, httpPrefix: str, soundsDir = 'theme/default/sounds' if speakerJson['notify']['dm'] != prevDM: if speakerJson['notify']['dm'] is True: - _playNotificationSound(soundsDir + '/' + - dmSoundFilename, player) + if notificationSounds: + _playNotificationSound(soundsDir + '/' + + dmSoundFilename, player) _desktopNotification(notificationType, title, 'New direct message ' + actor + '/dm') prevDM = speakerJson['notify']['dm'] elif speakerJson['notify']['reply'] != prevReply: if speakerJson['notify']['reply'] is True: - _playNotificationSound(soundsDir + '/' + - replySoundFilename, player) + if notificationSounds: + _playNotificationSound(soundsDir + '/' + + replySoundFilename, + player) _desktopNotification(notificationType, title, 'New reply ' + actor + '/tlreplies') prevReply = speakerJson['notify']['reply'] elif speakerJson['notify']['calendar'] != prevCalendar: if speakerJson['notify']['calendar'] is True: - _playNotificationSound(soundsDir + '/' + - calendarSoundFilename, player) + if notificationSounds: + _playNotificationSound(soundsDir + '/' + + calendarSoundFilename, + player) _desktopNotification(notificationType, title, 'New calendar event ' + actor + '/calendar') prevCalendar = speakerJson['notify']['calendar'] elif speakerJson['notify']['followRequests'] != prevFollow: if speakerJson['notify']['followRequests'] is True: - _playNotificationSound(soundsDir + '/' + - followSoundFilename, player) + if notificationSounds: + _playNotificationSound(soundsDir + '/' + + followSoundFilename, + player) _desktopNotification(notificationType, title, 'New follow request ' + actor + '/followers#buttonheader') prevFollow = speakerJson['notify']['followRequests'] elif speakerJson['notify']['likedBy'] != prevLike: - _playNotificationSound(soundsDir + '/' + - likeSoundFilename, player) + if notificationSounds: + _playNotificationSound(soundsDir + '/' + + likeSoundFilename, player) _desktopNotification(notificationType, title, 'New like ' + speakerJson['notify']['likedBy']) prevLike = speakerJson['notify']['likedBy'] elif speakerJson['notify']['share'] != prevShare: if speakerJson['notify']['share'] is True: - _playNotificationSound(soundsDir + '/' + - shareSoundFilename, player) + if notificationSounds: + _playNotificationSound(soundsDir + '/' + + shareSoundFilename, + player) _desktopNotification(notificationType, title, 'New shared item ' + actor + '/shares') @@ -257,3 +296,37 @@ def runNotificationsClient(baseDir: str, proxyType: str, httpPrefix: str, keyPress = keyPress[1:] if keyPress == 'q' or keyPress == 'quit' or keyPress == 'exit': break + elif keyPress == 'sounds on' or keyPress == 'sound': + sayStr = 'Notification sounds ON' + _sayCommand(sayStr, screenreader, + systemLanguage, espeak) + notificationSounds = True + elif keyPress == 'sounds off' or keyPress == 'nosound': + sayStr = 'Notification sounds OFF' + _sayCommand(sayStr, screenreader, + systemLanguage, espeak) + notificationSounds = False + elif (keyPress == 'speak' or + keyPress == 'screen reader on' or + keyPress == 'speaker on' or + keyPress == 'talker on' or + keyPress == 'reader on'): + if originalScreenReader: + screenreader = originalScreenReader + sayStr = 'Screen reader ON' + _sayCommand(sayStr, screenreader, + systemLanguage, espeak) + else: + print('No --screenreader option was specified') + elif (keyPress == 'mute' or + keyPress == 'screen reader off' or + keyPress == 'speaker off' or + keyPress == 'talker off' or + keyPress == 'reader off'): + if originalScreenReader: + screenreader = None + sayStr = 'Screen reader OFF' + _sayCommand(sayStr, originalScreenReader, + systemLanguage, espeak) + else: + print('No --screenreader option was specified')