From 00592b5e3aed163b3774c6c116fdb6716c3a93fb Mon Sep 17 00:00:00 2001 From: Sorin Savu Date: Tue, 28 Jul 2026 00:37:31 +0300 Subject: [PATCH] events --- faster.py | 85 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 67 insertions(+), 18 deletions(-) diff --git a/faster.py b/faster.py index b5f6f58..937ff59 100644 --- a/faster.py +++ b/faster.py @@ -1,7 +1,7 @@ import numpy as np from PIL import Image, ImageDraw, ImageFont from time import sleep -from datetime import datetime +from datetime import datetime, time import logging import signal import sys @@ -88,6 +88,67 @@ def draw_clock(): #draw_label('Time:', x - MARGIN_PIXELS, y + CLOCK_HEIGHT_PIXELS) +def draw_countdown(x, y, target_dt, size=STATUS_SIZE_MULTIPLIER): + """ + Draws a countdown/countup to target_dt: green if more than 15 minutes away, + yellow if less than 15 minutes away, red if target_dt is in the past. + """ + now = datetime.now() + delta_seconds = (target_dt - now).total_seconds() + if delta_seconds >= 0: + color = (255, 255, 0) if delta_seconds < 15 * 60 else (0, 255, 0) + else: + color = (255, 0, 0) + + total = abs(int(delta_seconds)) + hours, remainder = divmod(total, 3600) + minutes = remainder // 60 + + draw_clock_digits(x, y, size, f'{hours:02}', f'{minutes:02}', 1, color) + + +WORKDAY_EVENTS = [ + (7, 0, 'Wake up'), + (8, 0, 'Start working'), + (11, 0, 'Scrum meeting'), + (14, 0, 'Physiotherapy'), + (15, 0, 'Lunch'), + (18, 0, 'Close work day'), + (18, 30, 'Evening walk'), + (22, 0, 'Close the day'), + (23, 0, 'Go to sleep'), +] + + +def next_workday_event(now=None): + """ + Returns (target_dt, label) for the next event in WORKDAY_EVENTS, or None on weekends. + Once past the last event of the day, keeps returning it (now overdue) until midnight. + """ + now = now or datetime.now() + if now.weekday() >= 5: + return None + + today = now.date() + for hour, minute, label in WORKDAY_EVENTS: + dt = datetime.combine(today, time(hour, minute)) + if dt > now: + return dt, label + + last_hour, last_minute, last_label = WORKDAY_EVENTS[-1] + return datetime.combine(today, time(last_hour, last_minute)), last_label + + +def draw_next_event(order): + result = next_workday_event() + if result is None: + return + target, label = result + x, y = status_clock_position(order) + draw_countdown(x, y, target, STATUS_SIZE_MULTIPLIER) + draw_label(f'{label}:', x - MARGIN_PIXELS, y + CLOCK_HEIGHT_PIXELS * STATUS_SIZE_MULTIPLIER) + + def milestone_countdown(order, target_date, label): x, y = status_clock_position(order) right_x = x + CLOCK_WIDTH_PIXELS * STATUS_SIZE_MULTIPLIER @@ -124,25 +185,12 @@ def draw_fasting(status, order): if 'fasting' in status and status['fasting']: label = 'Breakfast' - date = datetime.strptime(status['fast']['projected_end'], "%Y-%m-%d %H:%M:%S") - delta = date - datetime.now() - hours = delta.seconds // 3600 - minutes = (delta.seconds // 60) % 60 - color = (0, 255, 0) + target = datetime.strptime(status['fast']['projected_end'], "%Y-%m-%d %H:%M:%S") else: label = 'Fasting' - date = datetime.now().replace(hour=16, minute=0, second=0, microsecond=0) - if date > datetime.now(): - delta = date - datetime.now() - color = (0, 255, 0) - else: - delta = datetime.now() - date - color = (255, 0, 0) - - hours = delta.seconds // 3600 - minutes = (delta.seconds // 60) % 60 - - draw_clock_digits(x, y, STATUS_SIZE_MULTIPLIER, f'{hours:02}', f'{minutes:02}', 1, color) + target = datetime.now().replace(hour=16, minute=0, second=0, microsecond=0) + + draw_countdown(x, y, target, STATUS_SIZE_MULTIPLIER) draw_label(f'{label}:', x - MARGIN_PIXELS, y + CLOCK_HEIGHT_PIXELS * STATUS_SIZE_MULTIPLIER) def clear_status_area(): @@ -153,6 +201,7 @@ def clear_status_area(): while True: draw_clock() + draw_next_event(order=2.5) try: status = get_status_data()