from __future__ import annotations import ast from datetime import datetime, timedelta, timezone import httpx from pydantic import BaseModel from src.config import Config from src.util.ticktick import TickTick class HomeAssistant: class Message(BaseModel): target: str action: str content: str def __init__(self, ticktick: TickTick) -> None: self._ticktick = ticktick async def process_message(self, message: Message) -> dict[str, str]: if message.target == "ticktick": return await self._process_ticktick_message(message=message) return {"Status": "Unknown target"} async def trigger_webhook(self, payload: dict[str, str], webhook_id: str) -> None: token: str = Config.get_env("HOMEASSISTANT_TOKEN") webhook_url: str = Config.get_env("HOMEASSISTANT_URL") + "/api/webhook/" + webhook_id headers: dict[str, str] = {"Authorization": f"Bearer {token}"} await httpx.AsyncClient().post(webhook_url, json=payload, headers=headers) async def _process_ticktick_message(self, message: Message) -> dict[str, str]: if message.action == "create_shopping_list": return await self._create_shopping_list(content=message.content) if message.action == "create_action_task": return await self._create_action_task(content=message.content) return {"Status": "Unknown action"} async def _create_shopping_list(self, content: str) -> dict[str, str]: project_id = Config.get_env("TICKTICK_SHOPPING_LIST") item: dict[str, str] = ast.literal_eval(content) task = TickTick.Task(projectId=project_id, title=item["item"]) return await self._ticktick.create_task(task=task) async def _create_action_task(self, content: str) -> dict[str, str]: detail: dict[str, str] = ast.literal_eval(content) project_id = Config.get_env("TICKTICK_HOME_TASK_LIST") due_hour = detail["due_hour"] due = datetime.now(tz=datetime.now().astimezone().tzinfo) + timedelta(hours=due_hour) due = (due + timedelta(days=1)).replace(hour=0, minute=0, second=0, microsecond=0) due = due.astimezone(timezone.utc) task = TickTick.Task(projectId=project_id, title=detail["action"], dueDate=TickTick.datetime_to_ticktick_format(due)) return await self._ticktick.create_task(task=task)