U
    n5{i�%  ã                   @   sÖ   d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZmZ ddlmZmZ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ddœZeejƒG dd„ dejƒƒZdS )z2
L{twisted.words} support for Instance Messenger.
é    )Úimplementer)ÚdeferÚerror)Úlog)ÚFailure)Úpb)ÚbasesupportÚ
interfaces)ÚAWAYÚOFFLINEÚONLINEc                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚTwistedWordsPersonzHI a facade for a person you can talk to through a twisted.words service.c                 C   s   t j | ||¡ t| _d S ©N)r   ÚAbstractPersonÚ__init__r   Ústatus)ÚselfÚnameZwordsAccount© r   ú>/tmp/pip-unpacked-wheel-mnhg7r0q/twisted/words/im/pbsupport.pyr      s    zTwistedWordsPerson.__init__c                 C   s   | j tkp| j tkS r   )r   r   r
   ©r   r   r   r   ÚisOnline   s    zTwistedWordsPerson.isOnlinec                 C   s   | j S r   )r   r   r   r   r   Ú	getStatus   s    zTwistedWordsPerson.getStatusc                 C   sJ   |r0| j jj | j||¡}| | jd| ¡ |S | j jj d| j|¡S dS )zReturn a deferred...ú* ÚdirectMessageN)ÚaccountÚclientÚperspectiver   r   Ú
addErrbackÚmetadataFailedÚ
callRemote©r   ÚtextÚmetadataÚdr   r   r   ÚsendMessage!   s    
  ÿzTwistedWordsPerson.sendMessagec                 C   s"   t d|d|ƒ | jjj | j|¡S )Núresult:útext:)Úprintr   r   r   r   r   ©r   Úresultr"   r   r   r   r   ,   s    z!TwistedWordsPerson.metadataFailedc                 C   s   || _ | j ¡  | ¡ d S r   )r   ÚchatÚgetContactsListZsetContactStatus)r   r   r   r   r   Ú	setStatus0   s    zTwistedWordsPerson.setStatusN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r%   r   r-   r   r   r   r   r      s   r   c                   @   sF   e Z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S )ÚTwistedWordsGroupc                 C   s   t j | ||¡ d| _d S ©Nr   )r   ÚAbstractGroupr   Újoined)r   r   ZwordsClientr   r   r   r   7   s    zTwistedWordsGroup.__init__Nc                 C   sL   |r2| j jj d| j||¡}| | jd| ¡ |S | j jj d| j|¡S dS )zReturn a deferred.ÚgroupMessager   N)r   r   r   r    r   r   r   r!   r   r   r   ÚsendGroupMessage;   s    
   ÿ
  ÿz"TwistedWordsGroup.sendGroupMessagec                 C   s$   | j jj d|| jjdœ| j¡ d S )NZsetGroupMetadata)ÚtopicÚtopic_author©r   r   r   r    r   )r   r"   r   r   r   ÚsetTopicI   s
    
ýzTwistedWordsGroup.setTopicc                 C   s$   t d|d|ƒ | jjj d| j|¡S )Nr&   r'   r6   )r(   r   r   r   r    r   r)   r   r   r   r   P   s    
  ÿz TwistedWordsGroup.metadataFailedc                 C   s
   d| _ d S )Né   ©r5   r   r   r   r   ÚjoiningV   s    zTwistedWordsGroup.joiningc                 C   s
   d| _ d S r3   r=   r   r   r   r   ÚleavingY   s    zTwistedWordsGroup.leavingc                 C   s   | j jj d| j¡S ©NÚ
