HEX
Server: Apache
System: Linux scp1.abinfocom.com 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User: confeduphaar (1010)
PHP: 8.1.33
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //proc/self/root/lib/python3/dist-packages/twisted/words/__pycache__/service.cpython-38.pyc
U


W[��@sdZddlmZmZddlmZddlmZddlmZm	Z	m
Zddlm
Z
mZddlmZmZmZddlmZmZdd	lmZdd
lmZddlmZmZddlmZeej�Gd
d�de ��Z!eej"�Gdd�de ��Z#dZ$eej%�Gdd�dej&��Z'Gdd�dej(�Z)Gdd�dej*�Z+eej%�Gdd�dej,��Z-e�.e+e-�Gdd�dej*�Z/eej�Gdd�dej,��Z0e�.e/e0�Gdd�dej*�Z1eej%�Gd d!�d!ej*��Z2ee2ej"ej3�Gd"d#�d#ej,�Z4e�.e2e4�eej5ej6�Gd$d%�d%e ��Z7Gd&d'�d'e7�Z8ddd%d'gZ9d(S))a
A module that needs a better name.

Implements new cred things for words.

How does this thing work?

  - Network connection on some port expecting to speak some protocol

  - Protocol-specific authentication, resulting in some kind of credentials object

  - twisted.cred.portal login using those credentials for the interface
    IUser and with something implementing IChatClient as the mind

  - successful login results in an IUser avatar the protocol can call
    methods on, and state added to the realm such that the mind will have
    methods called on it as is necessary

  - protocol specific actions lead to calls onto the avatar; remote events
    lead to calls onto the mind

  - protocol specific hangup, realm is notified, user is removed from active
    play, the end.
�)�time�ctime)�implementer)�	copyright)�portal�credentials�error)�defer�protocol)�log�failure�reflect)�
itervalues�unicode)�registerAdapter)�pb)�iwords�ewords)�ircc@sVeZdZdd�Zdd�Zdd�Zdd�Zdd
d�Zdd
�Zdd�Z	dd�Z
dd�Zd	S)�GroupcCs||_i|_ddd�|_dS)N�)�topic�topic_author)�name�users�meta��selfr�r�7/usr/lib/python3/dist-packages/twisted/words/service.py�__init__/s
�zGroup.__init__cCst�t||��S�N)r�Failure�	Exception)r�err�prrr�_ebUserCall8szGroup._ebUserCallcCs0|D]&\}}|s|j\}}|�||���qdSr!)�value�remove�getErrorMessage)r�resultsZsuccess�result�userr$rrr�_cbUserCall<s
zGroup._cbUserCallcCs�tj�|�std|f��|j|jkr�g}||j|j<t|j�D]6}||k	r@t�|j	||�}|j
|j|d�|�|�q@t�
|��|j�t�d�S)Nz%r is not a chat client�r%)r�IChatClient�
providedBy�AssertionErrorrrrr	�
maybeDeferred�
userJoined�
addErrbackr&�append�DeferredList�addCallbackr-�succeed)rr,Z	additionsr%�drrr�addCsz	Group.addNcCs�z|j|j=Wntk
r"Yn\Xg}t|j�D]8}||k	r2t�|j|||�}|j|j|d�|�	|�q2t�
|��|j�t�
d�S�Nr.)rr�KeyErrorrr	r2�userLeftr4r&r5r6r7r-r8)rr,�reasonZremovalsr%r9rrrr(QszGroup.removecCst�t|j��Sr!)r	r8�lenr�rrrr�sizeasz
Group.sizecCsp||kst�g}t|j�D]8}||k	rt�|j|||�}|j|j|d�|�|�qt�	|��
|j�t�d�Sr;)
r1rrr	r2�receiver4r&r5r6r7r-r8)r�sender�	recipient�messageZreceivesr%r9rrrrBesz
Group.receivecCs`||_g}t|j�D].}t�|j||�}|j|j|d�|�|�qt�	|��
|j�t�d�Sr;)
rrrr	r2�groupMetaUpdater4r&r5r6r7r-r8)rrZsetsr%r9rrr�setMetadataqszGroup.setMetadatacCst|j���Sr!)�iterr�valuesr@rrr�	iterusers|szGroup.iterusers)N)�__name__�
__module__�__qualname__r r&r-r:r(rArBrGrJrrrrr-s	
rc@sNeZdZdZdZdd�Zdd�Zdd�Zddd	�Zd
d�Z	dd
�Z
dd�ZdS)�UserNcCs||_g|_t�|_dSr!)r�groupsr�lastMessagerrrrr �sz
User.__init__cCs||_||_t�|_dSr!)�realm�mindr�signOn)rrQrRrrr�loggedIn�sz
User.loggedIncs ��fdd�}���j��|�S)Ncs�j���|Sr!)rOr5�r+��grouprrr�cbJoin�szUser.join.<locals>.cbJoin)r:rRr7)rrWrXrrVr�join�sz	User.joincs"��fdd�}���j|��|�S)Ncs�j���|Sr!)rOr(rUrVrr�cbLeave�szUser.leave.<locals>.cbLeave)r(rRr7)rrWr>rZrrVr�leave�sz
User.leavecCst�|_|�|j||�Sr!)rrPrBrR)rrDrErrr�send�sz	User.sendcCs
t|j�Sr!)rHrOr@rrr�
itergroups�szUser.itergroupscCs"|jdd�D]}|�|�qdSr!)rOr[)r�grrr�logout�szUser.logout)N)rKrLrMrQrRr rTrYr[r\r]r_rrrrrN�s
rNzNickServ!NickServ@servicesc@s�eZdZdZdZdZdZdZdZdd�Z	dd�Z
dd	�Zd
d�ZdPdd
�Z
dd�Zdd�ZdZdZdd�Zdd�Zdd�Zdd�Zdd�ZejdfejdfejdfejdfgZejd fejd!fgZd"d#�Z d$d%�Z!d&d'�Z"d(d)�Z#dQd*d+�Z$dRd,d-�Z%d.d/�Z&d0d1�Z'd2d3�Z(d4d5�Z)d6d7�Z*d8d9�Z+d:d;�Z,d<d=�Z-d>d?�Z.d@dA�Z/dBdC�Z0dDdE�Z1dFdG�Z2dHdI�Z3dJdK�Z4dLdM�Z5dNdO�Z6dS)S�IRCUserzM
    Protocol instance representing an IRC user connected to the server.
    N�utf-8cCs |j|_|jj|_|jj|_dSr!)�irc_NICKSERV_PRIVMSG�irc_PRIVMSG�factoryrQr�hostnamer@rrr�connectionMade�s
zIRCUser.connectionMadecCs|jdk	r|��d|_dSr!)r_�avatar�rr>rrr�connectionLost�s
zIRCUser.connectionLostcOs�d|kr|j|d<d|kr,|j�|j�|d<|||dgt|�}g}|D]"}t|t�rb|�d�}|�|�qJt	j
j||�dS)N�prefix�tora)rer�encode�encoding�list�
isinstance�bytes�decoder5r�IRC�sendMessage)rZcommandZparameter_list�kwZarglistZarglistUnicode�argrrrrs�s


zIRCUser.sendMessagecCs&|�d|j|j|jfd|j�dS)N�%s!%s@%s�#)rYrre�rrWr,rrrr3�s�zIRCUser.userJoinedcCs,|�d|j|j|jfd|j|p$d�dS)NrvrwZleaving)�partrre�rrWr,r>rrrr=�s
�zIRCUser.userLeftcCsZtj�|�rd|j}n|j}|�dd�}|��D]"}|�d|j|j|jf||�q2dS)Nrw�textz<an unrepresentable message>rv)r�IGroupr0r�get�
splitlines�privmsgre)rrCrDrEZ
recipientNamer{�LrrrrB�s�zIRCUser.receivec	CsDd|kr@|d}|�dd�}|�|jd|j|d|||jf�dS)Nrrrrwrv)r}rrre)rrWrr�authorrrrrFs�zIRCUser.groupMetaUpdatecCs|d|_dS)z�
        Password message -- Register a password.

        Parameters: <password>

        [REQUIRED]

        Note that IRC requires the client send this *before* NICK
        and USER.
        ���N)�password�rrj�paramsrrr�irc_PASSszIRCUser.irc_PASScCs�|d}zt|t�r |�|j�}Wn2tk
rT|�tt|�d�|j�	�YdSX||_
||_|jD]\}}|�
|||jj�qh|jdkr�|�t|d�n|j}d|_|�||�dS)zh
        Nick message -- Set your nickname.

        Parameters: <nickname>

        [REQUIRED]
        rz;Your nickname cannot be decoded. Please use ASCII or UTF-8.Nz	Password?)rorprqrm�UnicodeDecodeErrorr�NICKSERV�repr�	transport�loseConnection�nicknamer�
_motdMessagesrsrd�_serverInfor��logInAs)rrjr�r��coder{r�rrr�irc_NICKs2
�

�zIRCUser.irc_NICKcCs|d|_dS)zk
        User message -- Set your realname.

        Parameters: <user> <mode> <unused> <realname>
        r�N)Zrealnamer�rrr�irc_USERCs	zIRCUser.irc_USERcCs`|d}|d}|jdkr&|j��n6|��dkrD|�t|jd�n|j}d|_|�||�dS)�^
        Send a (private) message.

        Parameters: <msgtarget> <text to be sent>
        rr�NZnickservz1Denied.  Please send me (NickServ) your password.)r�r�r��lowerrr�r�)rrjr��targetr�r�rrrrbOs
