
    Yf@                         d Z ddlmZmZmZ  G d d          Z G d d          Z G d d          Z G d	 d
          ZdS )z.
Base classes for Instance Messenger clients.
    )AWAYOFFLINEONLINEc                   0    e Zd ZdZd Zd Zd Zd Z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                 >    || _         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	   s     K/var/www/html/env/lib/python3.11/site-packages/twisted/words/im/basechat.py__init__zContactsList.__init__    s%    
      c                    |j         | j        vr|| j        |j         <   |j         | j        vr/|j        t          k    s|j        t
          k    r|| j        |j         <   |j         | j        v r|j        t          k    r| j        |j         = dS dS 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   persons     r   setContactStatuszContactsList.setContactStatus*   s     ;dm++)/DM&+&;d111MV##v}'<'</5D,;$---&-72J2J#FK000 .-2J2Jr   c                 P    || j         vr| j                             |           dS 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   clients     r   registerAccountClientz"ContactsList.registerAccountClient:   s5     %%L''''' &%r   c                 P    || j         v r| j                             |           dS 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   s     r   unregisterAccountClientz$ContactsList.unregisterAccountClientD   s5     T\!!L''''' "!r   c                     |j         }|| j        v r6| j        |= ||_         || j        |<   || j        v r| j        |= || j        |<   dS dS 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   newnickoldnames       r   contactChangedNickzContactsList.contactChangedNickP   sq     +dm##g&!FK%+DM'"$---'0/5#G,,, $# .-r   N)	__name__
__module____qualname____doc__r   r   r   r   r!    r   r   r   r      si         &  1 1 1 ( ( (
( 
( 
(6 6 6 6 6r   r   c                   8    e Zd ZdZd Zd Zd Zd Zd	dZ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                 "    || _         || _        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	   s      r   r   zConversation.__init__q   s     r   c                      t          d          )z1
        Display the ConversationWindow.
        %Subclasses must implement this methodNotImplementedErrorr   s    r   showzConversation.show|        ""IJJJr   c                      t          d          )z.
        Hide the ConversationWindow.
        r+   r,   r.   s    r   hidezConversation.hide   r0   r   c                 <    | 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   sendMessager   texts     r   sendTextzConversation.sendText   s"     	d+++++r   Nc                      t          d          )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+   r,   )r   r6   metadatas      r   showMessagezConversation.showMessage   s     ""IJJJr   c                     || 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   s      r   r!   zConversation.contactChangedNick   s     #r   N)
r"   r#   r$   r%   r   r/   r2   r7   r:   r!   r&   r   r   r(   r(   f   s         	 	 	K K KK K K, , ,
K 
K 
K 
K
# 
# 
# 
# 
#r   r(   c                   P    e Zd ZdZd Zd Zd Zd ZddZd Z	d	 Z
d
 Zd Z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                 0    || _         || _        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	   s      r   r   zGroupConversation.__init__   s     
r   c                      t          d          )z6
        Display the GroupConversationWindow.
        r+   r,   r.   s    r   r/   zGroupConversation.show   r0   r   c                      t          d          )z3
        Hide the GroupConversationWindow.
        r+   r,   r.   s    r   r2   zGroupConversation.hide   r0   r   c                 <    | j                             |d           dS )zo
        Send text to the group.

        @param text: The text to be sent.
        @type text: C{str}
        N)r@   sendGroupMessager5   s     r   r7   zGroupConversation.sendText   s"     	
##D$/////r   Nc                      t          d          )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+   r,   )r   senderr6   r9   s       r   showGroupMessagez"GroupConversation.showGroupMessage   s     ""IJJJr   c                     || _         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)rA   )r   rA   s     r   setGroupMembersz!GroupConversation.setGroupMembers   s     r   c                      t          d          )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+   r,   )r   topicauthors      r   setTopiczGroupConversation.setTopic   s     ""IJJJr   c                 P    || j         vr| j                             |           dS 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)rA   r   r   members     r   memberJoinedzGroupConversation.memberJoined   s5     %%L''''' &%r   c                     || j         v r6| j                             |           | j                             |           dS 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)rA   r   r   )r   oldnickr   s      r   memberChangedNickz#GroupConversation.memberChangedNick	  sK     dl""L(((L((((( #"r   c                 P    || j         v r| j                             |           dS 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)rA   r   rP   s     r   
memberLeftzGroupConversation.memberLeft  s5     T\!!L''''' "!r   r<   )r"   r#   r$   r%   r   r/   r2   r7   rH   rJ   rN   rR   rU   rW   r&   r   r   r>   r>      s         
 
 
K K KK K K0 0 0K K K K  K K K	( 	( 	() ) )	( 	( 	( 	( 	(r   r>   c                   T    e Zd ZdZd Zd Zd Zd ZedfdZ	e
dfdZd	 Zd
 Z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                 t    i | _         i | _        i | _        i | _        g | _        t          |           | _        d S r<   )conversationsgroupConversationspersonsgroupsonlineClientsr   contactsListr.   s    r   r   zChatUI.__init__?  s>    "$(..r   c                 n    | 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   s     r   r   zChatUI.registerAccountClientG  s7     	!!&)))//777r   c                 n    | 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   s     r   r   zChatUI.unregisterAccountClientU  s8     	!!&)))11&99999r   c                     | 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.   s    r   getContactsListzChatUI.getContactsList`  s       r   Fc                     | j                             |          }|s |||           }|| j         |<   |r|                                 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.
        )r[   getr2   r/   )r   r   Class
stayHiddenconvs        r   getConversationzChatUI.getConversationi  si    & !%%f-- 	.5&&D)-Dv& 	IIKKKKIIKKKr   c                     | j                             |          }|s |||           }|| j         |<   |r|                                 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.
        )r\   rf   r2   r/   )r   r@   rg   rh   ri   s        r   getGroupConversationzChatUI.getGroupConversation  si    & &**511 	25%%D-1D#E* 	IIKKKKIIKKKr   c                     |j         }| j                            ||f          }|s!|                    |          }|| 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]   rf   	getPerson)r   r   r   rn   ps        r   ro   zChatUI.getPerson  sT     .LdG_-- 	,!!$''A*+DLw'r   c                     |j         }| j                            ||f          }|s!|                    |          }|| 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}.
        )rn   r^   rf   getGroup)r   r   r   rn   gs        r   rr   zChatUI.getGroup  sR    $ .KOOT7O,, 	+  &&A)*DKg&r   c                 *   |j         }||j        f| j        v r{| j                            |          }|r|                    ||           | j                            ||           | j        ||j        f= ||_         || j        |j         |j        f<   dS 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   rn   r]   r[   rf   r!   r`   )r   r   r   rT   ri   s        r   r!   zChatUI.contactChangedNick  s     +V^$44%))&11D 9''88800AAAWfn45!FK8>DLfn4555 54r   N)r"   r#   r$   r%   r   r   r   rd   r(   rj   r>   rl   ro   rr   r!   r&   r   r   rY   rY   $  s         4/ / /  	: 	: 	:! ! ! -9U    : 1Be    :  ,  2? ? ? ? ?r   rY   N)	r%   twisted.words.im.localsr   r   r   r   r(   r>   rY   r&   r   r   <module>rv      s   
  : 9 9 9 9 9 9 9 9 9W6 W6 W6 W6 W6 W6 W6 W6tA# A# A# A# A# A# A# A#Hw( w( w( w( w( w( w( w(tB? B? B? B? B? B? B? B? B? B?r   