leaveGroupr:   r   r   r   r   Úleave\   s    zTwistedWordsGroup.leave)N)
r.   r/   r0   r   r7   r;   r   r>   r?   rB   r   r   r   r   r2   5   s   
r2   c                   @   s¦   e Zd ZdZd'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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 )*ÚTwistedWordsClientz�In some cases, this acts as an Account, since it a source of text
    messages (multiple Words instances may be on a single PB connection)
    Nc                 C   s:   d  |j||¡| _|| _td||ƒ || _|| _|| _d S )Nz
{} ({}:{})zHELLO I AM A PB SERVICE)ÚformatÚaccountNamer   r(   r+   r   Ú_logonDeferred)r   ZacctÚserviceNameÚperspectiveNameÚchatuirF   r   r   r   r   e   s    ýzTwistedWordsClient.__init__c                 C   s   | j  || ¡S r   )r+   Ú	getPerson©r   r   r   r   r   rJ   q   s    zTwistedWordsClient.getPersonc                 C   s   | j  || ¡S r   )r+   ÚgetGrouprK   r   r   r   rL   t   s    zTwistedWordsClient.getGroupc                 C   s   | j  |  |¡¡S r   )r+   ÚgetGroupConversationrL   rK   r   r   r   rM   w   s    z'TwistedWordsClient.getGroupConversationc                 C   s   | j  d|¡ d S )NÚ
addContact)r   r    rK   r   r   r   rN   z   s    zTwistedWordsClient.addContactc                 C   s    t d||ƒ |  |¡ |¡ d S )Nzreceived group members:)r(   rM   ZsetGroupMembers)r   ÚnamesÚgroupr   r   r   Úremote_receiveGroupMembers}   s    z-TwistedWordsClient.remote_receiveGroupMembersc                 C   s(   t d||||ƒ |  |¡ |||¡ d S )Nzreceived a group message)r(   rM   ÚshowGroupMessage)r   ZsenderrP   Úmessager#   r   r   r   Úremote_receiveGroupMessage�   s    z-TwistedWordsClient.remote_receiveGroupMessagec                 C   s    t d||ƒ |  |¡ |¡ d S )Nzmember joined)r(   rM   ZmemberJoined©r   ÚmemberrP   r   r   r   Úremote_memberJoined…   s    z&TwistedWordsClient.remote_memberJoinedc                 C   s   t dƒ |  |¡ |¡ d S )Nzmember left)r(   rM   Z
memberLeftrU   r   r   r   Úremote_memberLeft‰   s    z$TwistedWordsClient.remote_memberLeftc                 C   s   | j  || ¡ |¡ d S r   ©r+   rJ   r-   )r   r   r   r   r   r   Úremote_notifyStatusChanged�   s    z-TwistedWordsClient.remote_notifyStatusChangedc                 C   s"   | j  | j  || ¡¡ ||¡ d S r   )r+   ZgetConversationrJ   ZshowMessage)r   r   rS   r#   r   r   r   Úremote_receiveDirectMessage�   s     ÿz.TwistedWordsClient.remote_receiveDirectMessagec                 C   s&   |D ]\}}| j  || ¡ |¡ qd S r   rY   )r   Zclistr   r   r   r   r   Úremote_receiveContactList•   s    z,TwistedWordsClient.remote_receiveContactListc                 C   s*   d|kr&|   |¡ |d | dd ¡¡ d S )Nr8   r9   )rM   r;   Úget)r   Zdict_Z	groupNamer   r   r   Úremote_setGroupMetadata™   s
    
 
ÿz*TwistedWordsClient.remote_setGroupMetadatac                 C   s&   |   |¡ ¡  | j d|¡ | j|¡S )NÚ	joinGroup)rL   r>   r   r    ÚaddCallbackÚ_cbGroupJoinedrK   r   r   r   r_   Ÿ   s
     ÿzTwistedWordsClient.joinGroupc                 C   s&   |   |¡ ¡  | j d|¡ | j|¡S r@   )rL   r?   r   r    r`   Ú_cbGroupLeftrK   r   r   r   rA   ¥   s
     ÿzTwistedWordsClient.leaveGroupc                 C   s0   | j  |  |¡¡}| dd¡ | j d|¡ d S )NÚsysz
you joinedZgetGroupMembers)r+   rM   rL   rR   r   r    ©r   r*   r   Z	groupConvr   r   r   ra   «   s    z!TwistedWordsClient._cbGroupJoinedc                 C   s.   t d|ƒ | j |  |¡d¡}| dd¡ d S )NÚleftr<   rc   zyou left)r(   r+   rM   rL   rR   rd   r   r   r   rb   °   s    
zTwistedWordsClient._cbGroupLeftc                 C   s4   t d|ƒ | jd k	r | j | ¡ || _| j ¡  d S )NzConnected Words Client!)r(   rF   Úcallbackr   r+   r,   )r   r   r   r   r   Ú	connectedµ   s
    

zTwistedWordsClient.connected)N)N)N)r.   r/   r0   r1   r   rJ   rL   rM   rN   rQ   rT   rW   rX   rZ   r[   r\   r^   r_   rA   ra   rb   rg   r   r   r   r   rC   `   s&   