�zIRCUser.irc_NICKSERV_PRIVMSGcCs6|jj�t�||�|tj�}|j|j|j	|fd�dS)N)ZerrbackArgs)
rdrZloginrZUsernamePasswordr�IUser�addCallbacks�_cbLogin�_ebLogin)rr�r�r9rrrr�fs
�zIRCUser.logInAsz:connected to Twisted IRCzA:Your host is %(serviceName)s, running version %(serviceVersion)sz,:This server was created on %(creationDate)sz&%(serviceName)s %(serviceVersion)s w nz(:- %(serviceName)s Message of the Day - z:End of /MOTD command.cCsZ|\}}}|tjks"td|f��|`||_||_|jD]\}}|�|||jj	�q8dS)NzRealm is buggy, got %r)
rr�r1rcrgr_�_welcomeMessagesrsrdr�)rr+�ifacergr_r�r{rrrr��s
zIRCUser._cbLogincCsh|�tj�r|�t|d�n>|�tj�r8|�t|d�n"t�d�t�	|�|�t|d�|j
��dS)Nz*Already logged in.  No pod people allowed!zLogin failed.  Goodbye.zUnhandled error during login:z"Server error during login.  Sorry.)Zcheckr�AlreadyLoggedInrr��ecredZUnauthorizedLoginr�msgr$r�r�)rr$r�rrrr��s(��

