U
    Â“«j@  ã                   @   sT   d Z ddlmZmZmZ G dd„ dƒZG dd„ dƒZG dd„ dƒZG d	d
„ d
ƒZdS )z.
Base classes for Instance Messenger clients.
é    )ÚAWAYÚOFFLINEÚONLINEc                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚContactsListah  
    A GUI object that displays a contacts list.

    @ivar chatui: The GUI chat client associated with this contacts list.
    @type chatui: L{ChatUI}

    @ivar contacts: The contacts.
    @type contacts: C{dict} mapping C{str} to a L{IPerson<interfaces.IPerson>}
        provider

    @ivar onlineContacts: The contacts who are currently online (have a status
        that is not C{OFFLINE}).
    @type onlineContacts: C{dict} mapping C{str} to a
        L{IPerson<interfaces.IPerson>} provider

    @ivar clients: The signed-on clients.
    @type clients: C{list} of L{IClient<interfaces.IClient>} providers
    c                 C   s   || _ i | _i | _g | _dS )zx
        @param chatui: The GUI chat client associated with this contacts list.
        @type chatui: L{ChatUI}
        N)ÚchatuiÚcontactsÚonlineContactsÚclients)Úselfr   © r   ú=/tmp/pip-unpacked-wheel-59kc99xd/twisted/words/im/basechat.pyÚ__init__    s    zContactsList.__init__c                 C   sh   |j | jkr|| j|j < |j | jkrD|jtks8|jtkrD|| j|j < |j | jkrd|jtkrd| j|j = dS )zÀ
        Inform the user that a person's status has changed.

        @param person: The person whose status has changed.
        @type person: L{IPerson<interfaces.IPerson>} provider
        N)Únamer   r   Ústatusr   r   r   )r
   Úpersonr   r   r   ÚsetContactStatus*   s    ÿÿzContactsList.setContactStatusc                 C   s   || j kr| j  |¡ dS )zÝ
        Notify the user that an account client has been signed on to.

        @param client: The client being added to your list of account clients.
        @type client: L{IClient<interfaces.IClient>} provider
        N)r	   Úappend©r
   Úclientr   r   r   ÚregisterAccountClient:   s    
z"ContactsList.registerAccountClientc                 C   s   || j kr| j  |¡ dS )a  
        Notify the user that an account client has been signed off or
        disconnected from.

        @param client: The client being removed from the list of account
            clients.
        @type client: L{IClient<interfaces.IClient>} provider
        N)r	   Úremover   r   r   r   ÚunregisterAccountClientD   s    	
z$ContactsList.unregisterAccountClientc                 C   sH   |j }|| jkrD| j|= ||_ || j|< || jkrD| j|= || j|< dS )a^  
        Update your contact information to reflect a change to a contact's
        nickname.

        @param person: The person in your contacts list whose nickname is
            changing.
        @type person: L{IPerson<interfaces.IPerson>} provider

        @param newnick: The new nickname for this person.
        @type newnick: C{str}
        N)r   r   r   )r
   r   ÚnewnickZoldnamer   r   r   ÚcontactChangedNickP   s    


zContactsList.contactChangedNickN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r   r   r      s   

