Files
Bubbles/function_calls/services/reminder.py
zihanjian 33731cb83b refactor
2025-09-24 20:01:22 +08:00

102 lines
3.4 KiB
Python

"""Reminder related services for Function Call handlers."""
from __future__ import annotations
from dataclasses import dataclass
from typing import Any, Dict, List, Optional
from function.func_reminder import ReminderManager
@dataclass
class ReminderServiceResult:
success: bool
messages: List[str]
_WEEKDAY_LABELS = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
_TYPE_LABELS = {"once": "一次性", "daily": "每日", "weekly": "每周"}
def _format_schedule(data: Dict[str, Any]) -> str:
reminder_type = data.get("type", "once")
time_str = data.get("time", "?")
if reminder_type == "once":
return f"{time_str} (一次性)"
if reminder_type == "daily":
return f"每天 {time_str}"
if reminder_type == "weekly":
weekday = data.get("weekday")
if isinstance(weekday, int) and 0 <= weekday < len(_WEEKDAY_LABELS):
return f"每周{_WEEKDAY_LABELS[weekday]} {time_str}"
return f"每周 {time_str}"
return f"{time_str}"
def create_reminder(
manager: ReminderManager,
sender_wxid: str,
data: Dict[str, Any],
roomid: Optional[str]
) -> ReminderServiceResult:
payload = {
"type": data["type"],
"time": data["time"],
"content": data["content"],
}
if data.get("weekday") is not None:
payload["weekday"] = data["weekday"]
success, info = manager.add_reminder(sender_wxid, payload, roomid=roomid)
if not success:
return ReminderServiceResult(success=False, messages=[f"❌ 设置提醒失败:{info}"])
schedule = payload.copy()
message = (
"✅ 已为您设置{type_label}提醒\n"
"时间: {schedule}\n"
"内容: {content}"
).format(
type_label=_TYPE_LABELS.get(payload["type"], ""),
schedule=_format_schedule(payload),
content=payload["content"],
)
return ReminderServiceResult(success=True, messages=[message])
def list_reminders(
manager: ReminderManager,
sender_wxid: str,
contacts: Dict[str, str]
) -> ReminderServiceResult:
reminders = manager.list_reminders(sender_wxid)
if not reminders:
return ReminderServiceResult(success=True, messages=["您还没有设置任何提醒。"])
lines: List[str] = ["📝 您设置的提醒列表(包括私聊和群聊):"]
for idx, reminder in enumerate(reminders, start=1):
schedule_display = _format_schedule({
"type": reminder.get("type"),
"time": reminder.get("time_str"),
"weekday": reminder.get("weekday"),
})
if reminder.get("type") == "once":
schedule_display = reminder.get("time_str", "?")
scope = "[私聊]"
roomid = reminder.get("roomid")
if roomid:
room_name = contacts.get(roomid) or roomid[:8]
scope = f"[群:{room_name}]"
lines.append(
f"{idx}. [ID: {reminder.get('id', '')[:6]}] {scope}{schedule_display}: {reminder.get('content', '')}"
)
return ReminderServiceResult(success=True, messages=["\n".join(lines)])
def delete_reminder(manager: ReminderManager, sender_wxid: str, reminder_id: str) -> ReminderServiceResult:
success, info = manager.delete_reminder(sender_wxid, reminder_id)
if success:
return ReminderServiceResult(success=True, messages=[f"{info}"])
return ReminderServiceResult(success=False, messages=[f"{info}"])