�zIRCUser._ebLogincCs|jdk	r|�d|j�dS)zK
        Ping message

        Parameters: <server1> [ <server2> ]
        NZPONG)rQrsrer�rrr�irc_PING�s
zIRCUser.irc_PINGcCs|j��dS)z>
        Quit

        Parameters: [ <Quit Message> ]
        N)r�r�r�rrr�irc_QUIT�szIRCUser.irc_QUITcGs.|r|�tjd�n|�|jd|jd�dS)N�:Unknown MODE flag.rw�+)rsr�ERR_UNKNOWNMODEZchannelModer)rrW�modes�argsrrr�_channelMode�s�zIRCUser._channelModecCs@|r|�tjd�n(||jkr.|�tjd�n|�tjd�dS)Nr�r�z(:You can't look at someone else's modes.)rsrr�rgZRPL_UMODEISZERR_USERSDONTMATCH)rr,r�rrr�	_userMode�s�
��zIRCUser._userModecs�z"�d}t|t�r |��j�}Wn*tk
rL��tj�dd�YdSX|�d�r���fdd�}�j	�
|dd��}|j�j|t
�dd��d�n6�fd	d
�}�j	�|�}|j�j|t
�dd��d�dS)z�
        User mode message

        Parameters: <nickname>
        *( ( "+" / "-" ) *( "i" / "w" / "o" / "O" / "r" ) )

        rz2:No such nickname (could not decode your unicode!)Nrwcs$|�tj���tj�dd�dS)Nr�:That channel doesn't exist.��trapr�NoSuchGrouprsr�ERR_NOSUCHCHANNEL�r$�r�rrr�ebGroup�s�z!IRCUser.irc_MODE.<locals>.ebGroup�)ZcallbackArgscs��tjd�dS)Nz:No such nickname.�rsr�ERR_NOSUCHNICKr�r@rr�ebUser�s�z IRCUser.irc_MODE.<locals>.ebUser)rorprqrmr�rsrr��
startswithrQ�lookupGroupr�r��tuple�
lookupUserr�)rrjr��
channelOrUserr�r9r�rr�r�irc_MODE�s4
�
��zIRCUser.irc_MODEcCsdS)zl
        Userhost message

        Parameters: <nickname> *( SPACE <nickname> )

        [Optional]
        Nrr�rrr�irc_USERHOST�szIRCUser.irc_USERHOSTcs�z"|d�t�t�r ���j��Wn*tk
