o
    jj%                     @   s.   d dl m Z  d dlZd dlZG dd dZdS )    )datetimeNc                   @   sV  e Zd ZdejfddZdededefddZd.ded
e	fddZ
dedeeeef fddZ		d.dedededed
e	f
ddZdedede	fddZdededededef
ddZdedededededededede	fddZdededefd d!Zdedefd"d#Zdedee fd$d%Z	&d/deded'ed(ed)ed*edee	ef fd+d,Zd-S )0ImmortalManagerconnc                 C   s   || _ | | _d S )N)r   cursorcur)selfr    r   -/home/dore/onebot/Bot_Ero/core/db/immortal.py__init__   s   zImmortalManager.__init__group_id
period_keyreturnc                 C   s   t |}t|}| jd||f | j }|r"|d r"t|d S |dd}tdD ]F}td	 }d| d| }	| jd|||	f | jj
dkrV| j  |	  S | jd||f | j }
|
rr|
d rrt|
d   S q,td	)
NzSSELECT issue_code FROM immortal_lottery_issue WHERE group_id = ? AND period_key = ?r   - 0      zXR-z
                INSERT OR IGNORE INTO immortal_lottery_issue (group_id, period_key, issue_code)
                VALUES (?, ?, ?)
                z/immortal_lottery: failed to allocate issue_code)intstrr   executefetchonereplacerangesecrets	token_hexupperrowcountr   commitRuntimeError)r   r   r   gidpkrowcompact_tailcoderow2r   r   r	   
issue_code   s:   


zImmortalManager.issue_codeTr   c                 C   s*   | j dt|f |r| j  d S d S )Nz
            INSERT OR IGNORE INTO immortal_lottery_carry (group_id, carry_4a, carry_3a, carry_2a)
            VALUES (?, 0, 0, 0)
            )r   r   r   r   r   )r   r   r   r   r   r	   ensure_carry,   s   zImmortalManager.ensure_carryc                 C   sT   | j dt|f | j  }|sdS t|d pdt|d p dt|d p'dfS )NzRSELECT carry_4a, carry_3a, carry_2a FROM immortal_lottery_carry WHERE group_id = ?)r   r   r   r         )r   r   r   r   )r   r   r    r   r   r	   carry7   s   
.zImmortalManager.carrycarry_4acarry_3acarry_2ac                 C   sJ   | j |dd | jdt|t|t|t|f |r#| j  d S d S )NF)r   z
            UPDATE immortal_lottery_carry
            SET carry_4a = ?, carry_3a = ?, carry_2a = ?
            WHERE group_id = ?
            )r'   r   r   r   r   r   )r   r   r+   r,   r-   r   r   r   r	   	set_carryA   s   zImmortalManager.set_carryc                 C   s(   | j dt|t|f | j  d uS )NTSELECT 1 FROM immortal_lottery_results WHERE group_id = ? AND period_key = ? LIMIT 1r   r   r   r   r   r   r   r   r   r   r	   
has_resultP   s
   zImmortalManager.has_resultwinning_digits	bet_totaldrawn_atc              	   C   s:   | j dt|t|t|t|t|f | j  d S )Nz
            INSERT INTO immortal_lottery_results (group_id, period_key, winning_digits, bet_total, drawn_at)
            VALUES (?, ?, ?, ?, ?)
            )r   r   r   r   r   r   )r   r   r   r3   r4   r5   r   r   r	   insert_resultW   s
    zImmortalManager.insert_resultnew_carry_4anew_carry_3anew_carry_2ac
              	   C   s  t |}
t|}| jd zp| jd|
|f | j r%| j  W dS | jd|
|t|t |t|f | jd|
f | jdt |t |t ||
f |	D ]$\}}t |}|dkr_qRtt |}| jd|f | jd	||f qR| j  W d
S  ty   | j   w )NBEGIN IMMEDIATEr/   Fz
                INSERT INTO immortal_lottery_results (group_id, period_key, winning_digits, bet_total, drawn_at)
                VALUES (?, ?, ?, ?, ?)
                
                INSERT OR IGNORE INTO immortal_lottery_carry (group_id, carry_4a, carry_3a, carry_2a)
                VALUES (?, 0, 0, 0)
                z
                UPDATE immortal_lottery_carry
                SET carry_4a = ?, carry_3a = ?, carry_2a = ?
                WHERE group_id = ?
                r   AINSERT OR IGNORE INTO user_assets (user_id, points) VALUES (?, 0)z<UPDATE user_assets SET points = points + ? WHERE user_id = ?T)	r   r   r   r   r   r   rollbackr   	Exception)r   r   r   r3   r4   r5   r7   r8   r9   payoutsr   r   uidamtauid_sr   r   r	   finalize_drawc   sR   



