o
    jjp>                     @   sN  d dl Z d dlZd dlmZmZmZ d dlmZmZm	Z	 e
dZeddZdZe
de d	e d
e de d	Ze
dZe
dZdedeej fddZdedeej fddZdZdZdZdZe
de Ze
de Ze
dZe
dZe
dZe
dZd ed!ed"ed#edef
d$d%Z d&ejde!fd'd(Z"d&ejde!fd)d*Z#d&ejdeeef fd+d,Z$d-edee fd.d/Z%d0ed1ed2ed3edef
d4d5Z&d6edee	eeeeeeejf f  fd7d8Z'd9edeee ee ee f fd:d;Z(d<ed=ee d>ee d?ee deeeef f
d@dAZ)d<edefdBdCZ*d<edDedEe!dFedGedefdHdIZ+d<edJedEe!dFedGedefdKdLZ,d<edMedEe!dFedGede	eef fdNdOZ-d<edPedQedEe!dFedGede	eef fdRdSZ.dTed<ed0ed1ed2ed3edefdUdVZ/dWedefdXdYZ0dWede	eeeeeeeeef  f ef fdZd[Z1dS )\    N)datetime	timedeltatime)OptionalTupleUnionu|   (?:(\d+)年)?(?:(\d+)月)?(?:(\d+)(?:日|天))?(?:(\d+)(?:小時|小时|時|时))?(?:(\d+)(?:分鐘|分钟|分))?(?:後|后)   )minutesu   (?:日|號|号)u   (?:\d+年\d+月\d+u   |\d+年\d+月|\d+年\d+u   |\d+年|\d+月\d+u   |\d+月|\d+u   )(?!后|後)zE(?<![0-9])(?P<y>[12][0-9]{3})-(?P<mo>\d{1,2})-(?P<d>\d{1,2})(?![0-9])u3   (?<![0-9])([0-1]?\d|2[0-3])[:：]([0-5]\d)(?![0-9])sreturnc                 C   sL   g }t | }t| }|r|| |r|| |sdS t|dd dS )uI   在全文取最先出现的公历「中文片段」或「YYYY-MM-DD」。Nc                 S   s   |   S )N)start)m r   7/home/dore/onebot/Bot_Ero/plugins/group_alarm/parser.py<lambda>$   s    z+_find_first_absolute_date.<locals>.<lambda>)key)_ISO_DATE_REsearch_ABS_DATE_REappendmin)r
   candsm1m2r   r   r   _find_first_absolute_date   s   



r   restc                 C   s$   |   }t|}|r|S t|S )u^   与循环前缀互斥时：判断 rest 是否以公历绝对日期（中文或 ISO）开头。)stripr   matchr   )r   tr   r   r   r   _abs_at_line_start'   s
   