rL��tj|dd�YdSX|d���d�rv�j	�
�dd��}n�j	����dd��}��fd	d
�}��fdd�}|�
||�dS)
r�rz6:No such nick/channel (could not decode your unicode!)Nr�rwr�cSs|jSr!)rR�r,rrr�<lambda>�z%IRCUser.irc_PRIVMSG.<locals>.<lambda>cs|dk	r�j�|d�i�SdS)Nr{)rgr\)Ztarg)�messageTextrrr�cbTarget sz%IRCUser.irc_PRIVMSG.<locals>.cbTargetcs��tj�d�dS)Nz:No such nick/channel.r�r�)r�
targetNamerr�ebTarget$s
�z%IRCUser.irc_PRIVMSG.<locals>.ebTarget)rorprqrmr�rsrr�r�rQr�r�r7r�)rrjr�r�r�r�r)r�rr�rrc
s$
�
zIRCUser.irc_PRIVMSGcs�z"|d�t�t�r ���j��Wn*tk
rL��tj|dd�YdSX��d�rd�dd���fdd�}��fdd	�}�j	�
���||�dS)
zm
        Join message

        Parameters: ( <channel> *( "," <channel> ) [ <key> *( "," <key> ) ] )
        r�1:No such channel (could not decode your unicode!)Nrwr�cs ��fdd�}�j����|�S)Ncs>��������jd�jdd����D������dS)NrwcSsg|]
}|j�qSr�r��.0r,rrr�
<listcomp>EszEIRCUser.irc_JOIN.<locals>.cbGroup.<locals>.cbJoin.<locals>.<listcomp>)r3�namesrrJ�
_sendTopic)ZignrVrrrX@s�z1IRCUser.irc_JOIN.<locals>.cbGroup.<locals>.cbJoin�rgrYr7)rWrXr@�rWr�cbGroup?sz!IRCUser.irc_JOIN.<locals>.cbGroupcs��tjd�d�dS)Nrwz:No such channel.)rsrr�r���	groupNamerrrr�Is
�z!IRCUser.irc_JOIN.<locals>.ebGroup)rorprqrmr�rsrr�r�rQ�getGroupr��rrjr�r�r�rr�r�irc_JOIN,s 
�

zIRCUser.irc_JOINcs�z*|d�t|dt�r(|d��j��Wn*tk
rT��tj|dd�YdSX��d�rl�dd��t	|�dkr�|d�t�t�r���d��nd���fdd�}��fd	d
�}�j
����||�dS)zc
        Part message

        Parameters: <channel> *( "," <channel> ) [ <Part Message> ]
        rz:Could not decode your unicode!Nrwr�racs$���fdd�}�j�����|�S)Ncs������dSr!)r=rU)rWr>rrrrZlsz2IRCUser.irc_PART.<locals>.cbGroup.<locals>.cbLeave)rgr[r7)rWrZ)r>rr�rr�ksz!IRCUser.irc_PART.<locals>.cbGroupcs,|�tj���tjd�d|���dS)Nrw�:)r�rr�rsr�ERR_NOTONCHANNELr)r�r�rrr�ps
�z!IRCUser.irc_PART.<locals>.ebGroup)
rorprqrmr�rsrr�r�r?rQr�r�r�r)r�r>rr�irc_PARTQs*�

zIRCUser.irc_PARTcs�z"|d�t�t�r ���j��Wn*tk
rL��tj|dd�YdSX��d�rd�dd���fdd�}��fdd	�}�j	�
���||�dS)
zb
        Names message

        Parameters: [ <channel> *( "," <channel> ) [ <target> ] ]
        r�r�Nrwr�cs(���jd|jdd�|��D��dS)NrwcSsg|]
}|j�qSrr�r�rrrr��sz6IRCUser.irc_NAMES.<locals>.cbGroup.<locals>.<listcomp>)r�rrJr�r@rrr��s
�z"IRCUser.irc_NAMES.<locals>.cbGroupcs$|�tj����jd�g�dS)Nrw)r�rr�r�rr���channelrrrr��s�z"IRCUser.irc_NAMES.<locals>.ebGroup)rorprqrmr�rsrr�r�rQr�r�r�rr�r�	irc_NAMESzs 	
�
zIRCUser.irc_NAMEScCs�z&|d}t|dt�r$|�|j�}Wn$tk
rJ|�tjd�YdSX|�d�rb|dd�}t	|�dkr�|�
||d�n
|�|�dS)zJ
        Topic message

        Parameters: <channel> [ <topic> ]
        rz<:That channel doesn't exist (could not decode your unicode!)Nrwr�)rorprqrmr�rsrr�r�r?�	_setTopic�	_getTopic)rrjr�r�rrr�	irc_TOPIC�s�
