U
    n5{i$  ã                   @   sÀ   d Z ddlmZ ddlmZmZmZ ddlmZ ddl	m
Z
mZmZ ddlmZ ddlmZ G dd	„ d	e
jƒZeejƒG d
d„ de
jƒƒZG dd„ de
jejƒZeejƒG dd„ de
jƒƒZdS )z%
IRC support for Instance Messenger.
é    )Úimplementer)ÚdeferÚprotocolÚreactor)Úsucceed)ÚbasesupportÚ
interfacesÚlocals©ÚONLINE)Úircc                   @   s6   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zdd
d„Zd	S )Ú	IRCPersonc                 C   s*   | j jd krtj‚| j j d| j ¡ d S )NzWHOIS %s©ÚaccountÚclientr	   ÚOfflineErrorZsendLineÚname©Úself© r   ú?/tmp/pip-unpacked-wheel-mnhg7r0q/twisted/words/im/ircsupport.pyÚimperson_whois   s    zIRCPerson.imperson_whoisc                 C   s   t S ©Nr
   r   r   r   r   ÚisOnline   s    zIRCPerson.isOnlinec                 C   s   t S r   r
   r   r   r   r   Ú	getStatus   s    zIRCPerson.getStatusc                 C   s   || _ | j ¡  | ¡ d S r   )ÚstatusÚchatÚgetContactsListZsetContactStatus)r   r   r   r   r   Ú	setStatus   s    zIRCPerson.setStatusNc                 C   sj   | j jd krtj‚| d¡D ]D}|rN| dd ¡dkrN| j j | jd|fg¡ q| j j | j|¡ qt	|ƒS )NÚ
ÚstyleÚemoteÚACTION)
r   r   r	   r   ÚsplitÚgetÚctcpMakeQueryr   Úmsgr   ©r   ÚtextÚmetaÚliner   r   r   ÚsendMessage"   s    zIRCPerson.sendMessage)N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r+   r   r   r   r   r      s
   r   c                   @   s8   e Zd Zdd„ Zdd„ Zdd„ Zi fdd„Zd	d
„ ZdS )ÚIRCGroupc                 C   s   d S r   r   r   r   r   r   Úimgroup_testAction/   s    zIRCGroup.imgroup_testActionc                 C   s>   | j jd krtj‚d}| j j d| j› d|j› d|› �¡ d S )Nzfor great justice!zKICK #ú z :r   )r   ÚtargetÚreasonr   r   r   Úimtarget_kick2   s    zIRCGroup.imtarget_kickc                 C   s(   | j jd krtj‚| j j | j|¡ d S r   )r   r   r	   r   Útopicr   )r   r5   r   r   r   ÚsetTopic9   s    zIRCGroup.setTopicc                 C   sp   | j jd krtj‚|rF| dd ¡dkrF| j j | jd|fg¡ t|ƒS | d¡D ]}| j j 	| j|¡ qPt|ƒS )Nr    r!   r"   r   )
r   r   r	   r   r$   r%   r   r   r#   Zsayr'   r   r   r   ÚsendGroupMessage>   s    zIRCGroup.sendGroupMessagec                 C   s8   | j jd krtj‚| j j | j¡ | j j | jd¡ d S ©Né   )r   r   r	   r   Úleaver   ÚgetGroupConversationr   r   r   r   r:   I   s    zIRCGroup.leaveN)r,   r-   r.   r0   r4   r6   r7   r:   r   r   r   r   r/   -   s
   r/   c                   @   sº   e Zd Zd-dd„Zd.dd„Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
d/dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ ZdS )0ÚIRCProtoNc                 C   s.   t j | |||¡ i | _i | _i | _i | _d S r   )r   ÚAbstractClientMixinÚ__init__Ú_namrepliesÚ	_ingroupsZ_groupsÚ_topics)r   r   ÚchatuiÚlogonDeferredr   r   r   r>   Q   s
    zIRCProto.__init__r   c                 C   s"   |  ¡ }| jj| j || ¡|d�S )N)Z