r   c                   @   sB   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zddd„Zdd„ Z	d
S )ÚConversationa(  
    A GUI window of a conversation with a specific person.

    @ivar person: The person who you're having this conversation with.
    @type person: L{IPerson<interfaces.IPerson>} provider

    @ivar chatui: The GUI chat client associated with this conversation.
    @type chatui: L{ChatUI}
    c                 C   s   || _ || _dS )a  
        @param person: The person who you're having this conversation with.
        @type person: L{IPerson<interfaces.IPerson>} provider

        @param chatui: The GUI chat client associated with this conversation.
        @type chatui: L{ChatUI}
        N)r   r   )r
   r   r   r   r   r   r   q   s    zConversation.__init__c                 C   s   t dƒ‚dS )z1
        Display the ConversationWindow.
        ú%Subclasses must implement this methodN©ÚNotImplementedError©r
   r   r   r   Úshow|   s    zConversation.showc                 C   s   t dƒ‚dS )z.
        Hide the ConversationWindow.
        r   Nr    r"   r   r   r   Úhide‚   s    zConversation.hidec                 C   s   | j  |d¡ dS )z‘
        Send text to the person with whom the user is conversing.

        @param text: The text to be sent.
        @type text: C{str}
        N)r   ZsendMessage©r
   Útextr   r   r   ÚsendTextˆ   s    zConversation.sendTextNc                 C   s   t dƒ‚dS )zþ
        Display a message sent from the person with whom the user is conversing.

        @param text: The sent message.
        @type text: C{str}

        @param metadata: Metadata associated with this message.
        @type metadata: C{dict}
        r   Nr    )r
   r&   Úmetadatar   r   r   ÚshowMessage‘   s    
zConversation.showMessagec                 C   s   || j _dS )zÿ
        Change a person's name.

        @param person: The person whose nickname is changing.
        @type person: L{IPerson<interfaces.IPerson>} provider

        @param newnick: The new nickname for this person.
        @type newnick: C{str}
        N)r   r   )r
   r   r   r   r   r   r   �   s    
zConversation.contactChangedNick)N)
r   r   r   r   r   r#   r$   r'   r)   r   r   r   r   r   r   f   s   
	
r   c                   @   sb   e Zd Z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
S )ÚGroupConversationa�  
    A GUI window of a conversation with a group of people.

    @ivar chatui: The GUI chat client associated with this conversation.
    @type chatui: L{ChatUI}

    @ivar group: The group of people that are having this conversation.
    @type group: L{IGroup<interfaces.IGroup>} provider

    @ivar members: The names of the people in this conversation.
    @type members: C{list} of C{str}
    c                 C   s   || _ || _g | _dS )a   
        @param chatui: The GUI chat client associated with this conversation.
        @type chatui: L{ChatUI}

        @param group: The group of people that are having this conversation.
        @type group: L{IGroup<interfaces.IGroup>} provider
        N)r   ÚgroupÚmembers)r
   r+   r   r   r   r   r   ¸   s    zGroupConversation.__init__c                 C   s   t dƒ‚dS )z6
        Display the GroupConversationWindow.
        r   Nr    r"   r   r   r   r#   Ä   s    zGroupConversation.showc                 C   s   t dƒ‚dS )z3
        Hide the GroupConversationWindow.
        r   Nr    r"   r   r   r   r$   Ê   s    zGroupConversation.hidec                 C   s   | j  |d¡ dS )zo
        Send text to the group.

        @param text: The text to be sent.
        @type text: C{str}
        N)r+   ZsendGroupMessager%   r   r   r   r'   Ð   s    zGroupConversation.sendTextNc                 C   s   t dƒ‚dS )aR  
        Display to the user a message sent to this group from the given sender.

        @param sender: The person sending the message.
        @type sender: C{str}

        @param text: The sent message.
        @type text: C{str}

        @param metadata: Metadata associated with this message.
        @type metadata: C{dict}
        r   Nr    )r
   Zsenderr&   r(   r   r   r   ÚshowGroupMessageÙ   s    z"GroupConversation.showGroupMessagec                 C   s
   || _ dS )z­
        Set the list of members in the group.

        @param members: The names of the people that will be in this group.
        @type members: C{list} of C{str}
        N)r,   )r
   r,   r   r   r   ÚsetGroupMembersè   s    z!GroupConversation.setGroupMembersc                 C   s   t dƒ‚dS )a  
        Change the topic for the group conversation window and display this
        change to the user.

        @param topic: This group's topic.
        @type topic: C{str}

        @param author: The person changing the topic.
        @type author: C{str}
        r   Nr    )r
   ZtopicÚauthorr   r   r   ÚsetTopicñ   s    zGroupConversation.setTopicc                 C   s   || j kr| j  |¡ dS )zÞ
        Add the given member to the list of members in the group conversation
        and displays this to the user.

        @param member: The person joining the group conversation.
        @type member: C{str}
        N)r,   r   ©r
   Úmemberr   r   r   ÚmemberJoinedþ   s    