zIRCUser.irc_TOPICcCs`|j�d�}|r\|j�d�pd}|j�dd�}|�|jd|j|�|�|jd|j||�dS)zP
        Send the topic of the given group to this user, if it has one.
        rrz<noone>�
topic_daterrwN)rr}rrZtopicAuthor)rrWrr��daterrrr��szIRCUser._sendTopiccs(��fdd�}�j�����j|�dS)Ncs"|�tj���tjd�d�dS�N�=r�r�r�r�rrr��s�z"IRCUser._getTopic.<locals>.ebGroup)rQr�r�r�)rr�r�rr�rr��szIRCUser._getTopiccs4��fdd�}��fdd�}�j����||�dS)NcsH�j��}�|d<�j|d<tt��|d<��fdd�}��|��|�S)Nrrr�cs��tjd�jd�dS)Nrwz.:You need to be a channel operator to do that.)rsrZERR_CHANOPRIVSNEEDEDrr�rVrr�ebSet�s
�z1IRCUser._setTopic.<locals>.cbGroup.<locals>.ebSet)r�copyr�intrrGr4)rWZnewMetar�)rrr�rr��s

z"IRCUser._setTopic.<locals>.cbGroupcs"|�tj���tjd�d�dSr�r�r�r�rrr��s�z"IRCUser._setTopic.<locals>.ebGroup)rQr�r�)rr�rr�r�r)r�rrrr��szIRCUser._setTopiccCs<|D]$\}}}|�tj|t|�d|�q|�tjd�dS)z�
        Send a group of LIST response lines

        @type channel: C{list} of C{(str, int, str)}
        @param channel: Information about the channels being sent:
        their name, the number of participants, and their topic.
        r�z
:End of /LISTN)rsrZRPL_LIST�strZRPL_LISTEND)r�channelsrrArrrrrn�szIRCUser.listcs�|r�z,|d}t|t�r$|��j�}|�d�}Wn*tk
rZ��tj|dd�YdSXg}|D],}|�	d�r~|dd�}|�
�j�|��qdt
j|dd�}|�d	d
��n
�j��}�fdd�}|�|�dS)
z�
        List query

        Return information about the indicated channels, or about all
        channels if none are specified.

        Parameters: [ <channel> *( "," <channel> ) [ <target> ] ]
        r�,r�Nrwr�T)Z
consumeErrorscSsdd�|D�S)NcSsg|]\}}|r|�qSrr�r��s�rrrrr�sz6IRCUser.irc_LIST.<locals>.<lambda>.<locals>.<listcomp>r)Zgsrrrr�r�z"IRCUser.irc_LIST.<locals>.<lambda>cs6dd��t��fdd�|D��}|��fdd��|S)NcSs|j||j�d�fS)Nr)rrr})rArWrrr�gotSize"sz3IRCUser.irc_LIST.<locals>.cbGroups.<locals>.gotSizecsg|]}|����|��qSr)rAr7�r�rW�r�rrr�$sz6IRCUser.irc_LIST.<locals>.cbGroups.<locals>.<listcomp>cs��dd�|D��S)NcSsg|]\}}|r|�qSrrr�rrrr�&szHIRCUser.irc_LIST.<locals>.cbGroups.<locals>.<lambda>.<locals>.<listcomp>)rn)r*r@rrr�&r�z4IRCUser.irc_LIST.<locals>.cbGroups.<locals>.<lambda>)r	r6r7)rOr9r@r�r�cbGroups!s�z"IRCUser.irc_LIST.<locals>.cbGroups)rorprqrm�splitr�rsrr�r�r5rQr�r	r6r7r])rrjr�ZallChannelsr�rOZchr�rr@r�irc_LIST�s.

�

zIRCUser.irc_LISTcs,���jd|j�fdd�|��D��dS)Nrwc	s*g|]"}|j�j�jj|jdd|jf�qS)�Hr)rrerQ)r��mr@rrr�-sz'IRCUser._channelWho.<locals>.<listcomp>)ZwhorrJ�rrWrr@r�_channelWho+s�zIRCUser._channelWhocCs|�tjd�dS)Nz:User /WHO not implemented)rsr�RPL_ENDOFWHO�rr,rrr�_userWho0s�zIRCUser._userWhocs�|s��tjd�dSz"|d�t�t�r6���j��Wn*tk
rb��tj|dd�YdSX��d�r���fdd�}�j	�
�dd��}|��j|�n(��fd	d
�}�j	�
��}|��j|�dS)zC
        Who query

        Parameters: [ <mask> [ "o" ] ]
        z:/WHO not supported.Nrz2:End of /WHO list (could not decode your unicode!)rwcs |�tj���tj�d�dS�Nz:End of /WHO list.)r�rr�rsrr�r��r�rrrr�Ss�z IRCUser.irc_WHO.<locals>.ebGroupr�cs |�tj���tj�d�dSr�)r�r�
NoSuchUserrsrr�r�r�rrr�[s�zIRCUser.irc_WHO.<locals>.ebUser)rsrr�rorprqrmr�r�rQr�r�r�r�r�)rrjr�r�r9r�rr�r�irc_WHO5s*
�
zIRCUser.irc_WHOcs��fdd�}��fdd�}z"�d}t|t�r:|��j�}Wn*tk
rf��tj�dd�YdSX�j�	|��
||�dS)zV
        Whois query

        Parameters: [ <target> ] <mask> *( "," <mask> )
        csN���j|j|j�jj|j�jjddtt�|j�|jdd�|��D��dS)NzHi mom!FcSsg|]}d|j�qS)rwr�r�rrrr�qsz5IRCUser.irc_WHOIS.<locals>.cbUser.<locals>.<listcomp>)ZwhoisrrQr�rrPrSr]r�r@rr�cbUserks�z!IRCUser.irc_WHOIS.<locals>.cbUsercs$|�tj���tj�dd�dS)Nr�:No such nick/channel)r�rr�rsrr�r�r�rrr�ss�z!IRCUser.irc_WHOIS.<locals>.ebUserrr�N)rorprqrmr�rsrr�rQr�r�)rrjr�r�r�r,rr�r�	irc_WHOISes
�zIRCUser.irc_WHOIScCs|�tjd�dS)zE
        Oper message

        Parameters: <name> <password>
        z:O-lines not applicableN)rsrZERR_NOOPERHOSTr�rrr�irc_OPER�szIRCUser.irc_OPER)N)N)N)7rKrLrM�__doc__rOr_rgrQrmrfrirsr3r=rBrFr�r�r�r�r�rbr�rZRPL_WELCOMEZRPL_YOURHOSTZRPL_CREATEDZ
RPL_MYINFOr�Z
RPL_MOTDSTARTZ
RPL_ENDOFMOTDr�r�r�r�r�r�r�r�r�rcr�r�r�r�r�r�r�rnr�r�r�r�r�r�rrrrr`�s~
%	��������

	
	
