o
    jje                  	   @  s@  U d Z ddlmZ ddlZddlmZmZ ddlmZmZm	Z	 ddl
mZmZ er/ddlmZ e	d	gdf Zi ad
ed< dZddddZd?ddZd@ddZdAddZdAdd ZdAd!d"ZdAd#d$Zd%dd&ed'd(d)dd&ed*d(d+dd&ed,d(d-dd&ed.d(d/Zd
ed0< dBd2d3ZdCd4d5ZdDd7d8ZdEd:d;ZdFd=d>ZdS )Guq   
积分商店货架与刷新逻辑：数据库 shop_stock 为唯一货架；内存 SHOP_ITEMS 由库表同步。
    )annotationsN)datetime	timedelta)TYPE_CHECKINGAnyCallable)
TITLE_DEFSget_title_def   )RedeemShopPluginr   zdict[str, dict[str, Any]]
SHOP_ITEMS         
   commonrare	legendarytdefdict[str, Any] | Nonereturnintc                 C  s<   | pi  dpd}t|tr|  }tt |td S )Nrarityr   )get
isinstancestrstriplowerr   TITLE_PRICE_BY_RARITY)r   r r!   6/home/dore/onebot/Bot_Ero/plugins/redeem_shop/logic.pytitle_price_from_def   s   
r#   plugin'RedeemShopPlugin'title_idNonec                 C  sP   | j j}|d u rtd| jj||rtd| jjj||dds&tdd S )N   无法识别用户u   你已拥有该称号Fcommitu   称号发放失败)	bot_eventuser_idRuntimeError	dbmanagertitleshasunlock)r$   r&   uidr!   r!   r"   _grant_title$   s   r3   c                 C  sH   | j j}|d u rtdt tdd d}| jjj	||dd d S )Nr(   r   )days%Y-%m-%dFr)   )
r+   r,   r-   r   nowr   strftimer.   shopset_draw_pack)r$   r2   untilr!   r!   r"   _grant_extra_draw_pack.   s
   r;   c                 C  0   | j j}|d u rtd| jjj|ddd d S Nr(   r   Fr)   )r+   r,   r-   r.   r8   add_luckr$   r2   r!   r!   r"   _grant_checkin_boost7      r@   c                 C  r<   r=   )r+   r,   r-   r.   r8   
add_waiverr?   r!   r!   r"   _grant_lottery_waiver>   rA   rC   c                 C  s>   | j j}|d u rtdt d}| jjj||dd d S )Nr(   r5   Fr)   )	r+   r,   r-   r   r6   r7   r.   r8   clear_draw_count)r$   r2   todayr!   r!   r"   _grant_lottery_refreshE   s
   rF   uB   额外抽卡补充包（7 天内每日 +2 次额外抽卡额度）uT   兑换成功，已获得额外抽卡补充（7 日有效）。剩余积分 {rest}。)descriptioncoststockapplysuccess_tipuF   打卡增强（接下来 10 次打卡，每次 10% 概率 +1 积分）uC   兑换成功，打卡增强次数已入账。剩余积分 {rest}。uK   抽奖增强（接下来 10 次付费抽奖，每次 30% 不消耗积分）uC   兑换成功，抽奖增强次数已入账。剩余积分 {rest}。u6   抽奖刷新（立刻清空今日已用抽卡次数）uC   兑换成功，今日抽卡次数已重置。剩余积分 {rest}。)fn_extra_draw_packfn_checkin_boostfn_lottery_boostfn_lottery_refreshFIXED_FUNCTION_ITEMSdict[str, int]c                  C  s*   i } t  D ]\}}t|d | |< q| S )NrJ   )rQ   itemsr   )outpidmetar!   r!   r"   _fixed_shop_stock_mappingm   s   rW   c              
   C  s2  | j  }t  |D ]\}}t|}|druzt|ddd }W n tt	fy/   Y qw t
|p5i }|dd}|dpBd}t|trN|  }dd	d
d|t|}t|}	d| d| d|	t||fdddt|< q|tv rt| }
t|
d t|
d t||
d |
ddt|< qdS )uY   根据 shop_stock 重建内存中的 SHOP_ITEMS（进程重启后与数据库一致）。title__r
   name?r   r   u   普通u   稀有u   传奇r   u   解锁称号「u   」（u   ）c                 S  s
   t | |S )N)r3   )pttr!   r!   r"   <lambda>   s   
 z2refresh_shop_items_from_database.<locals>.<lambda>)rH   rI   initial_stockrK   rH   rI   rK   rL   )rH   rI   r_   rK   rL   N)r8   	all_stockr   clearr   
startswithr   split
ValueError
IndexErrorr	   r   r   r   r   r#   rQ   )dbrowsrU   _stocktidr   nmr   rcrI   rV   r!   r!   r"    refresh_shop_items_from_databaset   sB   







rl   	list[int]c                 C  sj   t t }tt }g }|r)tdt|}tj||d}|D ]	}t	|d| < q| j
| t|  |S )uK   清空商店：随机 4 个称号 + 固定功能商品，并同步内存。   )krX   )listr   keysdictrW   minlenrandomsampleWEEKLY_TITLE_STOCKr8   replace_shelfrl   )rf   all_idsmappingpickedro   ri   r!   r!   r"   weekly_refresh_shop_shelf   s   
r|   	list[str]c                 C  s   t |  g }tt D ]A}t| }|d }|d }| j|}|du r'd}n|dkr.d}nt|}|d| d|  |d	| d
|  |d q|S )uB   返回本周货架每条商品的文案行（含空行分隔）。rI   rH   Nu	   未上架rG   u   不限[z] u       售价 u    积分｜剩余  )rl   sortedr   rq   r8   rJ   r   append)rf   linesrU   rV   rI   descstock_nrJ   r!   r!   r"   format_shop_shelf_lines   s    r   r   c                 C  s8   t | }g d}|r|| n|d d| S )u-   每周刷新后发到群里的公告文案。)u   积分商店已刷新~ud   发送 /商店 查看完整列表，或 /商店 <商品id> 兑换。（方括号里的是商品id）r   u   —— 本周货架 ——u   本周暂无上架商品。
)r   extendr   joinrstrip)rf   shelfr   r!   r!   r"   format_shop_weekly_announcement   s   
r   )r   r   r   r   )r$   r%   r&   r   r   r'   )r$   r%   r   r'   )r   rR   )r   r'   )r   rm   )r   r}   )r   r   ) __doc__
__future__r   ru   r   r   typingr   r   r   plugins.titler   r	   r   r   	ShopApplyr   __annotations__rw   r   r#   r3   r;   r@   rC   rF   rQ   rW   rl   r|   r   r   r!   r!   r!   r"   <module>   sf    




	



 

%
