o
    Blj:                     @   s   d dl m Z  d dlmZmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ ddlmZmZmZmZmZmZmZmZmZ dd	lmZmZmZmZmZmZmZ dd
lmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+ e,h dZ-e	G dd deZ.dS )    )datetime)PluginBOT_QQ)text)logger)register_plugin)	DbManager   )	create_roomget_roomremove_room
add_playerremove_playerfind_player_room
get_player
list_rooms
GAME_TYPES)
start_gamecollect_descriptioncollect_voteadvance_to_votingtally_votescheck_winneradvance_to_describe)	broadcastbroadcast_descriptionsbroadcast_vote_instructionsbroadcast_describe_instructionsbroadcast_vote_resultbroadcast_game_overbuild_forward_nodessend_forward_to_groupsave_game_recordget_saved_recordsformat_record_summary)grant_game_titles>	      /加入   /开始   /放弃   /状态   /离开   /退出   /创建游戏   /房间列表   /游戏记录c                   @   sf   e Zd ZdZdZdefddZdefddZdefd	d
Z	dde
fddZdd Zdd Zdd ZdS )WhoIsSpyPlugin
who_is_spyu6   谁是卧底：群聊创建房间，私聊匿名进行returnc                 C   s<   | j jD ]}|ddkr|di dd   S qdS )Ntyper   data )	bot_eventmessagegetstrip)selfseg r;   8/home/dore/onebot/Bot_Ero/plugins/who_is_spy/__init__.py_first_text%   s
   zWhoIsSpyPlugin._first_textc                 C   sF   | j j}|rt|tr|dp|dpd| j j S d| j j S )Ncardnicknameu   用户)r5   sender
isinstancedictr7   user_id)r9   r@   r;   r;   r<   _sender_nickname+   s   "zWhoIsSpyPlugin._sender_nicknamerC   c                 G   s   | j d||d d S )Nsend_private_msg)rC   r6   )apicall_api)r9   rC   r6   r;   r;   r<   _send_private1   s   zWhoIsSpyPlugin._send_privater6   c                 C   s   |dkrdS |   }|sdS | }|d tv r)d| _|d | _|dd  | _dS | jjrL| jjrLt	| jj}|rL|d dvrLd	| _|d
 | _
|| _dS dS )Nr6   Fr   commandr	   Tphase)waiting	game_over
game_inputroom_id)r=   splitCOMMANDS_mode_cmd_argsr5   
is_privaterC   r   _game_room_id_input_text)r9   
event_type	text_bodypartsroomr;   r;   r<   match7   s&   

zWhoIsSpyPlugin.matchc                 C   sV   z| j dkr|   W d S | j dkr|   W d S W d S  ty*   td Y d S w )NrI   rM   u   WhoIsSpy 处理异常)rQ   _handle_command_handle_game_input	Exceptionr   	exception)r9   r;   r;   r<   handleO   s   

zWhoIsSpyPlugin.handlec           $         s	  | j }| j}| jj}|d u rd S | jj}|dkr|r|r"|d tvr4dt}| jt	d|  d S |d }d}t
|dkraztdtdt|d }W n ty`   | jt	d	 Y d S w z"t|||| | jt	d
| d  d| d  d  d W d S  ty } z| jt	t| W Y d }~d S d }~ww |dkrY|rY|s| jt	d d S |d  t }	|	s| jt	d d S |	d |kr| jt	d d S t||	d kr| jt	d d S t|	}
|
dkr| jt	|
 d S tdd |	d  D }t
|	d }| jt	d| d| d||  d |	d  D ]&\}}|d d kr7d!nd"}| t|t	|d#  d$| d%|d&   q*t| j|	 d S |d'kr|s|sn| jt	d( d S |d  |  }t ||}
| jt	|
 |
d)sd S t }	|	rt
|	d }| jd*|	d t	d+| d,  d-| d.|	d/  d0	gd1 d S d S |d2v rlt|}	|	s| jt	d3 d S |	d4  |  }t |}
| jt	|
 t }	|	rf|	d5 d6krh| jd*|	d t	d+| d7  d8gd1 d9d: |	d  D }|r+t| j|	t	d+| d;t
| d<g dd=l m!} ||	}|rj||	d>< d?|	d5< i |	d@< i |	dA< t"| j|	| t#|	 t$|	}t%| j|	d | t&  d S d S d S d S |dBkr3|rx|d nd  d }	 rt }	|	st|}	|	s| jt	dC d S dD|	d4  d-|	'dEdF d0dG|	d5  dHt
|	d  d.|	d/  g}|	d5 d6krtdId |	d  D }|(dJ| d.t
|	d   |(dK|	dL   |	d5 d6kr&t)|	d  dMdN dO}|r&|(dP |D ]!\}}||	d krdQndR}|(dS|d#  dT|dU  |  q| jt	dV| d S |dWkr|r|sH| jt	dX d S |d  t }	|	s]| jt	d d S |	d |krn| jt	d d S t||	d kr| * s| jt	dY d S |	'dEdZ}t&  | jt	d
| d  d[ d S |d\kr!|r!t+|}|s| jt	d] d S d^g}|D ]T}d_d`dadbdc}|'|d5 |d5 }t
|d  dd}|d5 d6krtded |d  D }| d.t
|d  df}|(dS|d4  dS|'dEdF dS| dS|  q| jt	dV| d S |dgkr|r|r^|d  t,|} fdhd:|D }|sN| jt	di  dj d S t-|d } | jt	|  d S t,|}|so| jt	dk d S dlg}t.|dD ]E\}!}t/0|'dmd1dn}"|'dod krd!nd"}#t
|'dg }|(dp|! dq|" dS|'d4dF dS|'dEdF dS| dr|# ds qw|(dR |(dt | jt	dV| d S d S d S )uNr,   r   u   、u;   用法：/创建游戏 <类型> [人数]
支持的类型：   r	      
   u   人数必须为数字（4-10）u   「u
   」房间 u    已创建（u+   人局）