stayHidden)Úlowerr   r;   ÚgetGroup)r   r   Zhider   r   r   r;   X   s
     ÿzIRCProto.getGroupConversationc                 C   s   | j  || ¡S r   )r   Ú	getPerson©r   r   r   r   r   rF   ^   s    zIRCProto.getPersonc                 C   sš   zpd| _ | jj| _| jj| _d| _tj | ¡ | jj	D ]}|  
|¡ q6d| j_| jd k	rd| j | ¡ | j ¡  W n$ tk
r”   dd l}| ¡  Y nX d S )NTzTwisted-IM userr9   r   )ZperformLoginr   ÚusernameÚnicknameÚpasswordZrealnamer   Ú	IRCClientÚconnectionMadeÚchannelsÚ	joinGroupZ	_isOnlineZ_logonDeferredÚcallbackr   r   ÚBaseExceptionÚ	tracebackÚ	print_exc)r   ÚchannelrQ   r   r   r   rL   a   s    


zIRCProto.connectionMadec                 C   s"   || _ d| | _tj | |¡ d S )Nz%s (IRC))r   ÚaccountNamer   rK   ÚsetNick)r   Znickr   r   r   rU   v   s    
zIRCProto.setNickc                 C   s    | j  | j  |dd… | ¡d¡S )z9
        Called when I am kicked from a channel.
        r9   N)r   r;   rE   )r   rS   ÚkickerÚmessager   r   r   Ú
kickedFrom{   s    zIRCProto.kickedFromc                 C   s   d S r   r   )r   ZkickeerS   rV   rW   r   r   r   Ú
userKicked�   s    zIRCProto.userKickedc                 C   s   |   |||ddi¡ d S )NZdontAutoRespondr9   )Úprivmsg)r   rH   rS   rW   r   r   r   Únoticed„   s    zIRCProto.noticedc                 C   sx   |d kri }|  dd¡d }|| jkr*d S |d dkrZ|dd … }|  |¡ |||¡ d S | j |  |¡¡ ||¡ d S )Nú!r9   r   ú#©r#   r   r;   ZshowGroupMessager   ZgetConversationrF   ZshowMessage)r   rH   rS   rW   ÚmetadataÚgroupr   r   r   rZ   ‡   s"    

  ÿ ÿzIRCProto.privmsgc                 C   st   |  dd¡d }|| jkrd S ddi}|d dkrV|dd … }|  |¡ |||¡ d S | j |  |¡¡ ||¡ d S )Nr\   r9   r   r    r!   r]   r^   )r   rH   rS   r!   r)   r`   r   r   r   Úaction—   s    
zIRCProto.actionc              	   C   sÀ   |d dd…   ¡ }|d  ¡ }tt|ƒƒD ]*}|| d dkr,|| dd… ||< q0q,|| jkrlg | j|< | j|  |¡ |D ]:}z| j|  |¡ W q€ tk
r¸   |g| j|< Y q€X q€dS )zƒ
        RPL_NAMREPLY
        >> NAMES #bnl
        << :Arlington.VA.US.Undernet.Org 353 z3p = #bnl :pSwede Dan-- SkOyg AG
        é   r9   Né   r   )ú@ú+)	rD   r#   ÚrangeÚlenr?   Úextendr@   ÚappendrP   )r   ÚprefixÚparamsr`   ZusersÚuirI   r   r   r   Úirc_RPL_NAMREPLY¢   s    