zGroupConversation.memberJoinedc                 C   s&   || j kr"| j  |¡ | j  |¡ dS )a  
        Change the nickname for a member of the group conversation and displays
        this change to the user.

        @param oldnick: The old nickname.
        @type oldnick: C{str}

        @param newnick: The new nickname.
        @type newnick: C{str}
        N)r,   r   r   )r
   Úoldnickr   r   r   r   ÚmemberChangedNick	  s    
z#GroupConversation.memberChangedNickc                 C   s   || j kr| j  |¡ dS )zé
        Delete the given member from the list of members in the group
        conversation and displays the change to the user.

        @param member: The person leaving the group conversation.
        @type member: C{str}
        N)r,   r   r1   r   r   r   Ú
memberLeft  s    
zGroupConversation.memberLeft)N)r   r   r   r   r   r#   r$   r'   r-   r.   r0   r3   r5   r6   r   r   r   r   r*   ª   s   	
	r*   c                   @   sd   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zed
fdd„Z	e
d
fdd„Zdd„ Zdd„ Zdd„ ZdS )ÚChatUIaø  
    A GUI chat client.

    @type conversations: C{dict} of L{Conversation}
    @ivar conversations: A cache of all the direct windows.

    @type groupConversations: C{dict} of L{GroupConversation}
    @ivar groupConversations: A cache of all the group windows.

    @type persons: C{dict} with keys that are a C{tuple} of (C{str},
       L{IAccount<interfaces.IAccount>} provider) and values that are
       L{IPerson<interfaces.IPerson>} provider
    @ivar persons: A cache of all the users associated with this client.

    @type groups: C{dict} with keys that are a C{tuple} of (C{str},
        L{IAccount<interfaces.IAccount>} provider) and values that are
        L{IGroup<interfaces.IGroup>} provider
    @ivar groups: A cache of all the groups associated with this client.

    @type onlineClients: C{list} of L{IClient<interfaces.IClient>} providers
    @ivar onlineClients: A list of message sources currently online.

    @type contactsList: L{ContactsList}
    @ivar contactsList: A contacts list.
    c                 C   s,   i | _ i | _i | _i | _g | _t| ƒ| _d S )N)ÚconversationsÚgroupConversationsÚpersonsÚgroupsÚonlineClientsr   ÚcontactsListr"   r   r   r   r   ?  s    zChatUI.__init__c                 C   s   | j  |¡ | j |¡ |S )aZ  
        Notify the user that an account has been signed on to.

        @type client: L{IClient<interfaces.IClient>} provider
        @param client: The client account for the person who has just signed on.

        @rtype: L{IClient<interfaces.IClient>} provider
        @return: The client, so that it may be used in a callback chain.
        )r<   r   r=   r   r   r   r   r   r   G  s    
zChatUI.registerAccountClientc                 C   s   | j  |¡ | j |¡ dS )zó
        Notify the user that an account has been signed off or disconnected.

        @type client: L{IClient<interfaces.IClient>} provider
        @param client: The client account for the person who has just signed
            off.
        N)r<   r   r=   r   r   r   r   r   r   U  s    zChatUI.unregisterAccountClientc                 C   s   | j S )z¯
        Get the contacts list associated with this chat window.

        @rtype: L{ContactsList}
        @return: The contacts list associated with this chat window.
        )r=   r"   r   r   r   ÚgetContactsList`  s    zChatUI.getContactsListFc                 C   s>   | j  |¡}|s$||| ƒ}|| j |< |r2| ¡  n| ¡  |S )a  
        For the given person object, return the conversation window or create
        and return a new conversation window if one does not exist.

        @type person: L{IPerson<interfaces.IPerson>} provider
        @param person: The person whose conversation window we want to get.

        @type Class: L{IConversation<interfaces.IConversation>} implementor
        @param Class: The kind of conversation window we want. If the conversation
            window for this person didn't already exist, create one of this type.

        @type stayHidden: C{bool}
        @param stayHidden: Whether or not the conversation window should stay
            hidden.

        @rtype: L{IConversation<interfaces.IConversation>} provider
        @return: The conversation window.
        )r8   Úgetr$   r#   )r
   r   ÚClassÚ
