o
    gyoj                      @   s   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 dl	m
Z d dlmZ ddlmZmZmZ dd	lmZmZ eG d
d deZdS )    N)Plugin)text)logger)register_plugin)character_store   )parse_eval_advantage_eval_disadvantage)GAME_SYSTEMSDEFAULT_GAME_SYSTEMc                   @   s   e Zd ZdZdZedejZdd Z	dd Z
defd	d
ZdedefddZdd ZdddZdedefddZdefddZdedefddZdedefddZdS ) 
TrpgPlugin	trpg_diceu?   跑团骰子系统：DND5E 检定、暗骰（规则可切换）z ^\.(?:rh(?:\s|$)|rc\s|r(?:\s|$))c                 C   sf   |dkrdS | j j}t|dkrdS |d }|ddkrdS |di dd }| j|d uS )	NmessageFr   r   typer   data )	bot_eventr   lengetstrip	PREFIX_REmatch)selfmessage_typer   segmsg r   7/home/dore/onebot/Bot_Ero/plugins/trpg_dice/__init__.pyr      s   zTrpgPlugin.matchc              
   C   s   zA| j jd d d  }|  }|dr| || W d S |dr1| |dd  | W d S |dr?| || W d S W d S  ty^ } z| j	
tt| W Y d }~d S d }~w tyt   td | j	
td	 Y d S w )
Nr   r   r   z.rhz.rc    z.ru   TRPG 插件处理异常u$   指令处理出错，请检查格式)r   r   r   _get_nickname
startswith_handle_dark_roll_dispatch_check_handle_roll
ValueErrorapisend_msgr   str	Exceptionr   	exception)r   rawnicknameer   r   r   handle$   s"   


"
zTrpgPlugin.handlereturnc                 C   s   t tdtS )NGAME_SYSTEM)getattrruntime_contextr   )r   r   r   r   _current_system8   s   zTrpgPlugin._current_systemargr,   c                 C   s4   |   }t|tt }t| |d }||| d S )Ncheck_handler)r3   r   r   r   r1   )r   r4   r,   systemcfghandlerr   r   r   r#   ;   s   zTrpgPlugin._dispatch_checkc                 C   sF   | j j}|rt|tr|dp|dpd| j j S d| j j S )Ncardr,   u   用户)r   sender
isinstancedictr   user_id)r   r:   r   r   r   r    A   s   "zTrpgPlugin._get_nicknamer   c                 C   s2   |rd| dnd}| | d| d| d| S )Nu   由于u   ，r   u
   掷出了 =r   )r   r,   
expr_labeldetailvaluereasonprefixr   r   r   _formatG   s   zTrpgPlugin._formatr+   c                 C   s   |dd    }|d d}|r|d nd}t|dkr |d nd}|s=td\}}| |d|||}	| jt|	 d S | |\}
}|
d u rJd S t|
\}}| |||||}	| jt|	 d S )N   r   r   r   D100)	lstripsplitr   r   rD   r&   r'   r   _resolve_character_expr)r   r+   r,   afterpartsexprrB   rA   r@   outresolvedr?   r   r   r   r$   K   s   zTrpgPlugin._handle_rollrL   c                    s  ddl m} ddlm}m}m}  fddt|t| D } fdd|D }|s0|s0  fS | jj}|du r:dS t	
|}	|	sSdd	lm}
 | jtd
|
  dS ||	} }t|tddD ]}||t|| }q`|D ]}||t|||  }qo| fS )uz   若表达式含角色属性/技能名，替换为数值。返回 (解析后表达式, 显示用原式) 或 (None, None)。r   )resolve_expression_values)
ATTRIBUTESSKILLSSKILL_ALIASESc                       g | ]}| v r|qS r   r   ).0nrL   r   r   
<listcomp>f       z6TrpgPlugin._resolve_character_expr.<locals>.<listcomp>c                    rS   r   r   )rT   arV   r   r   rW   g   rX   N)NN)WEB_TRPG_URLu1   你还没有角色卡，请到网页端创建：
T)keyreverse)plugins.trpg_char.characterrO   plugins.trpg_char.rulesrP   rQ   rR   listr   r=   storeget_currentplugins.trpg_charrZ   r&   r'   r   sortedr   replacer(   )r   rL   rO   rP   rQ   rR   namesaliasesr=   charrZ   valuesrN   namealiasr   rV   r   rI   a   s*   
z"TrpgPlugin._resolve_character_exprc              	   C   s  |  }|s| jtd dS d}|d dkr d}|dd }d}|r4|d d	v r4|d }|d
d }|s@| jtd dS d|}| |\}}|du rRdS |rVdnd}	dddd| }
| d| |	 |
 d}td|st|\}}|dkrd| nt	|}|dkrt
d}| d| d|d  | d|d |  }n5|dkrtd}| d| d|d  | d|d |  }ntd\}}| d| d| | d||  }| jt| dS |dkrtd| d\}}| | d| }nH|dkr!t
d}td| d\}}| d|d  d | d|d |  }n!td}td| d\}}| d!|d  d | d|d |  }| jt| dS )"u@   DND d20 检定：.rc [优势|劣势] <属性|表达式> [豁免]u8   格式：.rc [优势|劣势] <属性|表达式> [豁免]NFu   豁免Tnormalr   )   优势   劣势r    u   检定u   (优势)u   (劣势)r   )rm   rn   rl   u   的z: u   [dbp%#优势劣势]+rm      d20r>   r@   rA   rn   zd20+()(u
   d20优势=z + u
   d20劣势=)rH   r&   r'   r   joinrI   researchr   r(   r	   r
   )r   r4   r,   rK   is_savemoderL   rN   labelsuffixmode_strheadmod_mod_stradvrM   rA   r@   
rest_valuerest_detailr   r   r   _handle_dnd_check~   s\   
,,"
(&zTrpgPlugin._handle_dnd_checkc                 C   s   |dd    }|d d}|r|d nd}t|dkr |d nd}| jj}|d u r4| jtd d S |s?td\}}	d}
n| 	|\}}
|d u rLd S t|\}}	| jtd | 
||
|	||}| jjrq| jt| d S d S )N   r   r   r   u   暗骰只能在群聊中使用rF   u   悄悄掷出骰子)rG   rH   r   r   group_idr&   r'   r   r   rI   rD   r=   send_private_msg)r   r+   r,   rJ   rK   rL   rB   r   rA   r@   r?   rN   fullr   r   r   r"      s(   zTrpgPlugin._handle_dark_rollN)r   )__name__
__module____qualname__ri   descriptionrv   compile
IGNORECASEr   r   r.   r(   r3   r#   r    rD   r$   rI   r   r"   r   r   r   r   r      s"    
>r   )rv   	core.baser   core.cqr   core.loggerr   
core.utilsr   corer   r`   core.contextcontextr2   dicer   r	   r
   gamesr   r   r   r   r   r   r   <module>   s    