o
    	cja4                     @  s   d Z ddlmZ ddlZddlZddlmZmZmZmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZmZ dd	lmZ ed
ZedZd-ddZd.ddZd/ddZd0ddZd1ddZd2d"d#Zd3d)d*ZeG d+d, d,eZdS )4uc   
仙人彩：周一 00:00–周五 23:59:59（北京时间）下注，周日 20:00 自动开奖。
    )annotationsN)datedatetimetime	timedelta)Optional)ZoneInfo)Plugin)attext)register_pluginzAsia/Shanghaiz
^[0-9]{4}$returnr   c                   C  s
   t tS N)r   now_BJ r   r   5/home/dore/onebot/Bot_Ero/plugins/immortal_lottery.py_now_bj      
r   dr   c                 C  sB   |   }|dkr| tdd S |dkr| tdd S | t|d S )uQ   自然周内的周一（周日归属到刚过去的周一为起点的周期）。   days   )weekdayr   )r   wdr   r   r   _period_monday_for_display   s   r   monstrc                 C  s
   |  dS )N%Y-%m-%d)strftime)r   r   r   r   _period_key_from_monday#   r   r!   now_bjboolc                 C  s@   |   }|dkr
dS |dk rdS |  jd d}|tdddkS )N   FT)tzinfo   ;   )r   r   replace)r"   r   tr   r   r   _in_betting_window'   s   r*   sundayc                 C  s   | t dd S )Nr   r   )r   )r+   r   r   r   _sunday_draw_period_monday1   s   r,   secretguessintc                   s   t  fddtdD S )Nc                 3  s$    | ]}|  | krd V  qdS )   Nr   ).0ir.   r-   r   r   	<genexpr>6   s   " z_count_a.<locals>.<genexpr>r$   )sumrange)r-   r.   r   r3   r   _count_a5   s   r7   poolordered_winnerslist[tuple[int, str]]
prize_name=tuple[list[tuple[int, int, str]], list[tuple[int, int]], int]c                 C  s   t |}|dkrg g | fS | dkrg g dfS g }g }| |k rPt|D ](\}\}}|| k r.dnd}	| d| }
|||	|
f |	dkrJ|||	f q"||dfS | | }| | }|D ]\}}| d| }
||||
f |dkrx|||f qZ|||fS )u  
    只派发整数积分；无法整除的余数滚入该奖级下期池。
    若奖池不足以使每位中奖注至少分到 1 分，则按下注先后各发 1 分直至耗尽。
    返回 (展示明细, 实际加分的 (uid, amt) 列表, 滚入下期该奖级的余数)。
    r   r0    )len	enumerateappend)r8   r9   r;   ndetailpayoutsr2   uiddgamtlabelbaseremr   r   r   _allocate_tier_pool9   s2   




rJ   c                   @  sv   e Zd ZU dZdZdZded< d!dd	Zd"ddZd#ddZ	dd Z
d$ddZdd Zd%ddZdd Zd&dd ZdS )'ImmortalLotteryPluginimmortal_lotteryuT   仙人彩：四位数竞猜，周中下注、周日开奖，积分奖池与滚存。NzOptional[str]_last_draw_slotr   r#   c                 C  sd   | j jdkrdS t }| dks|jdks|jdkrdS d|   }tj	|kr-dS |t_	dS )N
meta_eventFr      r   immortal_draw_T)
	bot_event	post_typer   r   hourminuter   	isoformatrK   rM   )selfr   keyr   r   r   _draw_heartbeat_matchf   s    
z+ImmortalLotteryPlugin._draw_heartbeat_match
event_typer   c                 C  s   |dkr|   S | jjdkrdS | jjr| jjd ddkr!dS | jjd d d  }|dr:d	|d
d   }|drAdS td|rIdS dS )NmetamessageFr   typer   data   ／/r0   
   /仙人彩Tu
   ^下注\s+)	rX   rQ   rR   r[   getstrip
startswithrematch)rV   rY   rawr   r   r   re   r   s   

