o
    Blj$                  	   @   sB  d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlmZ de	de
e	 fdd	Zd)dede	de
e	 defddZdede	fddZdede	fddZdede	fddZdede	defddZdede	defddZde	de
e	 fddZdedede
e	 fd d!Zde	fd"d#Zdede
e	 fd$d%Zd&e	defd'd(ZdS )*    N)datetime)text)
ApiWrapper)loggerroomreturnc                 C   s   dd | d   D S )Nc                 S   s   g | ]}|d  r|qS )alive .0pr	   r	   5/home/dore/onebot/Bot_Ero/plugins/who_is_spy/relay.py
<listcomp>   s    z_alive_list.<locals>.<listcomp>players)values)r   r	   r	   r   _alive_list
   s   r   Fapimessageinclude_deadc              	   C   sT   |d   D ]!}|s|d sqz| dt|d |d W q ty'   Y qw d S )Nr   r   send_private_msguser_idr   r   )r   call_apiint	Exception)r   r   r   r   r   r	   r	   r   	broadcast   s   
r   c                 C   sv   |d }t |}d|d  dg}|D ]}||d d}||d  d| d	 qtd
|}t| ||g d S )Nready_descriptions   第	round_numu   轮 描述汇总：r   u   （未描述）alias ""
)r   getappendr   joinr   )r   r   descsr   linesr   txtmsgr	   r	   r   broadcast_descriptions   s   r*   c                 C   F   t |}ddd |D }td|d  d| }t| ||g d S )N  c                 s       | ]}|d   V  qdS r   Nr	   r
   r	   r	   r   	<genexpr>(       z.broadcast_vote_instructions.<locals>.<genexpr>r   r   ue   轮 投票阶段
请投票选出卧底，发送代号即可（如 1 号就回复 1）
存活玩家：r   r%   r   r   r   r   r   namesr)   r	   r	   r   broadcast_vote_instructions&      r4   c                 C   r+   )Nr,   c                 s   r-   r.   r	   r
   r	   r	   r   r/   3   r0   z2broadcast_describe_instructions.<locals>.<genexpr>r   r   u]   轮 描述阶段
请用一句话描述你的词条（不能直接说出词）
存活玩家：r1   r2   r	   r	   r   broadcast_describe_instructions1   r5   r6   eliminated_uidc                 C   s  i }|d   D ]}||dd ||< qd|d  dg}|d   D ]#}||d d}|d |kr6d	nd
}||d  d| d|  q$|d
 |d | }	||	d  d td|}
t| ||
gdd z| dt|tdgd W d S  ty   Y d S w )Nvotesr      r   r   u   轮 投票结果：r   r   u    ← 出局 r       票u    被投票出局！r"   Tr   r   uH   你被投票出局！你已无法继续发言，请等待游戏结束。r   )	r   r#   r$   r   r%   r   r   r   r   )r   r   r7   vote_countsvr'   r   cntmarkerelimr)   r	   r	   r   broadcast_vote_result<   s*    
rC   winnerc           
      C   s   |dkrdnd}d| ddg}t dd |d	  D d
d d}|d |D ]$\}}}|d dkr5dnd}	|| d|d  d|	 d|d  d q(t| |td|gdd d S )Ncivilian   平民   卧底u   游戏结束！	   胜利！r:   c                 s   s&    | ]\}}|d  t ||fV  qdS r.   r   )r   pidr   r	   r	   r   r/   X   s   $ z&broadcast_game_over.<locals>.<genexpr>r   c                 S      t | d S )Nr9   rI   xr	   r	   r   <lambda>Y       z%broadcast_game_over.<locals>.<lambda>keyu   身份揭晓：roler;   nickname -  - "wordr!   r"   Tr=   )sorteditemsr$   r   r   r%   )
r   r   rD   winner_labelr'   pid_to_aliasr   uidr   
role_labelr	   r	   r   broadcast_game_overT   s   
, r]   c           
      C   s  g }| dddtdgdd ddd	 t| d
  dd dD }| dddtd| gdd | dddtd| d  d| d  gdd | d D ]t}|d }| dddtd| dgdd |di  D ]"\}}| d
 |i }| d||ddtd| gdd qu|d}|r| d
 |i }| dddt|dd d|ddkrdnd  gdd qT| d!d"krd nd}	| dddt|	 d#gdd |S )$Nnode0u   系统u   谁是卧底 游戏记录)r   rS   content)typedatar"   c                 s   s*    | ]\}}|d   d|d  V  qdS )r   r;   rS   Nr	   )r   _r   r	   r	   r   r/   l   s
    
