89 lines
3.2 KiB
Python
89 lines
3.2 KiB
Python
![]() |
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
|