*"%)'

00$r`c@seZdZdZeZdd�ZdS)�
IRCFactorya
    IRC server that creates instances of the L{IRCUser} protocol.

    @ivar _serverInfo: A dictionary mapping:
        "serviceName" to the name of the server,
        "serviceVersion" to the copyright version,
        "creationDate" to the time that the server was started.
    cCs&||_||_|jjtjt�d�|_dS)N)ZserviceNameZserviceVersionZcreationDate)rQrrr�versionrr�)rrQrrrrr �s�zIRCFactory.__init__N)rKrLrMr�r`r
r rrrrr��sr�c@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)�PBMindcCsdSr!rr@rrrr �szPBMind.__init__cCs.t�t�}t|t�r|�d�}||j�|�fS�Nra)r
�qualr�rorrl�invoker�registerReference�r�jellierrrrr�jellyFor�s


zPBMind.jellyForcCsdSr!r)rr,rWrrr�remote_userJoined�szPBMind.remote_userJoinedcCsdSr!r)rr,rWr>rrr�remote_userLeft�szPBMind.remote_userLeftcCsdSr!r)rrCrDrErrr�remote_receive�szPBMind.remote_receivecCsdSr!r�rrWrrrr�remote_groupMetaUpdate�szPBMind.remote_groupMetaUpdateN)	rKrLrMr rrrr	rrrrrr��sr�c@s.eZdZdd�Zdd�Zdd�Zd
dd	�ZdS)�PBMindReferencecCsJtj�|�rt|j|j|�}nt|j|j|�}|�dt|j|j|�||�S)NrB)rr|r0�PBGrouprQrg�PBUser�
callRemote)rrCrDrEZrecrrrrB�s�zPBMindReference.receivecCs|�dt|j|j|�|�S)NrF)rr
rQrgr
rrrrF�s
�zPBMindReference.groupMetaUpdatecCs&|�dt|j|j|�t|j|j|��S)Nr3�rr
rQrgrrxrrrr3�s
�zPBMindReference.userJoinedNcCs(|�dt|j|j|�t|j|j|�|�S)Nr=rrzrrrr=�s�zPBMindReference.userLeft)N)rKrLrMrBrFr3r=rrrrr�src@s6eZdZdd�Zdd�Zdd�Zddd	�Zd
d�ZdS)
r
cCs||_||_||_dSr!)rQrgrW)rrQrgrWrrrr �szPBGroup.__init__cCst|jj|jj|jjf�Sr!)�hashrQrrgrWr@rrr�processUniqueID�szPBGroup.processUniqueIDcCsNt�|j�}t|t�r |�d�}|jj}t|t�r<|�d�}|||j�	|�fSr)
r
r�	__class__rorrlrWrrr)rrrrWrrrr�s



