2019-10-21 00:14:56 +03:00
|
|
|
#!/usr/bin/python3
|
|
|
|
import notify2
|
|
|
|
from time import sleep
|
2019-10-21 14:14:15 +03:00
|
|
|
from playsound import playsound
|
2019-10-23 10:52:39 +03:00
|
|
|
import os
|
2019-10-24 16:12:32 +03:00
|
|
|
from pystray import MenuItem as item
|
|
|
|
import pystray
|
|
|
|
from PIL import Image
|
2019-10-29 08:52:31 +02:00
|
|
|
import argparse
|
2019-10-21 00:14:56 +03:00
|
|
|
|
|
|
|
NAME = 'Eye Strain Reminder'
|
|
|
|
MESSAGE = 'Friendly reminder to observe the 20-20-20 rule'
|
2019-10-28 16:16:04 +02:00
|
|
|
MESSAGE_MISSED = 'Missed notification(s), resuming countdown'
|
2019-10-21 00:14:56 +03:00
|
|
|
TIMEOUT = 20
|
|
|
|
MILLISECOND = 1000
|
2019-10-22 13:55:16 +03:00
|
|
|
MINUTE = 60
|
2019-10-23 10:52:39 +03:00
|
|
|
DIR = os.path.dirname(os.path.abspath(__file__))
|
2019-10-21 00:14:56 +03:00
|
|
|
|
2019-10-28 15:09:55 +02:00
|
|
|
icon = None
|
2019-10-24 16:12:32 +03:00
|
|
|
mute = False
|
2019-10-28 15:09:55 +02:00
|
|
|
disable_notifications = False
|
2019-10-29 08:52:31 +02:00
|
|
|
invert_icons = False
|
2019-10-24 16:12:32 +03:00
|
|
|
|
2019-10-28 16:16:04 +02:00
|
|
|
def init():
|
|
|
|
global icon
|
2019-10-29 08:52:31 +02:00
|
|
|
image = get_image()
|
2019-10-28 16:16:04 +02:00
|
|
|
icon = pystray.Icon(NAME, image, NAME, generate_menu_items())
|
|
|
|
icon.run()
|
|
|
|
print("Initializing EyeStrainReminder...")
|
|
|
|
notify2.init(NAME)
|
2019-10-24 16:12:32 +03:00
|
|
|
|
2019-10-29 08:52:31 +02:00
|
|
|
def update_icon():
|
|
|
|
global icon
|
|
|
|
image = get_image()
|
|
|
|
icon.icon = image
|
|
|
|
|
|
|
|
def get_image():
|
|
|
|
theme = [[f"{DIR}/files/eye_light.png", f"{DIR}/files/eye_dark.png"],
|
|
|
|
[f"{DIR}/files/eye_dark.png", f"{DIR}/files/eye_light.png"]]
|
|
|
|
return Image.open(theme[invert_icons][disable_notifications])
|
|
|
|
|
2019-10-28 15:09:55 +02:00
|
|
|
def generate_menu_items():
|
2019-10-24 16:12:32 +03:00
|
|
|
menu_items = []
|
2019-10-29 08:52:31 +02:00
|
|
|
menu_items.append(item('Mute' if not mute else 'Unmute', toggle_mute))
|
|
|
|
menu_items.append(item('Do Not Disturb' if not disable_notifications else 'Enable Notifications', toggle_notifications))
|
2019-10-24 16:12:32 +03:00
|
|
|
return menu_items
|
|
|
|
|
2019-10-28 16:16:04 +02:00
|
|
|
def toggle_mute():
|
|
|
|
global mute
|
2019-10-29 08:52:31 +02:00
|
|
|
mute = not mute
|
|
|
|
update_menu()
|
|
|
|
|
|
|
|
def toggle_notifications():
|
|
|
|
global disable_notifications
|
|
|
|
disable_notifications = not disable_notifications
|
2019-10-28 16:16:04 +02:00
|
|
|
update_menu()
|
2019-10-29 08:52:31 +02:00
|
|
|
update_icon()
|
2019-10-28 16:16:04 +02:00
|
|
|
|
2019-10-28 15:09:55 +02:00
|
|
|
def update_menu():
|
|
|
|
global icon
|
|
|
|
icon.menu = generate_menu_items()
|
|
|
|
icon.update_menu()
|
|
|
|
|
2019-10-21 00:14:56 +03:00
|
|
|
def uninit():
|
|
|
|
notify2.uninit()
|
|
|
|
|
2019-10-22 13:55:16 +03:00
|
|
|
def wait():
|
2019-10-28 16:16:04 +02:00
|
|
|
sleep(TIMEOUT*MINUTE)
|
|
|
|
#pass
|
2019-10-22 13:55:16 +03:00
|
|
|
|
2019-10-21 00:14:56 +03:00
|
|
|
def send_notification():
|
2019-10-28 16:16:04 +02:00
|
|
|
if not disable_notifications:
|
|
|
|
notify(MESSAGE)
|
|
|
|
else:
|
|
|
|
print("Notifications are disabled, waiting for an enable...")
|
|
|
|
while disable_notifications:
|
|
|
|
sleep(10)
|
|
|
|
notify(MESSAGE_MISSED)
|
|
|
|
|
|
|
|
def notify(message):
|
2019-10-29 08:52:31 +02:00
|
|
|
print(message)
|
2019-10-28 16:16:04 +02:00
|
|
|
notification = notify2.Notification(NAME, message, "notification-device-eject")
|
2019-10-21 00:14:56 +03:00
|
|
|
notification.set_timeout(TIMEOUT * MILLISECOND)
|
|
|
|
notification.set_urgency(notify2.URGENCY_LOW)
|
|
|
|
notification.show()
|
2019-10-24 16:12:32 +03:00
|
|
|
play_sound()
|
2019-10-21 00:14:56 +03:00
|
|
|
sleep(TIMEOUT)
|
|
|
|
notification.close()
|
2019-10-28 16:16:04 +02:00
|
|
|
play_sound()
|
|
|
|
|
|
|
|
def play_sound():
|
|
|
|
if not mute:
|
|
|
|
playsound(f"{DIR}/files/default.wav")
|
2019-10-21 00:14:56 +03:00
|
|
|
|
2019-10-22 14:43:20 +03:00
|
|
|
def main():
|
2019-10-21 00:14:56 +03:00
|
|
|
init()
|
2019-10-22 13:55:16 +03:00
|
|
|
while 1:
|
|
|
|
wait()
|
|
|
|
send_notification()
|
2019-10-22 14:43:20 +03:00
|
|
|
uninit()
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main()
|