o
    j                     @  s&  d Z ddlmZ ddlmZmZ e  e  ddlmZmZ ddl	m
Z
 ddlmZmZ ddlmZ ddlmZ e
d	d
dZG dd deZd0ddZejd1d0ddZej	d1d2ddZej	d1d3ddZej	d1d4dd Zejd1d0d!d"Zej			#	$	%d5d6d,d-Zejd7d.d/ZdS )8uI   BotEro MCP 服务：将闹钟与打卡能力暴露为 LLM Agent 工具。    )annotations)	bootstrapconfigure_database)AnyLiteral)FastMCP)	BaseModelField)servicesresolve_user_idBotErou
  BotEro 机器人能力工具集（v1：闹钟与打卡查询）。操作某一用户数据时需传入 user_id（QQ 号），或在服务端设置环境变量 BOTERO_MCP_DEFAULT_USER_ID。数据库路径由 BOTERO_DB_PATH 指定，默认为项目根目录 data.db。)instructionsc                   @  s  e Zd ZU dZeddZded< eddZded< ed	d
dZded< ed	ddZ	ded< edddZ
ded< edddZded< edddZded< edddZded< edddZded< edddZded< ed	ddZd ed!< ed	d"dZd ed#< ed	d$dZd ed%< d	S )&AlarmCreatePayloadu3   与网页端闹钟表单一致的结构化参数。u   提醒正文，不可为空)descriptionstrcontentu   触发方式zlLiteral['once_date', 'once_relative', 'once_today', 'daily', 'interval_days', 'weekly', 'monthly', 'yearly']schedule_typeNu!   时刻 HH:MM，部分类型必填)defaultr   
str | Nonetimeu   once_date 时的 YYYY-MM-DDdater   u   once_relative：年intyearsu   once_relative：月monthsu   once_relative：日daysu   once_relative：小时hoursu   once_relative：分钟minutes   u   interval_days：每隔 N 天interval_daysu   weekly：1=周一 … 7=周日
int | Noneweekdayu   monthly/yearly 的日dayu   yearly 的月month)__name__
__module____qualname____doc__r	   r   __annotations__r   r   r   r   r   r   r   r   r   r!   r"   r#    r)   r)   ./home/dore/onebot/Bot_Ero/botero_mcp/server.pyr      s    
 


r   user_idr   returnr   c                 C  s   t | S Nr   r+   r)   r)   r*   _uid8   s   r/   Nc                 C     t t| S )u   列出指定用户尚未触发的私聊闹钟（与 /闹钟 一览 相同数据源）。

    Args:
        user_id: QQ 号；省略时使用 BOTERO_MCP_DEFAULT_USER_ID。
    )r
   
alarm_listr/   r.   r)   r)   r*   list_pending_alarms<      r2   schedule_textc                 C     t t|| S )ui  用自然语言创建闹钟（与群聊 /闹钟 正文解析规则一致）。

    示例：「明天 8:00 喝水」「每天 9:00 打卡」「3小时后开会」「2026-06-01 10:00 交报告」。

    Args:
        schedule_text: 时间与内容描述（不含 /闹钟 前缀）。
        user_id: QQ 号；省略时使用 BOTERO_MCP_DEFAULT_USER_ID。
    )r
   alarm_create_from_textr/   )r4   r+   r)   r)   r*   create_alarm_from_textF   s   r7   payloadc                 C  s   | j dd}tt||S )uf  用结构化表单创建私聊闹钟（与打卡图库网页端一致）。

    schedule_type 取值：once_date | once_relative | once_today | daily |
    interval_days | weekly | monthly | yearly。须距当前至少 5 分钟。

    Args:
        payload: 闹钟表单字段。
        user_id: QQ 号；省略时使用 BOTERO_MCP_DEFAULT_USER_ID。
    T)exclude_none)
model_dumpr
   alarm_create_structuredr/   )r8   r+   bodyr)   r)   r*   create_alarm_structuredV   s   r=   alarm_idr   c                 C  r5   )u   取消本人未触发的闹钟（与 /闹钟 取消 <编号> 一致）。

    Args:
        alarm_id: 闹钟编号，见 list_pending_alarms。
        user_id: QQ 号；省略时使用 BOTERO_MCP_DEFAULT_USER_ID。
    )r
   alarm_cancelr/   )r>   r+   r)   r)   r*   cancel_pending_alarmh   s   r@   c                 C  r0   )u   查询用户本周打卡概况：周期、本周图片数、是否本周首次、连续打卡 streak。

    Args:
        user_id: QQ 号；省略时使用 BOTERO_MCP_DEFAULT_USER_ID。
    )r
   checkin_weekly_statusr/   r.   r)   r)   r*   get_weekly_checkin_statusv   r3   rB   r      Fyearr    page	page_sizeimages_onlyboolc                 C  s   t jt| ||||dS )u  分页查询用户打卡记录（默认含无本地图片的记录）。

    Args:
        user_id: QQ 号；省略时使用 BOTERO_MCP_DEFAULT_USER_ID。
        year: 按自然年筛选，如 2025；省略则不限年份。
        page: 页码，从 1 开始。
        page_size: 每页条数，最大 50。
        images_only: 为 true 时仅返回本地仍有图片文件的记录。
    )rD   rE   rF   rG   )r
   checkin_list_recordsr/   )r+   rD   rE   rF   rG   r)   r)   r*   list_checkin_records   s   rJ   c                   C  s   t  S )u|   列出本周（周一 04:00 起算）已完成打卡的用户及首次打卡时间（与 /本周板油 数据源一致）。)r
   checkin_list_week_membersr)   r)   r)   r*   list_weekly_checkin_members   s   rL   )r+   r   r,   r   r-   )r4   r   r+   r   r,   r   )r8   r   r+   r   r,   r   )r>   r   r+   r   r,   r   )NNr   rC   F)r+   r   rD   r    rE   r   rF   r   rG   rH   r,   r   )r,   r   )r'   
__future__r   botero_mcp._bootstrapr   r   typingr   r   fastmcpr   pydanticr   r	   
botero_mcpr
   botero_mcp.contextr   mcpr   r/   toolr2   r7   r=   r@   rB   rJ   rL   r)   r)   r)   r*   <module>   sL    
		