zPBGroup.jellyForNcCs|j�|j|�Sr!)rgr[rWrhrrr�remote_leave�szPBGroup.remote_leavecCs|j�|j|�Sr!)rgr\rW�rrErrr�remote_send�szPBGroup.remote_send)N)rKrLrMr rrrrrrrrr
�s


r
c@s&eZdZdd�Zddd�Zdd�ZdS)	�PBGroupReferencecCsF|\}}}||_ttkr2t|jt�r2|j�d�|_tj�||||g�Sr)rrpr�rorqr�RemoteReference�
unjellyFor)rZ	unjellierZunjellyListZclsNamer�refrrrrs

zPBGroupReference.unjellyForNcCs|�d|�S)Nr[�rrhrrrr[szPBGroupReference.leavecCs|�d|�S)Nr\rrrrrr\
szPBGroupReference.send)N)rKrLrMrr[r\rrrrr�s
rc@seZdZdd�Zdd�ZdS)rcCs||_||_||_dSr!)rQrgr,)rrQrgr,rrrr szPBUser.__init__cCst|jj|jj|jjf�Sr!)rrQrrgr,r@rrrrszPBUser.processUniqueIDN)rKrLrMr rrrrrrsrc@s$eZdZdd�Zdd�Zdd�ZdS)�
ChatAvatarcCs
||_dSr!)rg)rrgrrrr szChatAvatar.__init__cCs0t�|j�}t|t�r |�d�}||j�|�fSr)r
rrrorrlrrrrrrrs

zChatAvatar.jellyForcs(�fdd�}�jj�|�}|�|�|S)Ncs(��fdd�}�j���}|�|�|S)Ncst�jj�j��Sr!)r
rgrQ)ZignoredrVrrrX'sz7ChatAvatar.remote_join.<locals>.cbGroup.<locals>.cbJoinr�)rWrXr9r@r�rr�&s
z'ChatAvatar.remote_join.<locals>.cbGroup)rgrQr�r7)rr�r�r9rr@r�remote_join%s
zChatAvatar.remote_joinN)rKrLrMr rrrrrrrsrc@seZdZdd�Zdd�ZdS)�AvatarReferencecCs|�d|�S)NrYr)rr�rrrrY2szAvatarReference.joincs,t���|j��fdd��|jj���S)Ncs
��d�Sr!)�callbackr�r9rrr�7r�z&AvatarReference.quit.<locals>.<lambda>)r	ZDeferredZbrokerZnotifyOnDisconnectr�r�r@rr r�quit5szAvatarReference.quitN)rKrLrMrYr!rrrrr1src@s�eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�ZdZ	d
Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�ZdS)�
WordsRealmracCs
||_dSr!r�rrrrr BszWordsRealm.__init__cCst|�Sr!)rNrrrr�userFactoryFszWordsRealm.userFactorycCst|�Sr!)rrrrr�groupFactoryJszWordsRealm.groupFactorycs��fdd�}|S)Ncs"t�ddd���d�_�_dS)Nr_cSsdSr!rrrrrr�Qr�z:WordsRealm.logoutFactory.<locals>.logout.<locals>.<lambda>)�getattrrQrRr�rg�facetrrr_Osz(WordsRealm.logoutFactory.<locals>.logoutr)rrgr'r_rr&r�
logoutFactoryNszWordsRealm.logoutFactorycs8t�t�r���j������fdd�}�����|�S)Ncsp|jdk	rt����D]J}||d�}|dk	r|������_��_|�_||��||�fSqt����dSr!)rQrr�rTrrgr(�NotImplementedError)rgr�r'��avatarId�
interfacesrRrrr�	gotAvatarZs

z+WordsRealm.requestAvatar.<locals>.gotAvatar)rorprq�	_encoding�getUserr7)rr+rRr,r-rr*r�
requestAvatarVs

