from __future__ import annotations from typing import Any def build_card_command(card_type: str, data: dict[str, Any]) -> dict: card_builders = { "receipt": _build_receipt_cmd, "event": _build_event_cmd, "agenda": _build_agenda_cmd, "media_player": _build_media_player_cmd, "device_control": _build_device_control_cmd, "apple_tv_remote": _build_apple_tv_remote_cmd, } builder = card_builders.get(card_type) if builder is None: return { "type": "text", "text": f"Unknown card type: {card_type}", } return builder(data) def _build_receipt_cmd(data: dict) -> dict: from yuxi.channels.adapters.line.flex_templates.basic_cards import create_receipt_card return create_receipt_card( title=data.get("title", "Receipt"), items=data.get("items", []), total_label=data.get("total_label", "合计"), currency=data.get("currency", "¥"), alt_text=data.get("alt_text", "Receipt"), ) def _build_event_cmd(data: dict) -> dict: from yuxi.channels.adapters.line.flex_templates.basic_cards import create_event_card return create_event_card( title=data.get("title", ""), date=data.get("date", ""), time_range=data.get("time_range", ""), location=data.get("location", ""), description=data.get("description", ""), hero_url=data.get("hero_url"), alt_text=data.get("alt_text", "Event"), ) def _build_agenda_cmd(data: dict) -> dict: from yuxi.channels.adapters.line.flex_templates.basic_cards import create_agenda_card return create_agenda_card( title=data.get("title", "Agenda"), events=data.get("events", []), alt_text=data.get("alt_text", "Agenda"), ) def _build_media_player_cmd(data: dict) -> dict: from yuxi.channels.adapters.line.flex_templates.media_control_cards import ( create_media_player_card, ) return create_media_player_card( title=data.get("title", ""), artist=data.get("artist", ""), album_art_url=data.get("album_art_url"), playback_state=data.get("playback_state", "paused"), alt_text=data.get("alt_text", "Media Player"), ) def _build_device_control_cmd(data: dict) -> dict: from yuxi.channels.adapters.line.flex_templates.media_control_cards import ( create_device_control_card, ) return create_device_control_card( device_name=data.get("device_name", "Device"), status=data.get("status", "offline"), controls=data.get("controls"), hero_url=data.get("hero_url"), alt_text=data.get("alt_text", "Device Control"), ) def _build_apple_tv_remote_cmd(data: dict) -> dict: from yuxi.channels.adapters.line.flex_templates.media_control_cards import ( create_apple_tv_remote_card, ) return create_apple_tv_remote_card( device_name=data.get("device_name", "Apple TV"), alt_text=data.get("alt_text", "Apple TV Remote"), ) def resolve_card_command(content: str) -> dict | None: import json import re match = re.search(r"\[\[card:(\w+):(.+?)\]\]", content) if not match: return None card_type = match.group(1) try: data = json.loads(match.group(2)) except json.JSONDecodeError: return None return build_card_command(card_type, data)