zImmortalManager.finalize_drawc                 C   s`   | j dt|t|f | j  }|sdnt|d pd}|s"dnt|d p(d}|||dS )Nz
            SELECT COUNT(*), COUNT(DISTINCT user_id), COALESCE(SUM(LENGTH(digits)), 0)
            FROM immortal_lottery_bets
            WHERE group_id = ? AND period_key = ?
            r   r(   )	bet_countdistinct_users
bet_pointsr0   )r   r   r   r    n_betsn_usersr   r   r	   period_stats   s   
zImmortalManager.period_statsc                 C   s.   | j dt|t|f dd | j  D S )Nz
            SELECT id, user_id, digits FROM immortal_lottery_bets
            WHERE group_id = ? AND period_key = ?
            ORDER BY created_at ASC, id ASC
            c                 S   s.   g | ]}t |d  t |d t|d fqS )r   r(   r)   )r   r   .0rr   r   r	   
<listcomp>   s   . z-ImmortalManager.list_bets.<locals>.<listcomp>)r   r   r   r   fetchallr1   r   r   r	   	list_bets   s
   zImmortalManager.list_betsc                 C   s(   | j dt|f dd | j  D S )Na  
            SELECT DISTINCT group_id FROM immortal_lottery_bets WHERE period_key = ?
            UNION
            SELECT group_id FROM immortal_lottery_carry
            WHERE COALESCE(carry_4a, 0) + COALESCE(carry_3a, 0) + COALESCE(carry_2a, 0) > 0
            c                 S   s$   g | ]}|d  durt |d  qS )r   N)r   rK   r   r   r	   rN      s   $ z3ImmortalManager.groups_for_draw.<locals>.<listcomp>)r   r   r   rO   )r   r   r   r   r	   groups_for_draw   s
   	zImmortalManager.groups_for_drawr(   user_iddigitsbet_bj_datecostc              
   C   s  t t|}t|}| jd z| jdt|t|t |f | j r.| j  W dS | jdt|f | jd|f | jd|f | j }|rU|d d u rWdnt|d }	|	|k ri| j  W dS | jd	|||f | jjdkr| j  W dS t	 
d
}
| jdt|t |t|t |t ||
f | j  W dS  ty } z| j  dt |pdfW  Y d }~S d }~ww )Nr:   z
                SELECT 1 FROM immortal_lottery_bets
                WHERE group_id = ? AND user_id = ? AND bet_bj_date = ?
                LIMIT 1
                )FuB   今日已在本群下过注（北京时间每日最多 1 注）。r;   r<   z0SELECT points FROM user_assets WHERE user_id = ?r   )Fu*   积分不足（每注消耗 1 积分）。z~
                UPDATE user_assets SET points = points - ?
                WHERE user_id = ? AND points >= ?
                z%Y-%m-%d %H:%M:%Sz
                INSERT INTO immortal_lottery_bets (group_id, period_key, user_id, digits, bet_bj_date, created_at)
                VALUES (?, ?, ?, ?, ?, ?)
                )TokFu   下注失败)r   r   r   r   r   r   r=   r   r   nowstrftimer   r>   )r   r   r   rR   rS   rT   rU   	user_id_sr    ptstser   r   r	   try_place_bet   sV   


 

"

zImmortalManager.try_place_betN)T)r(   )__name__
__module____qualname__sqlite3
Connectionr
   r   r   r&   boolr'   tupler*   r.   r2   r6   rD   dictrJ   rP   listrQ   r]   r   r   r   r	   r      s    !

	
?
r   )r   r   ra   r   r   r   r   r	   <module>   s    