r               u   ^每月(\d{1,2})u   ^每年(\d{1,2})月(\d{1,2})u&   ^每星期([一二三四五六日天])u@   ^每(?:周|週)(周天|周日|週日|[一二三四五六日天])u   ^每(?:日|天)u   ^每(\d+)(?:日|天)dtyearsmonthsdaysc           	      C   s   | j t| }| jt| }| j}|dkr!|d7 }|d8 }|dks|dk r1|d8 }|d7 }|dk s%t||d }t||}| j|||ddd}|tt|d S )N   r    r   yearmonthdaysecondmicrosecondr'   )	r*   intr+   r,   calendar
monthranger   replacer   )	r$   r%   r&   r'   yr   dlastoutr   r   r   _apply_year_month_day_offset?   s   
r8   r   c                 C   s*   | sdS |  d}ttd|d d S )NFr   z\d)groupboolrer   )r   spanr   r   r   _rel_match_validO   s   
r>   c                 C   s0   |   }t|dk rdS |d dup|d duS )ue   相对片段内是否写了「X时/…小时」或「Y分/…分钟」（与独立 HH:MM 区分）。r   Fr"   Nr#   )groupslen)r   gr   r   r   _rel_has_embedded_clockV   s   rB   c                 C   s`   |   }t|dkr|d d urt|d nd}t|dkr*|d d ur*t|d nd}||fS )Nr"   r   r#   )r?   r@   r0   )r   rA   hamiar   r   r   _rel_embedded_hours_minutes^   s   ((rE   tokenc              	   C   sD   | sdS | dv r
dS t | dkrdS dddddd	ddd
}|| S )uQ   返回 1–7（周一…周日）。token 为「一」「日」「周天」等。N)u   周天u   周日u   週日   r    r!   r"   r#   r      )   一   二   三   四   五   六   日u   天)r@   get)rF   mpr   r   r   _weekday_token_to_ne   s   
rR   kindab_cc                 C   s~   | t krt|dkrdS dt|S | tkr$d}d|t|d  S | tkr2dt|t|S | tkr=dt|S dS )	Nr    u   每天u   每{}日)rI   rJ   rK   rL   rM   rN   rO   u   每周{}u   每年{}月{}日u   每月{}日u   循环)RECUR_INTERVAL_DAYSr0   formatRECUR_WEEKLYRECUR_YEARLYRECUR_MONTHLY)rS   rT   rU   rV   cnr   r   r   _format_recur_descq   s   r]   s0c                 C   s>  t | }|rt|d}|dk s|dkrdS t|dd|fS t| }|rPt|dt|d}}|dk s=|dkr?dS |dk sG|dkrIdS t||d|fS t| }|s\t| }|rt|d}t	|}|d	u rmd
S t
|dd|fS t| }|rtddd|fS t| }|rt|d}|dk rdS t|dd|fS d	S )u   
    若 s0 以支持的循环前缀开头，返回 (recur_kind, a, b, c, match)；
    若语法不合法返回错误字符串。
    r       u/   「每月」后面的日须在 1–31 之间。r   r!   r(   u&   「每年」月须在 1–12 之间。u&   「每年」日须在 1–31 之间。NuW   「每周 / 每星期」后请跟周一至周日（如：每周三、每星期日）。u(   「每N日/天」的 N 须至少为 1。)_RECUR_MONTHLY_REr   r0   r:   r[   _RECUR_YEARLY_RErZ   _RECUR_WEEKLY_LONG_RE_RECUR_WEEKLY_RErR   rY   _RECUR_EVERY_DAY_RErW   _RECUR_N_DAYS_RE)r^   r   dommod_tokwdnr   r   r   _try_match_recurring   sB   






rl   fragmentc                 C   sp   d } }}t d| }|rt|d}t d| }|r$t|d}t d| }|r3t|d}|||fS )uM   从「…年…月…日」片段解析整数，未出现的部分为 None。Nu   (\d+)年r    u   (\d+)月u   (\d+)(?:日|號|号))r<   r   r0   r:   )rm   r4   m_r5   mymmmdr   r   r   _extract_ymd_from_fragment   s   
rr   nowgygmgdc                 C   sB  | j | j| j}}}|dur |dur |dur |||}}}	n^|dur1|dur1||d}}}	nM|durB|durB|||}}}	n<|durO|dd}}}	n/|dur`|dur`|||}}}	n|durm||d}}}	n|durz|||}}}	ntd|dk s|dkrtdt||d }
tdtt|	|
}	|||	fS )uC   不完整绝对日期：缺省补当前年/月或 1 月 1 日等。Nr    z	empty ymdr(   z	bad month)	r*   r+   r,   
ValueErrorr1   r2   maxr   r0   )rs   rt   ru   rv   y0m0d0r4   rn   r5   r6   r   r   r   _build_absolute_ymd   s*   
r|   c                 C   s   | j dddS )Nr   )r-   r.   )r3   )rs   r   r   r   
_now_trunc   s   r}   rk   has_timethtmc                 C   s   t | }|t|d }|r|j||ddd}d}|t | krB|dk rB|t|d }|r4|j||ddd}|d7 }|t | krB|dk s"|S )Nr/   r   hourminuter-   r.   '  r    )r}   r   r3   )rs   rk   r~   r   r   basefireguardr   r   r   _first_fire_interval_days   s   r   user_wdc                 C   s   t |d }|r
|n| j}|r|n| j}||   d }|  t|d }	t|	j|	j|	j	||dd}
|
t
| kr?|
tdd }
|
S )Nr    rG   r/   r   )r0   r   r   weekdaydater   r   r*   r+   r,   r}   )rs   r   r~   r   r   	target_pyhmideltar{   r   r   r   r   _first_fire_weekly   s   r   rf   c                 C   s   |r|n| j }|r|n| j}| j| j}}t||d }	t||	}
zt|||
||dd}W n
 ty8   Y dS w |t	| krt|dkrK|d d}}n|d7 }t||d }	t||	}
zt|||
||dd}W |S  tys   Y dS w |S )Nr    r   u-   「每月」对应的日期在本月无效。r(   u0   「每月」对应的日期在下一月无效。)
r   r   r*   r+   r1   r2   r   r   rw   r}   )rs   rf   r~   r   r   r   r   r4   r   r6   r5   r   r   r   r   _first_fire_monthly   s.   

r   r+   r,   c                 C   s   |r|n| j }|r|n| j}| j}t||d }	t||	}
zt|||
||dd}W n
 ty4   Y dS w |t| krd|d7 }t||d }	t||	}
