U
    ~b)                     @   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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$ee% Z&d	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Set   )PtyProtoNchatz#\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}c                       s   e Zd ZdZeeedd fddZe	e
 deedddd	Ze	e
 d
eeddddZe	e
 deeddddZeeeddddZ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  ZS )FactorioProtozL
    Protocol to interact with an OpenTTD server over a pseudoterminal.
    N)bridgeout_portinstance_cfgreturnc                    s.   |    td| _t |||I d H  d S NZfactorio)register_match_functionslogging	getLoggerloggersuperstart)selfr   r   r    	__class__ !/opt/tsbridge/plugins/factorio.pyr(      s    zFactorioProto.startz3 \[(LEAVE|JOIN)\] ([A-z]+) (?:joined|left) the game)linegroupsr!   c                    s<   |\}}|dkrt |t}n
t|t}| j|I d H  d S )NZJOIN)r	   CHANNEL_NAMEr
   r   put_message)r)   r.   r/   typenamemsgr,   r,   r-   
leave_join   s
    
zFactorioProto.leave_joinz \[KICK\] ([A-z]+) was kickedc                    s    | j t|d tI d H  d S Nr   )r   r1   r
   r0   r)   r.   r/   r,   r,   r-   kick)   s    zFactorioProto.kickz \[CHAT\] ([A-z]+): (.*)c                    s*   |\}}t ||t}| j|I d H  d S )N)r   r0   r   r1   )r)   r.   r/   usermessager4   r,   r,   r-   chat_message-   s    zFactorioProto.chat_message)
to_channelr:   metar!   c                    sx   | j d|  |j }|jdddddd}d| d|j d	| }| j| d	d
 | j
  d S )NzGot message to send: 
  	[] z: utf-8)r&   infofrom_instanceuppertextreplacer9   ptywriteencodeflush)r)   r<   r:   r=   	from_nameescaped_textoutputr,   r,   r-   send_message3   s    
zFactorioProto.send_message)r!   c                    s   | j d d S )Ns	   /players
)rK   rL   )r)   r,   r,   r-   determine_users=   s    zFactorioProto.determine_userszPlayers \((\d+)\):c                    s    t |d | _d| _t | _d S r6   )intnum_players_expectednum_players_gotsetclientsr7   r,   r,   r-   players_response@   s    zFactorioProto.players_responsez^  ([A-z]+)( \(online\))?c                    sV   |  j d7  _ |d r&| j|d  | j | jkrRt| jt}| j|I d H  d S )Nr   r   )rV   rX   addrU   r   r0   r   r1   )r)   r.   r/   ulistr,   r,   r-   player_responseF   s    zFactorioProto.player_responsec                    s   |j  }t|tr"|  I d H  t|tr^d|j   d|j d}| j| d	d t|t
rd|j   d|j d}| j| d	d | j  d S )NrC   rD   z joined.r>   rE   z left.)rG   rH   
isinstancer   rS   r	   r9   rK   rL   rM   r
   rN   )r)   r<   r:   r=   rO   rQ   r,   r,   r-   handle_service_messageP   s    



z$FactorioProto.handle_service_message)__name__
__module____qualname____doc__r   r   r   r(   r   matchdatestrGroupsr5   r8   r;   r   r   r   rR   rS   rY   r\   r   r^   __classcell__r,   r,   r*   r-   r      s   

	r   )r   r!   c                 C   s   |  dt d S r"   )add_protocolr   )r   r,   r,   r-   init\   s    ri   )*rb   
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   r   ptyprotor   r$   jsonshlexasyncioreior0   re   rf   rd   r   ri   r,   r,   r,   r-   <module>   s   @,G