zWordsRealm.requestAvatarFTcCst�dSr!�r)rrrrr�nszWordsRealm.lookupUsercCst�dSr!r1r�rrrr�rszWordsRealm.lookupGroupcCst�dS)a�
        Add the given user to this service.

        This is an internal method intended to be overridden by
        L{WordsRealm} subclasses, not called by external code.

        @type user: L{IUser}

        @rtype: L{twisted.internet.defer.Deferred}
        @return: A Deferred which fires with L{None} when the user is
        added, or which fails with
        L{twisted.words.ewords.DuplicateUser} if a user with the
        same name exists already.
        Nr1r�rrr�addUservszWordsRealm.addUsercCst�dS)aY
        Add the given group to this service.

        @type group: L{IGroup}

        @rtype: L{twisted.internet.defer.Deferred}
        @return: A Deferred which fires with L{None} when the group is
        added, or which fails with
        L{twisted.words.ewords.DuplicateGroup} if a group with the
        same name exists already.
        Nr1r�rrr�addGroup�szWordsRealm.addGroupcs.�jr$��fdd�}�����|�S����S)Ncs|�tj�����Sr!)r�r�DuplicateGroupr�r��rrrrr��sz$WordsRealm.getGroup.<locals>.ebGroup)�createGroupOnRequest�createGroupr4r�)rrr�rr5rr��szWordsRealm.getGroupcs.�jr$��fdd�}�����|�S����S)Ncs|�tj�����Sr!)r�r�
DuplicateUserr�r�r5rrr��sz"WordsRealm.getUser.<locals>.ebUser)�createUserOnRequest�
createUserr4r�)rrr�rr5rr/�szWordsRealm.getUsercsH�fdd�}��fdd�}��������}|�||�|��j�|S)Ncst�t����Sr!)rr"rr8r�r�rr�cbLookup�sz'WordsRealm.createUser.<locals>.cbLookupcs|�tj�����Sr!)r�rr�r#r�r5rr�ebLookup�sz'WordsRealm.createUser.<locals>.ebLookup)r�r�r�r7r2�rrr;r<r9rr5rr:�s
zWordsRealm.createUsercsH�fdd�}��fdd�}��������}|�||�|��j�|S)Ncst�t����Sr!)rr"rr4r�r�rrr;�sz(WordsRealm.createGroup.<locals>.cbLookupcs|�tj�����Sr!)r�rr�r$r�r5rrr<�sz(WordsRealm.createGroup.<locals>.ebLookup)r�r�r�r7r3r=rr5rr7�s
zWordsRealm.createGroupN)rKrLrMr.r r#r$r(r0r6r9r�r�r2r3r�r/r:r7rrrrr">s 		r"csDeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Z�Z	S)
�InMemoryWordsRealmcs"tt|�j||�i|_i|_dSr!)�superr>r rrO)r�art�rrrr �szInMemoryWordsRealm.__init__cCst�t|j��Sr!)r	r8rrOr@rrrr]�szInMemoryWordsRealm.itergroupscCs6|j|jkr t�t�t����S||j|j<t�|�Sr!)	rrr	�failrr"rr8r8r�rrrr2�szInMemoryWordsRealm.addUsercCs6|j|jkr t�t�t����S||j|j<t�|�Sr!)	rrOr	rBrr"rr4r8r�rrrr3�szInMemoryWordsRealm.addGroupc
CsP|��}z|j|}Wn*tk
r@t�t�t�|���YSXt�	|�SdSr!)
r�rr<r	rBrr"rr�r8)rrr,rrrr��szInMemoryWordsRealm.lookupUserc
CsP|��}z|j|}Wn*tk
r@t�t�t�|���YSXt�	|�SdSr!)
r�rOr<r	rBrr"rr�r8)rrrWrrrr��szInMemoryWordsRealm.lookupGroup)
rKrLrMr r]r2r3r�r��
__classcell__rrrArr>�s
r>N):r�rrZzope.interfacerZtwistedrZtwisted.credrrrr�Ztwisted.internetr	r
Ztwisted.pythonrrr
Ztwisted.python.compatrrZtwisted.python.componentsrZtwisted.spreadrZ
twisted.wordsrrZtwisted.words.protocolsrr|�objectrr�rNr�r/rrr`Z
ServerFactoryr�Z
Referenceabler�rrZsetUnjellyableForClassr
rrrZIPerspectiverZIRealmZIChatServicer"r>�__all__rrrr�<module>s^S,e


-