zIRCProto.irc_RPL_NAMREPLYc                 C   s:   |d dd … }|   |¡ | j| ¡  ¡ | j| ¡ = d S r8   )r;   ZsetGroupMembersr?   rD   ©r   rj   rk   r`   r   r   r   Úirc_RPL_ENDOFNAMES¶   s
    
ÿzIRCProto.irc_RPL_ENDOFNAMESc                 C   s   |d | j |d dd … < d S )Nrb   r9   )rA   )r   rj   rk   r   r   r   Úirc_RPL_TOPIC½   s    zIRCProto.irc_RPL_TOPICc                 C   s8   |d dd … }|   |¡ | j| |d ¡ | j|= d S )Nr9   rb   )r;   r6   rA   rn   r   r   r   Úirc_333À   s    zIRCProto.irc_333c                 C   s<   |  d¡d }|d dd … }|d }|  |¡ ||¡ d S ©Nr\   r   r9   )r#   r;   r6   )r   rj   rk   rI   r`   r5   r   r   r   Ú	irc_TOPICÅ   s    zIRCProto.irc_TOPICc                 C   sv   |  d¡d }|d dd …  ¡ }|| jkrrz| j|  |¡ W n  tk
r`   |g| j|< Y nX |  |¡ |¡ d S rr   )r#   rD   rI   r@   ri   rP   r;   ZmemberJoined©r   rj   rk   rI   r`   r   r   r   Úirc_JOINË   s    
zIRCProto.irc_JOINc                 C   s^   |  d¡d }|d dd …  ¡ }|| jkrZ|| j| krZ| j|  |¡ |  |¡ |¡ d S rr   )r#   rD   rI   r@   Úremover;   Ú
memberLeftrt   r   r   r   Úirc_PARTÕ   s    
zIRCProto.irc_PARTc                 C   sF   |  d¡d }|| jkrB| j| D ]}|  |¡ |¡ q"g | j|< d S ©Nr\   r   )r#   r@   r;   rw   rt   r   r   r   Úirc_QUITÝ   s
    
zIRCProto.irc_QUITc                 C   sb   |  d¡d }|d }|| jkr$d S | j| D ]}|  |¡ ||¡ q.| j| | j|< | j|= d S ry   )r#   r@   r;   ZmemberChangedNick)r   rj   rk   ZfromNickZtoNickr`   r   r   r   Úirc_NICKä   s    
zIRCProto.irc_NICKc                 C   s   d S r   r   )r   rj   Úcommandrk   r   r   r   Úirc_unknownî   s    zIRCProto.irc_unknownc                 C   s   |   |¡ |  |¡ d S r   )Újoinr;   rG   r   r   r   rN   ò   s    
zIRCProto.joinGroup)N)r   )N)r,   r-   r.   r>   r;   rF   rL   rU   rX   rY   r[   rZ   ra   rm   ro   rp   rq   rs   ru   rx   rz   r{   r}   rN   r   r   r   r   r<   P   s*   




r<   c                   @   s2   e Zd ZdZeZeZd
dd„Zdd„ Z	dd„ Z
d	S )Ú
IRCAccountZIRCÚ c              	   C   sD   t j | ||||||¡ dd„ | d¡D ƒ| _| jdgkr@g | _d S )Nc                 S   s   g | ]}|  ¡ ‘qS r   )Ústrip)Ú.0rS   r   r   r   Ú
<listcomp>  s     z'IRCAccount.__init__.<locals>.<listcomp>ú,r€   )r   ÚAbstractAccountr>   r#   rM   )r   rT   Z	autoLoginrH   rJ   ÚhostÚportrM   r   r   r   r>   þ   s          ÿzIRCAccount.__init__c                 C   s:   t  ¡ }t tt| ||¡}| | j| j¡}| 	|j
¡ |S r   )r   ZDeferredr   ZClientCreatorr   r<   Z
connectTCPr†   r‡   Z
addErrbackZerrback)r   rB   rC   ÚccÚdr   r   r   Ú_startLogOn  s
    zIRCAccount._startLogOnc                 C   s   d S r   r   r   r   r   r   ÚlogOff  s    zIRCAccount.logOffN)r€   )r,   r-   r.   ZgatewayTyper/   Z_groupFactoryr   Z_personFactoryr>   rŠ   r‹   r   r   r   r   r   ÷   s    ÿ

r   N)Ú__doc__Zzope.interfacer   Ztwisted.internetr   r   r   Ztwisted.internet.deferr   Ztwisted.words.imr   r   r	   Ztwisted.words.im.localsr   Ztwisted.words.protocolsr   ZAbstractPersonr   ZIGroupZAbstractGroupr/   r=   rK   r<   ZIAccountr…   r   r   r   r   r   Ú<module>   s   " (