rC   N)útwisted.wordsztwisted.realityc                   @   sR   e Zd ZdZeZeZddd„Zdd„ Z	dd„ Z
d	d
„ Zdd„ Zdd„ Zdd„ ZdS )Ú	PBAccountZPBNc              	   C   sX   t j | ||||||¡ g | _|s.dd|fg}|D ] \}}	}
| j t| |	|
g¡ q2dS )z_
        @param username: The name of your PB Identity.
        @type username: string
        rh   N)r   ÚAbstractAccountr   ÚservicesÚappendÚpbFrontEnds)r   rE   Z	autoLoginÚusernameÚpasswordÚhostÚportrk   ZserviceTyperG   rH   r   r   r   r   Æ   s           ÿÿzPBAccount.__init__c                    sR   ˆj sDˆjsDdˆ_ ˆ ˆ ¡}| ˆj¡ ‡ ‡fdd„}| |¡ |S t d¡‚dS )z
        @returns: this breaks with L{interfaces.IAccount}
        @returntype: DeferredList of L{interfaces.IClient}s
        r<   c                    s6   | D ],\}}|r&ˆ   |¡ ˆ |¡ qt |¡ qd S r   )ZregisterAccountClientZ	_cb_logOnr   Úerr)ÚresultsÚsuccessr*   ©rI   r   r   r   ÚregisterManyå   s
    
z%PBAccount.logOn.<locals>.registerManyzConnection in progressN)Z_isConnectingZ	_isOnlineÚ_startLogOnr   Z_loginFailedr`   r   ÚConnectionError)r   rI   r$   rv   r   ru   r   ÚlogOnØ   s    

zPBAccount.logOnc                 C   s   d S r   r   r   r   r   r   ÚlogOffò   s    zPBAccount.logOffc                 C   s6   t ddd� t | j| j¡}|j| j| j|fd� |S )NzConnecting...ú ©Úend©ZcallbackArgs)r(   r   ZgetObjectAtrp   rq   ÚaddCallbacksÚ_cbConnectedÚ_ebConnected)r   rI   r$   r   r   r   rw   ö   s    zPBAccount._startLogOnc                 C   s@   t dƒ t ddd� t || j| j¡}|j| j| j|fd� |S )Nz
Connected!zIdentifying...r{   r|   r~   )r(   r   ZauthIdentityrn   ro   r   Ú_cbIdentr�   )r   ÚrootrI   r$   r   r   r   r€   ü   s
    zPBAccount._cbConnectedc           	      C   s€   |st dƒ |  ttdƒƒ¡S t dƒ g }| jD ]D\}}}t ¡ }| |¡ || ||||ƒ}| d|||¡ 	|j
¡ q0t |¡S )Nzfalsely identified.zusername or password incorrectzIdentified!Úattach)r(   r�   r   Ú	Exceptionrk   r   ZDeferredrl   r    r`   rg   ZDeferredList)	r   ÚidentrI   ÚdlZhandlerClassZsnameZpnamer$   Úhandlerr   r   r   r‚     s    
ÿ
ÿzPBAccount._cbIdentc                 C   s   t dƒ |S )NzNot connected.)r(   )r   r   r   r   r   r�     s    zPBAccount._ebConnected)N)r.   r/   r0   ZgatewayTyper2   Z_groupFactoryr   Z_personFactoryr   ry   rz   rw   r€   r‚   r�   r   r   r   r   ri   À   s    ÿ
ri   )r1   Zzope.interfacer   Ztwisted.internetr   r   Ztwisted.pythonr   Ztwisted.python.failurer   Ztwisted.spreadr   Ztwisted.words.imr   r	   Ztwisted.words.im.localsr
   r   r   r   r   ZIGroupr4   r2   ZReferenceableZAbstractClientMixinrC   rm   ZIAccountrj   ri   r   r   r   r   Ú<module>   s   !*]
