From 742a8c2c372e6d4a3af4958e3d25d8b2130f6502 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Sun, 21 Sep 2025 13:30:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(plugin=5Fsystem):=20=E5=AF=BC=E5=87=BA=20s?= =?UTF-8?q?chedule=5Fapi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 schedule_api 添加到插件系统的 API 导出列表中,使其对插件可用。 --- src/plugin_system/apis/__init__.py | 2 + src/plugin_system/apis/schedule_api.py | 179 +++++++++++++++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 src/plugin_system/apis/schedule_api.py diff --git a/src/plugin_system/apis/__init__.py b/src/plugin_system/apis/__init__.py index 30ff428d7..411a2d326 100644 --- a/src/plugin_system/apis/__init__.py +++ b/src/plugin_system/apis/__init__.py @@ -19,6 +19,7 @@ from src.plugin_system.apis import ( send_api, tool_api, permission_api, + schedule_api ) from src.plugin_system.apis.chat_api import ChatManager as context_api from .logging_api import get_logger @@ -42,4 +43,5 @@ __all__ = [ "tool_api", "permission_api", "context_api", + "schedule_api", ] diff --git a/src/plugin_system/apis/schedule_api.py b/src/plugin_system/apis/schedule_api.py new file mode 100644 index 000000000..f1d81049e --- /dev/null +++ b/src/plugin_system/apis/schedule_api.py @@ -0,0 +1,179 @@ +""" +日程表与月度计划API模块 + +专门负责日程和月度计划信息的查询与管理,采用标准Python包设计模式 +所有对外接口均为异步函数,以便于插件开发者在异步环境中使用。 + +使用方式: + import asyncio + from src.plugin_system.apis import schedule_api + + async def main(): + # 获取今日日程 + today_schedule = await schedule_api.get_today_schedule() + if today_schedule: + print("今天的日程:", today_schedule) + + # 获取当前活动 + current_activity = await schedule_api.get_current_activity() + if current_activity: + print("当前活动:", current_activity) + + # 获取本月月度计划 + from datetime import datetime + this_month = datetime.now().strftime("%Y-%m") + plans = await schedule_api.get_monthly_plans(this_month) + if plans: + print(f"{this_month} 的月度计划:", [p.plan_text for p in plans]) + + asyncio.run(main()) +""" +from datetime import datetime +from typing import List, Dict, Any, Optional + +from src.common.database.sqlalchemy_models import MonthlyPlan +from src.common.logger import get_logger +from src.schedule.database import get_active_plans_for_month +from src.schedule.schedule_manager import schedule_manager + +logger = get_logger("schedule_api") + + +class ScheduleAPI: + """日程表与月度计划API - 负责日程和计划信息的查询与管理""" + + @staticmethod + async def get_today_schedule() -> Optional[List[Dict[str, Any]]]: + """(异步) 获取今天的日程安排 + + Returns: + Optional[List[Dict[str, Any]]]: 今天的日程列表,如果未生成或未启用则返回None + """ + try: + logger.debug("[ScheduleAPI] 正在获取今天的日程安排...") + return schedule_manager.today_schedule + except Exception as e: + logger.error(f"[ScheduleAPI] 获取今日日程失败: {e}") + return None + + @staticmethod + async def get_current_activity() -> Optional[str]: + """(异步) 获取当前正在进行的活动 + + Returns: + Optional[str]: 当前活动名称,如果没有则返回None + """ + try: + logger.debug("[ScheduleAPI] 正在获取当前活动...") + return schedule_manager.get_current_activity() + except Exception as e: + logger.error(f"[ScheduleAPI] 获取当前活动失败: {e}") + return None + + @staticmethod + async def regenerate_schedule() -> bool: + """(异步) 触发后台重新生成今天的日程 + + Returns: + bool: 是否成功触发 + """ + try: + logger.info("[ScheduleAPI] 正在触发后台重新生成日程...") + await schedule_manager.generate_and_save_schedule() + return True + except Exception as e: + logger.error(f"[ScheduleAPI] 触发日程重新生成失败: {e}") + return False + + @staticmethod + async def get_monthly_plans(target_month: Optional[str] = None) -> List[MonthlyPlan]: + """(异步) 获取指定月份的有效月度计划 + + Args: + target_month (Optional[str]): 目标月份,格式为 "YYYY-MM"。如果为None,则使用当前月份。 + + Returns: + List[MonthlyPlan]: 月度计划对象列表 + """ + if target_month is None: + target_month = datetime.now().strftime("%Y-%m") + try: + logger.debug(f"[ScheduleAPI] 正在获取 {target_month} 的月度计划...") + return await get_active_plans_for_month(target_month) + except Exception as e: + logger.error(f"[ScheduleAPI] 获取 {target_month} 月度计划失败: {e}") + return [] + + @staticmethod + async def ensure_monthly_plans(target_month: Optional[str] = None) -> bool: + """(异步) 确保指定月份存在月度计划,如果不存在则触发生成 + + Args: + target_month (Optional[str]): 目标月份,格式为 "YYYY-MM"。如果为None,则使用当前月份。 + + Returns: + bool: 操作是否成功 (如果已存在或成功生成) + """ + if target_month is None: + target_month = datetime.now().strftime("%Y-%m") + try: + logger.info(f"[ScheduleAPI] 正在确保 {target_month} 的月度计划存在...") + return await schedule_manager.plan_manager.ensure_and_generate_plans_if_needed(target_month) + except Exception as e: + logger.error(f"[ScheduleAPI] 确保 {target_month} 月度计划失败: {e}") + return False + + @staticmethod + async def archive_monthly_plans(target_month: Optional[str] = None) -> bool: + """(异步) 归档指定月份的月度计划 + + Args: + target_month (Optional[str]): 目标月份,格式为 "YYYY-MM"。如果为None,则使用当前月份。 + + Returns: + bool: 操作是否成功 + """ + if target_month is None: + target_month = datetime.now().strftime("%Y-%m") + try: + logger.info(f"[ScheduleAPI] 正在归档 {target_month} 的月度计划...") + await schedule_manager.plan_manager.archive_current_month_plans(target_month) + return True + except Exception as e: + logger.error(f"[ScheduleAPI] 归档 {target_month} 月度计划失败: {e}") + return False + + +# ============================================================================= +# 模块级别的便捷函数 (全部为异步) +# ============================================================================= + + +async def get_today_schedule() -> Optional[List[Dict[str, Any]]]: + """(异步) 获取今天的日程安排的便捷函数""" + return await ScheduleAPI.get_today_schedule() + + +async def get_current_activity() -> Optional[str]: + """(异步) 获取当前正在进行的活动的便捷函数""" + return await ScheduleAPI.get_current_activity() + + +async def regenerate_schedule() -> bool: + """(异步) 触发后台重新生成今天的日程的便捷函数""" + return await ScheduleAPI.regenerate_schedule() + + +async def get_monthly_plans(target_month: Optional[str] = None) -> List[MonthlyPlan]: + """(异步) 获取指定月份的有效月度计划的便捷函数""" + return await ScheduleAPI.get_monthly_plans(target_month) + + +async def ensure_monthly_plans(target_month: Optional[str] = None) -> bool: + """(异步) 确保指定月份存在月度计划的便捷函数""" + return await ScheduleAPI.ensure_monthly_plans(target_month) + + +async def archive_monthly_plans(target_month: Optional[str] = None) -> bool: + """(异步) 归档指定月份的月度计划的便捷函数""" + return await ScheduleAPI.archive_monthly_plans(target_month) \ No newline at end of file