o
    /IojD                     @   s   d dl Z d dlZd dlZd dlZ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mZ d dlmZ d dlmZ eG dd	 d	eZdS )
    N)datetime)PluginBOT_QQ)text)logger)register_plugindownload_image)character_storec                   @   s   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 Z
defddZdefddZdd Zdd Zdd Zdd Zdd ZdefddZdd  Zd!ed"efd#d$Zd%S )&TrpgSessionPlugintrpg_sessionu1   跑团记录：开始/结束/导出/列表/查看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   :/home/dore/onebot/Bot_Ero/plugins/trpg_session/__init__.py_first_text   s
   zTrpgSessionPlugin._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   用户)r   sender
isinstancedictr   user_id)r   r   r   r   r   _get_sender_nickname   s   "z&TrpgSessionPlugin._get_sender_nicknamec                 C   s`   |dkrdS |   }|sdS |ds|ds|drdS | jj}|d ur.t|r.dS dS )Nr   F   /跑团记录.dm.obT)r   
startswithr   group_idruntime_contextis_group_recording)r   message_typemsgr$   r   r   r   match    s   zTrpgSessionPlugin.matchc                 C   s   zC|   }|dr| | W d S |dr| d W d S |dr,| d W d S | jjr>t| jjrA|   W d S W d S W d S  t	yR   t
d Y d S w )Nr    r!   dmr"   obu   TrpgSession 处理异常)r   r#   _route_command_handle_set_roler   r$   r%   r&   _record_user_message	Exceptionr   	exception)r   r(   r   r   r   handle-   s   


zTrpgSessionPlugin.handler(   c                 C   s   |  }t|dkr|d nd}|dkr|   d S |dkr$|   d S |dkr.|   d S |dkr8|   d S |d dkrJ|d	ksD|sJ|   d S |d dkrb|rb|d
rb| |dd   d S |   d S )N   r   u   开始u   强制开始u   结束u   导出r   r    u   列表#)	splitlen_handle_start_handle_force_start_handle_stop_handle_export_handle_listr#   _handle_view)r   r(   partssubr   r   r   r,   =   s   z TrpgSessionPlugin._route_commandrolec                 C   s   | j j}|d u r| jtd d S | j jrt| j jnd}|tjvr(i tj|< |tj| |< t	|}|r@d|v r@||d |< |dkrFdnd}| jtd| 
  d|  d S )	Nu$   角色设置只能在群聊中使用0rolesr*   DMu	   观察者u   已将 u    设为)r   r$   apisend_msgr   r   strr%   group_rolesget_recording_sessionr   )r   r>   r$   r   sessionlabelr   r   r   r-   R   s   


$z"TrpgSessionPlugin._handle_set_rolec                 C   s   | j j}|d u r| jtd d S t|r!| jtd d S t|}|r2| jtd d S | jtd ttj	
|i }tj t g i |dtj|< W d    d S 1 s^w   Y  d S )N$   跑团记录只能在群聊中使用   当前已在录制中u   上次记录尚未导出！请先使用 /跑团记录 导出 保存记录，或使用 /跑团记录 强制开始 放弃并重新开始u   跑团记录已开始——startmessagesparticipantsr@   )r   r$   rB   rC   r   r%   r&   get_last_completedr   rE   r   recording_lockr   nowrecording_sessions)r   r$   
unexportedsession_rolesr   r   r   r6   e   s,   

"zTrpgSessionPlugin._handle_startc                 C   s   | j j}|d u r| jtd d S t|r!| jtd d S t| | jtd ttj	
|i }tj t g i |dtj|< W d    d S 1 sRw   Y  d S )NrI   rJ   u3   已丢弃上次记录，跑团记录已开始——rK   )r   r$   rB   rC   r   r%   r&   pop_last_completedr   rE   r   rP   r   rQ   rR   )r   r$   rT   r   r   r   r7      s"   

"z%TrpgSessionPlugin._handle_force_startc              	   C   s  | j j}|d u r| jtd d S t|s!| jtd d S t|}|s2| jtd d S t	 }|d }|j
dd d tj" tj|d  |d |||d	 |d
i dtj|< W d    n1 sjw   Y  |s{| jtd d S | || | jtd d S )NrI   u   当前没有进行中的记录u$   内部错误：找不到录制会话rM   c                 S   s$   |  dd|  ddkrdfS dfS )Ntimer   r   botr2   r   )mr   r   r   <lambda>   s   $ z0TrpgSessionPlugin._handle_stop.<locals>.<lambda>)keyrL   rN   r@   )rL   endrM   rN   r@   u1   跑团记录已结束——
（无记录内容）u   跑团记录已结束——)r   r$   rB   rC   r   r%   r&   rF   r   rQ   sortrP   rR   popr   last_completed_send_forward)r   r$   rG   end_timerM   r   r   r   r8      s8   



zTrpgSessionPlugin._handle_stopc              
      s  | j j}|d u r| jtd d S t|r!| jtd d S t|}|s2| jtd d S |d d}d| d| }| d}zt	j
|d	d
 |di  t|d  }tdd |D sp|dttd |D ]}|d } |d|d< qr|d d|d d|d}	t| dddd}
