o
    ¯b$  ã                   @   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 u r	tj‚| j j d| j ¡ d S )NzWHOIS %s©ÚaccountÚclientr	   ÚOfflineErrorÚsendLineÚname©Úself© r   ú=/usr/lib/python3/dist-packages/twisted/words/im/ircsupport.pyÚimperson_whois   s   zIRCPerson.imperson_whoisc                 C   ó   t S ©Nr
   r   r   r   r   ÚisOnline   ó   zIRCPerson.isOnlinec                 C   r   r   r
   r   r   r   r   Ú	getStatus   r   zIRCPerson.getStatusc                 C   s   || _ | j ¡  | ¡ d S r   )ÚstatusÚchatÚgetContactsListÚsetContactStatus)r   r   r   r   r   Ú	setStatus   s   zIRCPerson.setStatusNc                 C   sj   | j jd u r	tj‚| d¡D ]"}|r'| dd ¡dkr'| 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.sendMessager   )Ú__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   ó   d S r   r   r   r   r   r   Úimgroup_testAction/   r   zIRCGroup.imgroup_testActionc                 C   s>   | j jd u 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 u r	tj‚| j j | j|¡ d S r   )r   r   r	   r   Útopicr   )r   r:   r   r   r   ÚsetTopic9   s   zIRCGroup.setTopicc                 C   sp   | j jd u r	tj‚|r#| dd ¡dkr#| j j | jd|fg¡ t|ƒS | d¡D ]}| j j 	| j|¡ q(t|ƒS )Nr$   r%   r&   r#   )
r   r   r	   r   r(   r)   r   r   r'   Úsayr+   r   r   r   ÚsendGroupMessage>   s   zIRCGroup.sendGroupMessagec                 C   s8   | j jd u 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)r0   r1   r2   r5   r9   r;   r=   r@   r   r   r   r   r3   -   s    r3   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 )/ÚIRCProtoNc                 C   s.   t j | |||¡ i | _i | _i | _i | _d S r   )r   ÚAbstractClientMixinÚ__init__Ú_namrepliesÚ	_ingroupsÚ_groupsÚ_topics)r   r   ÚchatuiÚlogonDeferredr   r   r   rD   Q   s
   
zIRCProto.__init__r   c                 C   s"   |  ¡ }| jj| j || ¡|d�S )N)Ú
stayHidden)Úlowerr   rA   ÚgetGroup)r   r   Úhider   r   r   rA   X   s   ÿzIRCProto.getGroupConversationc                 C   s   | j  || ¡S r   )r   Ú	getPerson©r   r   r   r   r   rO   ^   s   zIRCProto.getPersonc                 C   s˜   z9d| _ | jj| _| jj| _d| _tj | ¡ | jj	D ]}|  
|¡ qd| j_| jd ur2| j | ¡ | j ¡  W d S  tyK   dd l}| ¡  Y d S w )NTzTwisted-IM userr?   r   )ÚperformLoginr   ÚusernameÚnicknameÚpasswordÚrealnamer   Ú	IRCClientÚconnectionMadeÚchannelsÚ	joinGroupÚ	_isOnlineÚ_logonDeferredÚcallbackr   r    ÚBaseExceptionÚ	tracebackÚ	print_exc)r   Úchannelr^   r   r   r   rW   a   s    


ýzIRCProto.connectionMadec                 C   s"   || _ d| | _tj | |¡ d S )Nz%s (IRC))r   ÚaccountNamer   rV   ÚsetNick)r   Únickr   r   r   rb   v   s   
zIRCProto.setNickc                 C   s    | j  | j  |dd… | ¡d¡S )z9
        Called when I am kicked from a channel.
        r?   N)r   rA   rM   )r   r`   ÚkickerÚmessager   r   r   Ú
kickedFrom{   s    zIRCProto.kickedFromc                 C   r4   r   r   )r   Úkickeer`   rd   re   r   r   r   Ú
userKicked�   r   zIRCProto.userKickedc                 C   s   |   |||ddi¡ d S )NÚdontAutoRespondr?   )Úprivmsg)r   rR   r`   re   r   r   r   Únoticed„   s   zIRCProto.noticedc                 C   sx   |d u ri }|  dd¡d }|| jkrd S |d dkr-|dd … }|  |¡ |||¡ d S | j |  |¡¡ ||¡ d S )Nú!r?   r   ú#©r'   r   rA   ÚshowGroupMessager   ÚgetConversationrO   ÚshowMessage)r   rR   r`   re   ÚmetadataÚgroupr   r   r   rj   ‡   s   

