U
    	{_                     @   s   d 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mZmZ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 ddlmZ ddlZddlZddlZddl Z ddl!Z!ddl"Z"dZ#d	Z$ee% Z&G d
d deZ'eddddZ(dS )z
* depends: imgflt
    )ProtoOutPortMessage
AttachmentChannelConfigPhotoJoinMessagePartMessageServiceMessageUserRequestUserListMetadataMiscServiceMessage)Bridge)MappingAnyCallable	CoroutineSequenceListDictOptional   )PtyProtoNchatz[A-Za-z0-9_- \#]+c                       s   e Zd ZdZeeedd fddZe	de
edddd	Ze	d
e
eddddZe	de
eddddZe	de
eddddZeeeddddZeeeddddZ  ZS )OpenTTDProtozL
    Protocol to interact with an OpenTTD server over a pseudoterminal.
    N)bridgeout_portinstance_cfgreturnc                    sJ   t d| _|   t |||I d H  | | _i | _d| _	g | _
d S )Nopenttdr   )logging	getLoggerloggerregister_match_functionssuperstartget_attachment_hostimg_hostonlineclients_responses_gotclients)selfr   r   r   	__class__  /opt/tsbridge/plugins/openttd.pyr'      s    
zOpenTTDProto.startz\[All\] ([^:]+): (.+))linegroupsr    c                    sB   |\}}| j d| d|  t||t}| j|I d H  d S )NzMessage from : )r$   infor   CHANNEL_NAMEr   put_message)r-   r2   r3   usermessagemsgr0   r0   r1   r9   *   s    zOpenTTDProto.messagez#Current/maximum (.+):\s+(\d+)/(\d+)c                    s@   |\}}}|dkr(| j d | j   t|| j|< d| _d S )NZ
spectatorss   clients
r   )ptywriteflushintr*   r+   )r-   r2   r3   typer*   _r0   r0   r1   info_response3   s    

zOpenTTDProto.info_responsez9^Client #\d+  name: '(.+)'  company: \d+  IP: [a-z0-9.]+$c                    sX   |  j d7  _ | j|d  | j | jdtdkrTt| jt}| j	|I d H  d S )Nr   r   r,   inf)
r+   r,   appendr*   getfloatr   r6   r   r7   )r-   r2   r3   ulistr0   r0   r1   clients_response?   s
    zOpenTTDProto.clients_responsezE^\*\*\* (.+) has (joined|left) the game \((?:Client \#\d+|leaving)\)$c                    s^   |\}}| j |d   d|d   |dkr>t|t}n
t|t}| j|I d H  d S )Nr   r4   r   joined)r$   r5   titler	   r6   r
   r   r7   )r-   r2   r3   namer?   r:   r0   r0   r1   	join_partH   s    "
zOpenTTDProto.join_part)
to_channelr9   metar    c                    s   | j d|  |j }|jdddddddd}d	| d
|j d| }| jd| d	d | j
  d S )NzGot message to send: "z\"
  	[] r4   say ""
utf-8)r$   r5   from_instanceuppertextreplacer8   r;   r<   encoder=   )r-   rL   r9   rM   	from_nameZescaped_textoutputr0   r0   r1   send_messageT   s    
&zOpenTTDProto.send_messagec                    s   |j  }t|tr | jd t|tr^d|j   d|j d}| jd| dd t|t	rd|j   d|j d}| jd| dd | j
  d S )	Ns   info
rT   rU   z joined.rV   rW   rX   z left.)rY   rZ   
isinstancer   r;   r<   r	   r8   r]   r
   r=   )r-   rL   r9   rM   r^   r_   r0   r0   r1   handle_service_message^   s    



z#OpenTTDProto.handle_service_message)__name__
__module____qualname____doc__r   r   r   r'   r   matchstrGroupsr9   rA   rG   rK   r   r   r   r`   r   rb   __classcell__r0   r0   r.   r1   r      s   
r   )r   r    c                 C   s   |  dt d S )Nr!   )add_protocolr   )r   r0   r0   r1   initj   s    rl   ))rf   
core.typesr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   core.bridger   typingr   r   r   r   r   r   r   r   ptyprotor   r"   jsonshlexasyncioreior6   USERNAMErh   ri   r   rl   r0   r0   r0   r1   <module>   s   @(U