stayHiddenÚconvr   r   r   ÚgetConversationi  s    


zChatUI.getConversationc                 C   s>   | j  |¡}|s$||| ƒ}|| j |< |r2| ¡  n| ¡  |S )a   
        For the given group object, return the group conversation window or
        create and return a new group conversation window if it doesn't exist.

        @type group: L{IGroup<interfaces.IGroup>} provider
        @param group: The group whose conversation window we want to get.

        @type Class: L{IConversation<interfaces.IConversation>} implementor
        @param Class: The kind of conversation window we want. If the conversation
            window for this person didn't already exist, create one of this type.

        @type stayHidden: C{bool}
        @param stayHidden: Whether or not the conversation window should stay
            hidden.

        @rtype: L{IGroupConversation<interfaces.IGroupConversation>} provider
        @return: The group conversation window.
        )r9   r?   r$   r#   )r
   r+   r@   rA   rB   r   r   r   ÚgetGroupConversation†  s    


zChatUI.getGroupConversationc                 C   s6   |j }| j ||f¡}|s2| |¡}|| j||f< |S )a  
        For the given name and account client, return an instance of a
        L{IGroup<interfaces.IPerson>} provider or create and return a new
        instance of a L{IGroup<interfaces.IPerson>} provider.

        @type name: C{str}
        @param name: The name of the person of interest.

        @type client: L{IClient<interfaces.IClient>} provider
        @param client: The client account of interest.

        @rtype: L{IPerson<interfaces.IPerson>} provider
        @return: The person with that C{name}.
        )Úaccountr:   r?   Ú	getPerson)r
   r   r   rE   Úpr   r   r   rF   £  s    
zChatUI.getPersonc                 C   s6   |j }| j ||f¡}|s2| |¡}|| j||f< |S )a  
        For the given name and account client, return an instance of a
        L{IGroup<interfaces.IGroup>} provider or create and return a new instance
        of a L{IGroup<interfaces.IGroup>} provider.

        @type name: C{str}
        @param name: The name of the group of interest.

        @type client: L{IClient<interfaces.IClient>} provider
        @param client: The client account of interest.

        @rtype: L{IGroup<interfaces.IGroup>} provider
        @return: The group with that C{name}.
        )rE   r;   r?   ÚgetGroup)r
   r   r   rE   Úgr   r   r   rH   ¹  s    
zChatUI.getGroupc                 C   sj   |j }||jf| jkrf| j |¡}|r2| ||¡ | j ||¡ | j||jf= ||_ || j|j |jf< dS )a£  
        For the given C{person}, change the C{person}'s C{name} to C{newnick}
        and tell the contact list and any conversation windows with that
        C{person} to change as well.

        @type person: L{IPerson<interfaces.IPerson>} provider
        @param person: The person whose nickname will get changed.

        @type newnick: C{str}
        @param newnick: The new C{name} C{person} will take.
        N)r   rE   r:   r8   r?   r   r=   )r
   r   r   r4   rB   r   r   r   r   Ò  s    zChatUI.contactChangedNickN)r   r   r   r   r   r   r   r>   r   rC   r*   rD   rF   rH   r   r   r   r   r   r7   $  s   	r7   N)	r   Ztwisted.words.im.localsr   r   r   r   r   r*   r7   r   r   r   r   Ú<module>   s
   ZDz