z&build_forward_nodes.<locals>.<genexpr>r   c                 S   rK   )Nr   rI   rL   r	   r	   r   rN   n   rO   z%build_forward_nodes.<locals>.<lambda>rP   u   玩家列表：
   平民词条：civilian_wordu       卧底词条：spy_wordhistoryr      ──── 第   轮 ────descriptionsr   ?u	   描述：
eliminated
    出局 - rR   spyrG   rF   _winnerrE   rH   )r$   r   r%   rW   rX   r#   )
r   nodesp_inforecrnr[   descr   rB   rY   r	   r	   r   build_forward_nodesb   s~   



,ru   group_idrp   c                 C   s   |  d||d d S )Nsend_group_forward_msg)rv   messages)r   )r   rv   rp   r	   r	   r   send_forward_to_group   s   ry   c                 C   s  | d |  dd| d |  ddt  |  dd|  d	d|  d
ddd | d  D |  dg d
}d| d  }tj|dd | d| d  d}z%t|ddd}tj	||ddd W d    W d S 1 slw   Y  W d S  t
y   td Y d S w )Nroom_id	game_typerG   rv   
created_atr   ro   r:   re   rf   c                 S   s0   g | ]}|d  |d |d |d |d dqS )r   rS   r   rR   rV   )r   rS   r   rR   rV   r	   r
   r	   r	   r   r      s    z$save_game_record.<locals>.<listcomp>r   rg   )
rz   r{   rv   r|   ended_atrD   re   rf   r   rg   server_data/game_records/T)exist_ok/.jsonwutf-8encodingF   )ensure_asciiindentu   保存游戏记录失败)r#   r   now	timestampr   osmakedirsopenjsondumpr   r   	exception)r   recordbasepathfr	   r	   r   save_game_record   s.   







&r   c              	   C   s   d|  }t j|sg S g }t |D ]A}|dsq| d| }z!t|ddd}|t| W d    n1 s>w   Y  W q t	yU   t
d|  Y qw |jdd	 d
d |S )Nr~   r   r   rr   r   u   读取游戏记录失败: c                 S   s   |  ddS )Nr}   r   )r#   )r   r	   r	   r   rN      rO   z#get_saved_records.<locals>.<lambda>T)rQ   reverse)r   r   isdirlistdirendswithr   r$   r   loadr   r   r   sort)rv   r   recordsfnamer   r   r	   r	   r   get_saved_records   s$   

r   rb   c                    s~  t | ddd}| ddkrdnd}t| dg }d	| d
d d| dd d| d| d| dd| dd d| dd ddg	}| dg D ]+}|ddkradnd}|d|dd d|dd d| d|dd d 	 qV|d | d!g D ]}|d"d}|d#| d$ d%d& | dg D }	|d'i  D ]\}
}|	|
d}|d| d(| d  q|d)d |d*i }|rg }|	 D ]\}
}||
d}|
 krd+nd}|| d| d,|  q|d-d|   r4t fd.d/| dg D i }|d0|dd d1|dd2kr/dnd  |d qd3|S )4Nr}   r   z%Y-%m-%d %H:%MrD   rE   rF   rG   r   u   游戏记录：rz   rk   u   游戏类型：r{   u   结束时间：u   参与人数：u   胜负结果：u   胜利rd   re   u   卧底词条：rf   r:   u   玩家身份：rR   r,   r   r;   rS   rT   rU   rV   r!   rg   r   rh   ri   c                 S   s   i | ]	}|d  |d qS )r   r   r	   r
   r	   r	   r   
<dictcomp>   s    z)format_record_summary.<locals>.<dictcomp>rj   r    rl   r>   u	    (出局)r<   u     投票结果：c                 3   s     | ]}|d   kr|V  qdS )r   Nr	   )r   rM   rB   r	   r   r/     s    z(format_record_summary.<locals>.<genexpr>u     → rm   rn   r"   )	r   fromtimestampr#   strftimelenr$   rX   r%   next)rb   tsrY   nr'   r   r\   rr   rs   uid_to_aliasr[   rt   r   countspartscrA   r	   r   r   format_record_summary   sL   
>
 2
r   )F)r   r   r   core.cqr   core.apir   core.loggerr   dictlistr   boolr   r*   r4   r6   strrC   r]   ru   r   ry   r   r   r   r	   r	   r	   r   <module>   s$     I