请私聊机器人发送 /加入 u    加入
输入 /开始 u    开始游戏r'   u   用法：/开始 <房间号>u   房间不存在group_idu   该房间不属于本群
creator_idu   只有房主才能开始游戏okc                 s   s     | ]}|d  dkrdV  qdS )rolespyr	   Nr;   .0pr;   r;   r<   	<genexpr>   s    z1WhoIsSpyPlugin._handle_command.<locals>.<genexpr>playersu   游戏开始！本局 u    人参与，u    个卧底，u/    个平民
请查看私聊查看自己的词条rg   civilianu   平民u   卧底aliasu   ，你的角色：u   
你的词条：wordr&   u   用法：/加入 <房间号>u	   已加入send_group_msgu   玩家 u    已加入房间 u   （/max_playersu   ）)rd   r6   )r*   r+   u   你不在任何房间中rN   rJ   rK   u    已退出房间 u   （游戏中弃权出局）c                 S   s   g | ]}|d  r|qS )aliver;   ri   r;   r;   r<   
<listcomp>   s    z2WhoIsSpyPlugin._handle_command.<locals>.<listcomp>u    退出游戏，当前存活 u    人)r   _winnerrL   ready_descriptionsvotesr)   u'   房间不存在，或你不在房间中u   房间 	game_type?u	   状态：u	   人数：c                 s       | ]	}|d  rdV  qdS rt   r	   Nr;   ri   r;   r;   r<   rl          u	   存活：u	   轮次：	round_numc                 S   s   | d d fS )Nr	   ro   r;   )xr;   r;   r<   <lambda>   s    z0WhoIsSpyPlugin._handle_command.<locals>.<lambda>)keyu   玩家列表：u   （房主）r4   z   r?   
r(   u   用法：/放弃 <房间号>u'   只有房主或超管才能放弃游戏u   游戏u
    已解散r-   u   该群没有活跃房间u   该群活跃房间：u	   等待中u	   描述中u	   投票中u	   已结束)rK   playing_describeplaying_voterL   u   人c                 s   r{   r|   r;   ri   r;   r;   r<   rl   
  r}   u    存活r.   c                    s   g | ]
}|d   kr|qS )rN   r;   )rj   rridr;   r<   ru     s    u   未找到房间 u    的游戏记录u$   该群暂无已保存的游戏记录u   已保存的游戏记录：ended_atz%m-%d %H:%Mwinner[z] u   人  u   胜u-   输入 /游戏记录 <房间号> 查看详情)2rR   rS   r5   rC   rd   r   joinrF   send_msgr   lenmaxminint
ValueErrorr
   RuntimeErrorstrr   r   sumvaluesitemsrH   r   rD   r   
startswithrG   r   r   r   gamer   r   r"   r    r!   r   r7   appendsorted
super_userr   r#   r$   	enumerater   fromtimestampstrftime)$r9   cmdargsuidgid	types_strry   max_perZ   resultspiestotalpidrk   
role_labelnicknrt   r   r   nodeslinesrm   markerroomsr   	phase_maprJ   player_inforecordsr[   rX   itswinner_labelr;   r   r<   r\   X   s  
"&

&



&"2D

zWhoIsSpyPlugin._handle_commandc              	   C   s:  | j jd u rd S t| j}|s| jtd d S t| j j}| j}|d dkr]t	|||}t
|tr=| jt| d S | jtd |du r[t| j| t| t| j| d S d S |d dkrt|||}t
|try| jt| d S | jtd |du rt|}t| j|| t|}|r||d< d	|d< i |d
< i |d< t| j|| |d  D ]>\}}t| j||d |}	|	rddlm}
 g }|	D ]}|
|}|r||dd q|r| t|tdd|  qt| t|}t| j|d | t |d  d S t!| t"| j| d S d S d S )Nu   房间不存在或已解散rJ   r   u'   描述已记录，等待其他玩家...Tr   u'   投票已记录，等待其他玩家...rv   rL   rw   rx   rm   rg   r   )get_title_defnamer4   u   获得称号：r   rd   rN   )#r5   rC   r   rU   rF   r   r   r   rV   r   rA   r   r   r   r   r   r   r   r   r   r%   	dbmanagerplugins.titler   r   r7   rH   r   r   r"   r    r!   r   r   r   )r9   rZ   r   rX   r   
eliminatedr   r   rk   titlesr   namestiddr   r;   r;   r<   r]   (  sz   



z!WhoIsSpyPlugin._handle_game_inputN)r6   )__name__
__module____qualname__r   descriptionr   r=   rD   r   rH   boolr[   r`   r\   r]   r;   r;   r;   r<   r/       s    	 Qr/   N)/r   	core.baser   r   core.cqr   core.loggerr   
core.utilsr   core.database_managerr   rZ   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   relayr   r   r   r   r   r   r    r!   r"   r#   r$   r   r%   	frozensetrP   r/   r;   r;   r;   r<   <module>   s    ,$4