89 lines
3.2 KiB
Python
Raw Normal View History

2025-01-23 23:12:52 +02:00
from datetime import datetime, timedelta
from alarm_logger import AlarmLogger
class AlarmLogic:
def __init__(self, api_client):
self.logger = AlarmLogger()
self.api_client = api_client
self.alarms = []
self.current_alarm = None
self.snooze_minutes = 5
self.snooze_until = None
def refresh_alarms(self):
"""Fetches alarms from the API and updates the local list."""
try:
self.alarms = self.api_client.get_alarms()
except Exception as e:
raise RuntimeError(f"Failed to fetch alarms: {str(e)}")
def create_alarm(self, hour, minute, date=None, weekdays=None):
"""Creates a new alarm."""
alarm_data = {
"name": f"Alarm {hour:02d}:{minute:02d}",
"time": f"{hour:02d}:{minute:02d}:00",
"enabled": True,
"repeat_rule": {"type": "once"},
"snooze": {
"enabled": True,
"duration": self.snooze_minutes,
"max_count": 3
}
}
if weekdays:
alarm_data["repeat_rule"] = {
"type": "weekly",
"days": weekdays
}
elif date:
alarm_data["repeat_rule"] = {
"type": "once",
"date": date.strftime("%Y-%m-%d")
}
try:
self.api_client.create_alarm(alarm_data)
self.refresh_alarms()
self.logger.log_alarm_created(alarm_data)
except Exception as e:
self.logger.log_system_error(f"Alarm creation failed: {e}", exc_info=True)
raise RuntimeError(f"Failed to create alarm: {str(e)}")
def stop_alarm(self):
"""Stops the current alarm."""
if self.current_alarm:
try:
alarm_data = self.current_alarm.copy()
alarm_data["enabled"] = False
self.api_client.update_alarm(self.current_alarm["id"], alarm_data)
self.current_alarm = None
self.snooze_until = None
except Exception as e:
self.logger.log_system_error(f"Failed to stop alarm: {e}", exc_info=True)
raise RuntimeError(f"Failed to stop alarm: {str(e)}")
def snooze_alarm(self):
"""Snoozes the current alarm."""
if self.current_alarm:
self.snooze_until = datetime.now() + timedelta(minutes=self.snooze_minutes)
self.stop_alarm()
def check_alarms(self):
"""Checks if any alarm should trigger based on the current time."""
current_time = datetime.now()
if self.snooze_until and current_time >= self.snooze_until:
self.current_alarm = {"time": self.snooze_until.strftime("%H:%M:%S")}
self.snooze_until = None
if not self.current_alarm:
self.refresh_alarms()
for alarm in self.alarms:
alarm_time = datetime.strptime(alarm["time"], "%H:%M:%S").time()
if (alarm_time.hour == current_time.hour and
alarm_time.minute == current_time.minute and
alarm["enabled"]):
self.current_alarm = alarm
break