zt|||
||dd}W |S  tyc   Y dS w |S )Nr    r   u!   「每年」月日组合无效。u-   「每年」在下一年的该月日无效。)	r   r   r*   r1   r2   r   r   rw   r}   )rs   r+   r,   r~   r   r   r   r   r4   r6   r5   r   r   r   r   _first_fire_yearly  s*   

r   prevc                 C   sF  |t kr2t|}| t|d }d}|t|kr0|dk r0|t|d }|d7 }|t|kr0|dk s|S |tkr=| tdd S |tkrst|}	| j| j}
}|dkrX|
d d}
}n|d7 }t	|
|d }t
|	|}| j|
||dddS |tkrt|t|}}| jd }
t	|
|d }t
||}| j|
||dddS | tdd S )Nr/   r   r   r    rG   r(   r)   )rW   r0   r   r}   rY   r[   r*   r+   r1   r2   r   r3   rZ   )r   rs   rS   rT   rU   rV   rk   nxtrA   rf   r4   r   r6   r5   rg   dyr   r   r   _next_recurring_fire$  s6   


r   bodyc                 C   s   |   }t|}t|tr||d  d    }n4t|}t|r6|d |  d || d   }nt	|}|rN|d |  d || d   }t
d|}d| S )Nr#    )r   rl   
isinstancetupleend_REL_AFTER_REr   r>   r   r   _TIME_REsubjoinsplit)r   r
   rrel_mabs_mr   r   r   _strip_patterns_for_contentB  s   

&$r   c           *   	   C   s  |   }t|}t|t}t|tr|nd }|r|S t| }|d u}|rR|\}}}	}
}|| d    }t	|}t
|rAdS t|}|rIdS d }d}d }d}nt| }t
|}|r_d nt| }|d u}|sr|sr|sr|sr	 dS t| }|szdS d\}}|rt|dt|d}}t }d }|r|\}}}}}|tkrt|||||}n<|tkrt|||||}n/|tkrt|||||}t|tr|S |}n|tkrt||||||}t|tr|S |}nd	S ||||f}n|r6t|dpd
}t|dpd
} t|dpd
}!t||| |!}t|r)t|\}"}#|t|"|#d }n|r5|j||d
d
d}n|rd| v rezt|d}$t|d}%t|d}&W n/ t t!fyd   Y dS w t"|d
\}'}(})zt#||'|(|)\}$}%}&W n t!y   Y dS w |$tj$j%k s|$dkrdS z|rt|$|%|&||d
d
}nt|$|%|&|j&|j'd
d
}W n t!y   Y dS w t(|) t*||d
d
}||krdS || t+k rdS |||fS )NuK   循环前缀不能与「…日后／…日後」紧接在同一指令中。uQ   循环前缀不能与用于定时的具体日历日期紧接在同一指令中。Fu  请至少指定「每天/每日」「每N日/天」「每周…」「每年…月…日」「每月…日」之一，或「…年…月…日…(时|小时)…(分|分钟)后」相对时间、「…年…月…日」或 YYYY-MM-DD 具体日期，或「HH:MM」时间。u*   请填写闹钟内容（不能为空）。)r(   r   r    r!   u   不支持的循环类型。r   r"   )hoursr	   r   r4   rg   r5   u0   日期不合法，请检查 YYYY-MM-DD 格式。u-   日期不合法，请检查年、月、日。i'  u   年份超出可表示范围。u`   闹钟触发时间不能早于或等于当前时刻（无日期时默认为当天该时刻）。uN   闹钟须设置在至少 5 分钟之后（距当前时刻不足 5 分钟）。),r   rl   r   r   strr   r   r   r   r   r>   r   r   r   r0   r:   r   rs   rW   r   rY   r   r[   r   rZ   r   r8   rB   rE   r   r3   	groupdict	TypeErrorrw   rr   r|   r   r*   r   r   combiner   dtime_MIN_ALARM_LEAD)*r   r^   
recur_info	has_recur	recur_errm_timer~   _k_a_brV   em
rest_afterrm0am0r   has_relr   has_abscontentr   r   rs   recurrS   rarbrc_emr   fryamadarC   rD   yyrp   ddrt   ru   rv   r   r   r   _parse_create_bodyS  s   








r   )2r1   r<   r   r   r   r   typingr   r   r   compiler   r   _ABS_DAYr   r   r   r   Matchr   r   rW   rY   rZ   r[   r`   ra   rb   rc   rd   re   r0   r8   r;   r>   rB   rE   rR   r]   rl   rr   r|   r}   r   r   r   r   r   r   r   r   r   r   r   <module>   s    

	



.((

"



&8