o
    jjC                     @  s   d Z ddlmZ ddlZddlZddlmZ ddlm	Z	 ddl
mZ ee jjd d d	 Zed
ZedZdZdd Zd0ddZdddd1ddZd2d!d"Zd3d&d'Zd4d)d*Zd5d+d,Zd6d.d/ZdS )7u  网页端闹钟（复用 plugins/group_alarm 解析逻辑，避免导入 plugins 包）。

解析逻辑独立存放于 plugins/group_alarm/parser.py（纯 stdlib，无相对/插件导入），
故可按文件路径直接加载，而不引入 plugins 包的依赖。
    )annotationsN)Path)Any)	DbManagerpluginsgroup_alarmz	parser.pyz^([0-1]?\d|2[0-3]):([0-5]\d)$z^\d{4}-\d{2}-\d{2}$)u   一u   二u   三u   四u   五u   六   日c                  C  sD   t jdt} | d u s| jd u rtdt j| }| j| |S )Nbotero_group_alarmu   无法加载 group_alarm 模块)	importlibutilspec_from_file_location_GROUP_ALARM_PATHloaderRuntimeErrormodule_from_specexec_module)specmod r   :/home/dore/onebot/Bot_Ero/checkin_gallery/alarm_service.py_load_group_alarm   s   r   raw
str | Nonereturnc                 C  sX   | sd S t |  }|sd S t|}|stdt|dddt|ddS )Nu+   时间格式须为 HH:MM（00:00–23:59）   02d:   )strstrip_TIME_REmatch
ValueErrorintgroup)r   textmr   r   r   _normalize_time!   s   
&r'   minimummaximumvaluer   namer   r)   r#   r*   
int | Nonec             
   C  s   zt | pd}W n ttfy } zt| d|d }~ww ||k r,t| d| |d urA||krAt| d| d| d|S )Nr   u   须为整数u   须至少为 u   须在 u   –u    之间)r#   	TypeErrorr"   )r+   r,   r)   r*   nexcr   r   r   _positive_int-   s   r1   payloaddict[str, Any]c                 C  s  t | dpd }|stdt | dpd }t| d}d}|dkrJt | dp0d }t|s=td|}|rH| d	| }n0|d
krt| dd}t| dd}t| dd}t| dd}	t| dd}
t||||	|
fstdg }|r|	| d |r|	| d |r|	| d |	r|	|	 d |
r|	|
 d d
|d }n|dkr|std|}n|dkrd}|r| d	| }n|dkrt| dddd}|dkrdnd| d }|r| d	| }nx|d!kr&t| d"d#dd$d%}d&t|d   }|r%| d	| }nT|d'krGt| d(ddd)d%}d*| d}|rF| d	| }n3|d+krvt| d,ddd-d%}t| d(ddd)d%}d.| d| d}|ru| d	| }ntd/| d	|  S )0Ncontent u   请填写提醒内容schedule_typetime	once_datedateu   请选择有效日期 once_relativeyearsu   年monthsu   月daysr   hoursu   小时minutesu   分钟u!   请至少填写一项相对时间u   后
once_todayu   请选择时刻dailyu   每天interval_daysu   间隔天数r   )r)   u   每u   天weeklyweekdayu   星期   r(   u   每周monthlyday   u   每月yearlymonth   u   每年u   未知的触发方式)r   getr   r"   r'   _DATE_REr!   r1   anyappendjoin_WEEKDAY_CN)r2   r4   r6   time_strprefixr9   r<   r=   r>   r?   r@   partsr/   wddommor   r   r   _build_alarm_body9   s   




rY   rowtupledictc              
   C  s   | \
}}}}}}}}	}
}t |pdot |pddk}d }|r3|t |t |p&dt |p+dt |	p0d}|p6dd d }t |
p?drCdnd| }t|dkrP|n|d d d }t ||||||tt |
pedt |pkd|d	S )	Nr   r5      u   私聊u   群 P   u   …)	idfire_atr4   previewis_recurring
recur_desc
is_privategroup_idscope)r#   lenbool)rZ   format_recurridfatr4   is_recrkrarbrcis_privgidrb   rc   r`   rf   ra   r   r   r   _format_alarm_row   s$   * 
rs   user_idc                   sF   t   t }|jdt| f |j } fdd|D }|ddS )Nz
        SELECT id, fire_at, content, is_recurring,
               recur_kind, recur_a, recur_b, recur_c,
               is_private, group_id
        FROM group_alarms
        WHERE creator_user_id = ? AND fired = 0
        ORDER BY fire_at ASC
        c                   s   g | ]}t | jqS r   )rs   _format_recur_desc).0rgar   r   
<listcomp>   s    zlist_alarms.<locals>.<listcomp>   )itemsmin_lead_minutes)r   r   curexecuter#   fetchall)rt   dbrowsr|   r   rx   r   list_alarms   s   

r   c              
   C  s   t |}t }||}t|trt||\}}}t }|jjt	| ||d d|d}	|r@|\}
}}}d|
|
||| d}nd}|	d|	 d|d d	| d
| d	dS )NT)re   rd   recuru   （u
    循环）r5   u   已设置闹钟 #u
   ，将于 z%Y-%m-%d %H:%Mu
    提醒你u   ：「u   」)r_   message)rY   r   _parse_create_body
isinstancer   r"   r   alarmaddr#   ru   strftime)rt   r2   bodyry   parsedfireclean_contentr   r   aidkabcextrar   r   r   create_alarm   s0   


r   alarm_idc                 C  s   t  }|jdt|t| f |j }|stdt|d p!d|d }}|r,d nt|}|jt|t| |}|sBtddd| iS )Nz
        SELECT is_private, group_id
        FROM group_alarms
        WHERE id = ? AND creator_user_id = ? AND fired = 0
        uE   取消失败：编号不存在、已触发或不是你创建的闹钟r   r   r   u   已取消闹钟 #)r   r~   r   r#   fetchoner"   r   cancel)rt   r   r   rZ   rq   rr   
cancel_gidokr   r   r   cancel_alarm   s   
r   )r   r   r   r   )
r+   r   r,   r   r)   r#   r*   r-   r   r#   )r2   r3   r   r   )rZ   r[   r   r\   )rt   r   r   r\   )rt   r   r2   r3   r   r\   )rt   r   r   r#   r   r\   )__doc__
__future__r   importlib.utilr
   repathlibr   typingr   core.database_managerr   __file__resolveparentr   compiler    rN   rR   r   r'   r1   rY   rs   r   r   r   r   r   r   r   <module>   s&    


	

G