zImmortalLotteryPlugin.matchtuple[str, str]c                 C  s~   | j jd d d  }|drd|dd   }|dr,|tdd   }d|fS td	|}|r=d
|d fS dS )Nr   r]   r   r^   r_   r0   r`   xianrenu   ^下注\s+(.+)$bet) rj   )rQ   r[   rb   rc   r>   rd   re   group)rV   rf   restmr   r   r   _parse_command   s   

z$ImmortalLotteryPlugin._parse_commandc                 C  s   | j jdkr|   d S | j jd u r| jtd d S |  \}}|s&d S t	dd|}|s5| 
  d S t|sD| jtd d S | | d S )NrN   u!   仙人彩请在群聊中使用。z\s+rj   u^   请发送四位数字（每位 0–9，可重复），例如：/仙人彩 1234 或 下注 0420)rQ   rR   _handle_draw_tickgroup_idapisend_msgr   rn   rd   sub_send_pool_info_DIGITS4re   
_place_bet)rV   kindrl   digits_partr   r   r   handle   s&   
zImmortalLotteryPlugin.handlec                 C  s   t   }t|}t|S r   )r   r   r   r!   )rV   r   r   r   r   r   _current_period_key   s   
z)ImmortalLotteryPlugin._current_period_keyc              
   C  s   t | jj}|  }| j||}| j||}| j|\}}}t |dd}t |dd}	t |dd}
dd| d| d| d	|
 d
|	 dd| d| d| dddddg
}| j	
td| d S )N
bet_pointsr   distinct_users	bet_countu   【仙人彩 · 本期概况】	   期号：u   周期（周一）起点：u   本期累计投注：u
    积分（u    注，u    人参与）u   滚存奖池：一等奖     / 二等奖     / 三等奖 rj   u<   下注期：每周一 00:00–周五 23:59（北京时间）u%   开奖：每周日 20:00 自动开奖u-   每注 1 积分；每人每天最多 1 注。u@   发送 /仙人彩 四位数字 或 下注 四位数字 参与。
)r/   rQ   rp   rz   	dbmanager)immortal_lottery_get_or_create_issue_codeimmortal_lottery_period_statsimmortal_lottery_get_carryra   rq   rr   r   join)rV   gidpkissuestc4c3c2ptsusersbetslinesr   r   r   rt      s(   z%ImmortalLotteryPlugin._send_pool_infodigitsc           
      C  s   t t s| jtd d S | jj}|d u rd S t| jj}| 	 }t 
d}| j||t|||d\}}|sI| jtt|t| d S | j||}| j|}	| jtt|td| d| d| d|	  d S )NuF   当前不在下注时间内（周一至周五 23:59 北京时间）。r   r0   u   下注成功：u
   
期号：u   （周期周一 u%   ）
已扣 1 积分，当前积分：)r*   r   rq   rr   r   rQ   user_idr/   rp   rz   r    r   immortal_lottery_try_place_betr
   r   get_user_point)
rV   r   rD   r   r   bet_dateokerrr   rl   r   r   r   rv      s*   

z ImmortalLotteryPlugin._place_betc                 C  sV   t  }| }t|}t|}| j}||}|D ]}|||r"q| || qd S r   )r   r   r,   r!   r   'immortal_lottery_groups_for_period_drawimmortal_lottery_has_result_run_single_group_draw)rV   r   sunr   r   dbgroupsr   r   r   r   ro      s   
z'ImmortalLotteryPlugin._handle_draw_tickrp   r/   
period_keyc           7      C  s
  | j }|||}|||}t|}|d d }|d d }|| | }	||\}
}}|
| }|| }||	 }ddd tdD }g }g }g }|D ]-\}}}t||}|dkrc|||f qM|dkro|||f qM|d	krz|||f qMt|}t|}t|}g }g }d
 } }}d
 }  }!}"|d
kr|}#n%|d
krd
}#nt	||d\}$}%}|
|$ |
|% tdd |%D } |}#|d
kr|}&n%|d
krd
}&nt	||d\}'}	}|
|' |
|	 tdd |	D }!|}&|d
kr|}(n%|d
krd
}(nt	||d\})}}|
|) |
| tdd |D }"|}(t d}*z||||||*|#|&|(|	}+W n ty;   Y d S w |+sAd S dd| d| d| d| dd| d| d| dg},|d
kro|,d| d n@g }-|d
kr||k r|-d |d
kr|-d| d d | d!| d"|  d}.|-r|.d#d$|- d% 7 }.|,|.d&  |d
kr|,d'| d( n@g }/|d
kr||k r|/d |d
kr|/d| d) d*| d!| d"|! d}0|/r|0d#d$|/ d% 7 }0|,|0d&  |d
kr|,d+| d, n@g }1|d
kr||k r|1d |d
kr,|1d| d- d.| d!| d"|" d}2|1rF|2d#d$|1 d% 7 }2|,|2d&  |ro|,d |,d/ |D ]\}3}4}5|,d0|5 d1|4 d q\d2|,}6| jd3t|t|6fd4 d S )5N<   d      rj   c                 s  s     | ]}t td dV  qdS )r   	   N)r   randomrandint)r1   _r   r   r   r4      s    z?ImmortalLotteryPlugin._run_single_group_draw.<locals>.<genexpr>r$         r   u   一等奖(4A)c                 s      | ]\}}|V  qd S r   r   r1   _uar   r   r   r4         u   二等奖(3A)c                 s  r   r   r   r   r   r   r   r4     r   u   三等奖(2A)c                 s  r   r   r   r   r   r   r   r4   $  r   z%Y-%m-%d %H:%M:%Su   【仙人彩 · 开奖】r~   u   本期周期（周一）：u   开奖号码：u   本期投注：u    积分u4   各奖级池（本期分成 + 滚存）：一等奖 r   r   u   一等奖无人中奖，u"    积分滚入下期一等奖池。uB   奖池不足每人 1 分，已按下注先后各发 1 分至耗尽u   均分余数 u    分滚入下期一等奖池u   一等奖(4A)：u    注，奖池 u   ，实际派发 u   （u   ；u   ）u   。u   二等奖无人中奖，u"    积分滚入下期二等奖池。u    分滚入下期二等奖池u   二等奖(3A)：u   三等奖无人中奖，u"    积分滚入下期三等奖池。u    分滚入下期三等奖池u   三等奖(2A)：uW   中奖发放（整数积分；余数滚存；不足每人 1 分时按下注顺序）：u     · u    → r   send_group_msg)rp   r[   )r   r   immortal_lottery_list_betsr>   r   r   r6   r7   r@   rJ   extendr5   r   r    immortal_lottery_finalize_draw	Exceptionrq   call_apir/   r   )7rV   rp   r   r   r   r   	bet_totalp1p2p3r   r   r   pool_4pool_3pool_2winningtier4tier3tier2_bidrD   rE   r   nc4nc3nc2rC   
pay_detailrem4rem3rem2paid4paid3paid2new_c4d4p4new_c3d3new_c2d2drawn_atr   r   extra4line4extra3line3extra2line2_uidrF   rG   msgr   r   r   r      s   








	










"z,ImmortalLotteryPlugin._run_single_group_draw)r   r#   )rY   r   r   r#   )r   rg   )r   r   )r   r   )rp   r/   r   r   )__name__
__module____qualname__namedescriptionrM   __annotations__rX   re   rn   ry   rz   rt   rv   ro   r   r   r   r   r   rK   _   s   
 




rK   )r   r   )r   r   r   r   )r   r   r   r   )r"   r   r   r#   )r+   r   r   r   )r-   r   r.   r   r   r/   )r8   r/   r9   r:   r;   r   r   r<   )__doc__
__future__r   r   rd   r   r   r   r   typingr   zoneinfor   	core.baser	   core.cqr
   r   
core.utilsr   r   compileru   r   r   r!   r*   r,   r7   rJ   rK   r   r   r   r   <module>   s*    









&