tj|	|
ddd W d    n1 sw   Y  dtdtf fd d!}d"d#|	d  d$|	d  d%g}|D ]9}|d } |d}|||d&  d'| d( }|ttkr|d)7 }|r|d*|  d+7 }|d,|  q|d |d- |d d.}i }|d/ D ]}t|d0 d1}|dd}|d&d2}|rI||vrIt|||< ||}|r]|d3d d4| d(}|d5| d6|| | d7 |d8g D ]}|d9d}|d:i }|d;kr||d;d qs|d<kr|d=d}|r|d>7 }t	j|d> pd?}d@|dA| }| d| }z$| j|}|rt|| |dB| d( n	|dC| d+ W qs ty   |dC| d+ Y qsw qs|dDkr|dEd}|dF|  qs|d q"t| dGddd}
|
dH | W d    n	1 s2w   Y  | jtdI| dJt!|d/  dK W d S  typ } zt"#dL | jtdM|  W Y d }~d S d }~ww )NNrI   u*   录制中无法导出，请先结束录制u   没有可导出的记录rL   %Y-%m-%d_%H-%M-%Sserver_data/trpg_records//z/imgsT)exist_okr@   rN   c                 s   s     | ]}|d  t tkV  qdS )r   N)rD   r   .0pr   r   r   	<genexpr>   s    z3TrpgSessionPlugin._handle_export.<locals>.<genexpr>u   小埃同学r   r   r   r   r>   z%Y-%m-%d %H:%M:%Sr\   )rL   r\   rN   
/meta.jsonwutf-8encodingF   )ensure_asciiindentuidr   c                    s(     | d}|dkrdS |dkrdS dS )Nr   r*   z[DM] r+   z[OB] rX   )rs   rr@   r   r   _role_prefix   s   z6TrpgSessionPlugin._handle_export.<locals>._role_prefixu   # 跑团记录
u   - 开始时间：u   - 结束时间：u   - 参与人：r   z ()z Botz []z  - z---r   rM   rV   z%H:%M:%Su   未知	char_name([z] **z**:r   r   r   r   imagefiler2   z.jpgimg_04du   ![图片](imgs/u	   [图片: atqq@z
/record.md
u   导出成功：u   ，共 u
    条消息u   导出记录失败u   导出失败：)$r   r$   rB   rC   r   r%   r&   rU   strftimeosmakedirsr   listvaluesanyappendrD   r   openjsondumpupperr   fromtimestampstoreget_currentpathsplitextget_image_urlr   r/   writejoinr5   r   r0   )r   r$   	recording	start_strfolder_nameimgs_dirrN   rh   rs   metafrv   md_linesrt   rH   img_counter
char_cacheentrytsr   charr   seg_typeseg_data	file_nameext
local_name
local_pathurlr   er   ru   r   r9      s   


	



 



,
$z TrpgSessionPlugin._handle_exportc              
      s
  | j j}|d u r| jtd d S d|  tj s'| jtd d S t fddt	 D }|sA| jtd d S dg}t
|dD ].\}}zt|d}|d	| d
|d  W qI tyw   |d	| d
|  Y qIw | jtd| d S )NrI   rc      暂无保存的跑团记录c                    &   g | ]}t j  d | r|qS rd   r   r   isdirrg   drec_dirr   r   
<listcomp>F     & z2TrpgSessionPlugin._handle_list.<locals>.<listcomp>u   已保存的跑团记录：r2   rb   r{   z] z%Y-%m-%d %H:%Mr   )r   r$   rB   rC   r   r   r   r   sortedlistdir	enumerater   strptimer   r   
ValueErrorr   )r   r$   folderslinesifolderdtr   r   r   r:   ;  s*   
 zTrpgSessionPlugin._handle_list	index_strc                    s  | j j}|d u r| jtd d S zt|}W n ty*   | jtd Y d S w d|  tj	 s@| jtd d S t
 fddt D }|dk sX|t|krg| jtdt|  d S   d	||d   d
}tj|s| jtd d S zt|ddd}t|}W d    n1 sw   Y  W n ty   | jtd Y d S w d| d|dd d|dd g}|dg }	|	rdd |	D }
|dd|
  | jtd| d S )NrI   u6   请输入有效编号，格式：/跑团记录 #数字rc   r   c                    r   r   r   r   r   r   r   r   g  r   z2TrpgSessionPlugin._handle_view.<locals>.<listcomp>r2   u   编号无效，有效范围 1-rd   rk   u   无法读取记录信息rt   rm   rn   u   记录文件损坏u   跑团记录 #u   开始时间：rL   ?u   结束时间：r\   rN   c                 S   s   g | ]}| d dqS )r   r   rX   rf   r   r   r   r     s    u   参与人：z, r   )r   r$   rB   rC   r   intr   r   r   r   r   r   r5   isfiler   r   loadr/   r   r   r   )r   r   r$   idxr   	meta_pathr   r   headerrN   namesr   r   r   r;   V  sP   
zTrpgSessionPlugin._handle_viewc                 C   s   | j j}|d u r
d S | j jr ddlm} t| j jt|kr d S t|}|s)d S | j jr3t| j jnd}|  }d||| j j	| j j
pHtt

 d}tj' |d | ||d vrm||d|d |< W d    d S W d    d S 1 sxw   Y  d S )	Nr   )r   r?   user)r   r   r   r   rV   rM   rN   rj   )r   r$   r   	core.baser   rD   r%   rF   r   r   rV   r   rP   r   )r   r$   r   rG   r   r   r   r   r   r   r.     s2   
"z&TrpgSessionPlugin._record_user_messager$   rM   c              
   C   s^   g }|D ]}| d|dd|dd|dg dd q|r-| jd	||d
 d S d S )Nnoder   r?   r   r   r   )r   r   content)r   r   send_group_forward_msg)r$   rM   )r   r   rB   call_api)r   r$   rM   nodesr   r   r   r   r`     s   



	zTrpgSessionPlugin._send_forwardN)__name__
__module____qualname__namedescriptionrD   r   r   boolr)   r1   r,   r-   r6   r7   r8   r9   r:   r;   r.   r   r   r`   r   r   r   r   r
      s"    (x0 r
   )r   r   rV   rer   r   r   r   core.cqr   core.loggerr   
core.utilsr   r   corer	   r   core.contextcontextr%   r
   r   r   r   r   <module>   s    