ÿÿzIRCProto.privmsgc                 C   st   |  dd¡d }|| jkrd S ddi}|d dkr+|dd … }|  |¡ |||¡ d S | j |  |¡¡ ||¡ d S )Nrl   r?   r   r$   r%   rm   rn   )r   rR   r`   r%   r-   rs   r   r   r   Úaction—   s   
zIRCProto.actionc              	   C   sÊ   |d dd…   ¡ }|d  ¡ }tt|ƒƒD ]}|| d dv r2|| dd… ||< || d dv s q|| jvr=g | j|< | j|  |¡ |D ]}z
| j|  |¡ W qG tyb   |g| j|< Y qGw dS )zƒ
        RPL_NAMREPLY
        >> NAMES #bnl
        << :Arlington.VA.US.Undernet.Org 353 z3p = #bnl :pSwede Dan-- SkOyg AG
        é   r?   Né   r   )ú@ú+)	rL   r'   ÚrangeÚlenrE   ÚextendrF   Úappendr]   )r   ÚprefixÚparamsrs   ÚusersÚuirS   r   r   r   Úirc_RPL_NAMREPLY¢   s"   ÿ€

ÿýzIRCProto.irc_RPL_NAMREPLYc                 C   s:   |d dd … }|   |¡ | j| ¡  ¡ | j| ¡ = d S r>   )rA   ÚsetGroupMembersrE   rL   ©r   r}   r~   rs   r   r   r   Úirc_RPL_ENDOFNAMES¶   s
   
ÿzIRCProto.irc_RPL_ENDOFNAMESc                 C   s   |d | j |d dd … < d S )Nru   r?   )rH   )r   r}   r~   r   r   r   Úirc_RPL_TOPIC½   s   zIRCProto.irc_RPL_TOPICc                 C   s8   |d dd … }|   |¡ | j| |d ¡ | j|= d S )Nr?   ru   )rA   r;   rH   rƒ   r   r   r   Úirc_333À   s   zIRCProto.irc_333c                 C   s<   |  d¡d }|d dd … }|d }|  |¡ ||¡ d S ©Nrl   r   r?   )r'   rA   r;   )r   r}   r~   rS   rs   r:   r   r   r   Ú	irc_TOPICÅ   s   zIRCProto.irc_TOPICc                 C   sx   |  d¡d }|d dd …  ¡ }|| jkr:z
| j|  |¡ W n ty/   |g| j|< Y nw |  |¡ |¡ d S d S r‡   )r'   rL   rS   rF   r|   r]   rA   ÚmemberJoined©r   r}   r~   rS   rs   r   r   r   Úirc_JOINË   s   
ÿûzIRCProto.irc_JOINc                 C   sf   |  d¡d }|d dd …  ¡ }|| jkr/|| j| v r1| j|  |¡ |  |¡ |¡ d S d S d S r‡   )r'   rL   rS   rF   ÚremoverA   Ú
memberLeftrŠ   r   r   r   Úirc_PARTÕ   s   
ýzIRCProto.irc_PARTc                 C   sJ   |  d¡d }|| jv r#| j| D ]
}|  |¡ |¡ qg | j|< d S d S ©Nrl   r   )r'   rF   rA   r�   rŠ   r   r   r   Úirc_QUITÝ   s   
ýzIRCProto.irc_QUITc                 C   sb   |  d¡d }|d }|| jvrd S | j| D ]}|  |¡ ||¡ q| j| | j|< | j|= d S r�   )r'   rF   rA   ÚmemberChangedNick)r   r}   r~   ÚfromNickÚtoNickrs   r   r   r   Úirc_NICKä   s   
zIRCProto.irc_NICKc                 C   r4   r   r   )r   r}   Úcommandr~   r   r   r   Úirc_unknownî   r   zIRCProto.irc_unknownc                 C   s   |   |¡ |  |¡ d S r   )ÚjoinrA   rP   r   r   r   rY   ò   s   
zIRCProto.joinGroupr   )r   )r0   r1   r2   rD   rA   rO   rW   rb   rf   rh   rk   rj   rt   r�   r„   r…   r†   rˆ   r‹   rŽ   r�   r”   r–   rY   r   r   r   r   rB   P   s,    




rB   c                   @   s4   e Zd ZdZeZeZ	d
dd„Zdd„ Z	dd„ Z
d	S )Ú
IRCAccountÚIRCÚ c              	   C   sH   t j | ||||||¡ dd„ | d¡D ƒ| _| jdgkr"g | _d S d S )Nc                 S   s   g | ]}|  ¡ ‘qS r   )Ústrip)Ú.0r`   r   r   r   Ú
<listcomp>  s    z'IRCAccount.__init__.<locals>.<listcomp>ú,rš   )r   ÚAbstractAccountrD   r'   rX   )r   ra   Ú	autoLoginrR   rT   ÚhostÚportrX   r   r   r   rD   þ   s   ÿ
ÿzIRCAccount.__init__c                 C   s:   t  ¡ }t tt| ||¡}| | j| j¡}| 	|j
¡ |S r   )r   ÚDeferredr   ÚClientCreatorr   rB   Ú
connectTCPr¡   r¢   Ú
addErrbackÚerrback)r   rI   rJ   ÚccÚdr   r   r   Ú_startLogOn  s
   zIRCAccount._startLogOnc                 C   r4   r   r   r   r   r   r   ÚlogOff  s   zIRCAccount.logOffN)rš   )r0   r1   r2   ÚgatewayTyper3   Ú_groupFactoryr   Ú_personFactoryrD   rª   r«   r   r   r   r   r˜   ÷   s    
ÿ
r˜   N)Ú__doc__Úzope.interfacer   Útwisted.internetr   r   r   Útwisted.internet.deferr   Útwisted.words.imr   r   r	   Útwisted.words.im.localsr   Útwisted.words.protocolsr   ÚAbstractPersonr   ÚIGroupÚAbstractGroupr3   rC   rV   rB   ÚIAccountrŸ   r˜   r   r   r   r   Ú<module>   s   " (