Your IP : 216.73.216.213


Current Path : /opt/alt/python37/lib64/python3.7/site-packages/twisted/words/__pycache__/
Upload File :
Current File : //opt/alt/python37/lib64/python3.7/site-packages/twisted/words/__pycache__/service.cpython-37.pyc

B

;��]��@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�H/opt/alt/python37/lib64/python3.7/site-packages/twisted/words/service.py�__init__/szGroup.__init__cCst�t||��S)N)r�Failure�	Exception)r�err�prrr�_ebUserCall8szGroup._ebUserCallcCs4x.|D]&\}}|s|j\}}|�||���qWdS)N)�value�remove�getErrorMessage)r�results�success�result�userr"rrr�_cbUserCall<s
zGroup._cbUserCallcCs�tj�|�std|f��|j|jkr�g}||j|j<xDt|j�D]6}||k	rBt�|j	||�}|j
|j|d�|�|�qBWt�
|��|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�y|j|j=Wntk
r"Yn`Xg}xFt|j�D]8}||k	r4t�|j|||�}|j|j|d�|�	|�q4Wt�
|��|j�t�
d�S)N)r#)rr�KeyErrorrr	r0�userLeftr2r$r3r4r5r,r6)rr+�reasonZremovalsr#r7rrrr&QszGroup.removecCst�t|j��S)N)r	r6�lenr)rrrr�sizeasz
Group.sizecCst||kst�g}xFt|j�D]8}||k	rt�|j|||�}|j|j|d�|�|�qWt�	|��
|j�t�d�S)N)r#)
r/rrr	r0�receiver2r$r3r4r5r,r6)r�sender�	recipient�messageZreceivesr#r7rrrr>esz
Group.receivecCsd||_g}x<t|j�D].}t�|j||�}|j|j|d�|�|�qWt�	|��
|j�t�d�S)N)r#)
rrrr	r0�groupMetaUpdater2r$r3r4r5r,r6)rr�setsr#r7rrr�setMetadataqszGroup.setMetadatacCst|j���S)N)�iterr�values)rrrr�	iterusers|szGroup.iterusers)N)�__name__�
__module__�__qualname__rr$r,r8r&r=r>rDrGrrrrr-s	
rc@sNeZdZdZdZdd�Zdd�Zdd�Zddd	�Zd
d�Z	dd
�Z
dd�ZdS)�UserNcCs||_g|_t�|_dS)N)r�groupsr�lastMessage)rrrrrr�sz
User.__init__cCs||_||_t�|_dS)N)�realm�mindr�signOn)rrNrOrrr�loggedIn�sz
User.loggedIncs ��fdd�}���j��|�S)Ncs�j���|S)N)rLr3)r*)�grouprrr�cbJoin�szUser.join.<locals>.cbJoin)r8rOr5)rrRrSr)rRrr�join�sz	User.joincs"��fdd�}���j|��|�S)Ncs�j���|S)N)rLr&)r*)rRrrr�cbLeave�szUser.leave.<locals>.cbLeave)r&rOr5)rrRr;rUr)rRrr�leave�sz
User.leavecCst�|_|�|j||�S)N)rrMr>rO)rr@rArrr�send�sz	User.sendcCs
t|j�S)N)rErL)rrrr�
itergroups�szUser.itergroupscCs&x |jdd�D]}|�|�qWdS)N)rLrV)r�grrr�logout�szUser.logout)N)rHrIrJrNrOrrQrTrVrWrXrZrrrrrK�s
rKzNickServ!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.
    Nzutf-8cCs |j|_|jj|_|jj|_dS)N)�irc_NICKSERV_PRIVMSG�irc_PRIVMSG�factoryrNr�hostname)rrrr�connectionMade�s
zIRCUser.connectionMadecCs|jdk	r|��d|_dS)N)rZ�avatar)rr;rrr�connectionLost�s
zIRCUser.connectionLostcOs�d|kr|j|d<d|kr,|j�|j�|d<|||dgt|�}g}x*|D]"}t|t�rd|�d�}|�|�qLWt	j
j||�dS)N�prefix�tozutf-8)r_r�encode�encoding�list�
isinstance�bytes�decoder3r�IRC�sendMessage)r�commandZparameter_list�kwZarglistZarglistUnicode�argrrrrl�s



zIRCUser.sendMessagecCs&|�d|j|j|jfd|j�dS)Nz%s!%s@%s�#)rTrr_)rrRr+rrrr1�szIRCUser.userJoinedcCs,|�d|j|j|jfd|j|p$d�dS)Nz%s!%s@%srpZleaving)�partrr_)rrRr+r;rrrr:�szIRCUser.userLeftcCs^tj�|�rd|j}n|j}|�dd�}x.|��D]"}|�d|j|j|jf||�q4WdS)Nrp�textz<an unrepresentable message>z%s!%s@%s)r�IGroupr.r�get�
splitlines�privmsgr_)rr?r@rAZ
recipientNamerr�Lrrrr>�szIRCUser.receivec	CsDd|kr@|d}|�dd�}|�|jd|j|d|||jf�dS)Nrrrrpz%s!%s@%s)rtrrr_)rrRrr�authorrrrrBs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)rrc�paramsrrr�irc_PASSszIRCUser.irc_PASScCs�|d}yt|t�r |�|j�}Wn0tk
rR|�tt|�d�|j�	�dSX||_
||_x&|jD]\}}|�
|||jj�qhW|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?)rhrirjrf�UnicodeDecodeErrorrv�NICKSERV�repr�	transport�loseConnection�nicknamer�
_motdMessagesrlr^�_serverInforz�logInAs)rrcr{r��coderrrzrrr�irc_NICKs.


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

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

        Parameters: <msgtarget> <text to be sent>
        rryNZnickservz1Denied.  Please send me (NickServ) your password.)r�r�r��lowerrvr~r�)rrcr{�targetrzr�rrrr\Os
zIRCUser.irc_NICKSERV_PRIVMSGcCs6|jj�t�||�|tj�}|j|j|j	|fd�dS)N)ZerrbackArgs)
r^rZloginrZUsernamePasswordr�IUser�addCallbacks�_cbLogin�_ebLogin)rr�rzr7rrrr�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.cCs^|\}}}|tjks"td|f��|`||_||_x&|jD]\}}|�|||jj	�q:WdS)NzRealm is buggy, got %r)
rr�r/r]rarZ�_welcomeMessagesrlr^r�)rr*�ifacerarZr�rrrrrr��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.)�checkr�AlreadyLoggedInrvr~�ecredZUnauthorizedLoginr�msgr"r�r�)rr"r�rrrr��s"

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

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

        Parameters: [ <Quit Message> ]
        N)r�r�)rrcr{rrr�irc_QUIT�szIRCUser.irc_QUITcGs.|r|�tjd�n|�|jd|jd�dS)Nz:Unknown MODE flag.rp�+)rlr�ERR_UNKNOWNMODEZchannelModer)rrR�modes�argsrrr�_channelMode�s
zIRCUser._channelModecCs@|r|�tjd�n(||jkr.|�tjd�n|�tjd�dS)Nz:Unknown MODE flag.r�z(:You can't look at someone else's modes.)rlrr�raZRPL_UMODEISZERR_USERSDONTMATCH)rr+r�rrr�	_userMode�s
zIRCUser._userModecs�y"�d}t|t�r |��j�}Wn(tk
rJ��tj�dd�dSX|�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!)Nrpcs$|�tj���tj�dd�dS)Nrz:That channel doesn't exist.)�trapr�NoSuchGrouprlr�ERR_NOSUCHCHANNEL)r")r{rrr�ebGroup�s
z!IRCUser.irc_MODE.<locals>.ebGroup�)ZcallbackArgscs��tjd�dS)Nz:No such nickname.)rlr�ERR_NOSUCHNICK)r")rrr�ebUser�sz IRCUser.irc_MODE.<locals>.ebUser)rhrirjrfr}rlrr��
startswithrN�lookupGroupr�r��tuple�
lookupUserr�)rrcr{�
channelOrUserr�r7r�r)r{rr�irc_MODE�s,


zIRCUser.irc_MODEcCsdS)zl
        Userhost message

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

        [Optional]
        Nr)rrcr{rrr�irc_USERHOST�szIRCUser.irc_USERHOSTcs�y"|d�t�t�r ���j��Wn(tk
rJ��tj|dd�dSX|d���d�rt�j	�
�dd��}n�j	����dd��}��fd	d
�}��fdd�}|�
||�dS)
z^
        Send a (private) message.

        Parameters: <msgtarget> <text to be sent>
        rz6:No such nick/channel (could not decode your unicode!)Nryrpr�cSs|jS)N)rO)r+rrr�<lambda>�z%IRCUser.irc_PRIVMSG.<locals>.<lambda>cs|dk	r�j�|d�i�SdS)Nrr)rarW)Ztarg)�messageTextrrr�cbTarget sz%IRCUser.irc_PRIVMSG.<locals>.cbTargetcs��tj�d�dS)Nz:No such nick/channel.)rlrr�)r")r�
targetNamerr�ebTarget$sz%IRCUser.irc_PRIVMSG.<locals>.ebTarget)rhrirjrfr}rlrr�r�rNr�r�r5r�)rrcr{r�r�r�r)r�rr�rr]
s 


zIRCUser.irc_PRIVMSGcs�y"|d�t�t�r ���j��Wn(tk
rJ��tj|dd�dSX��d�rb�dd���fdd�}��fdd	�}�j	�
���||�dS)
zm
        Join message

        Parameters: ( <channel> *( "," <channel> ) [ <key> *( "," <key> ) ] )
        rz1:No such channel (could not decode your unicode!)Nrpr�cs ��fdd�}�j����|�S)Ncs>��������jd�jdd����D������dS)NrpcSsg|]
}|j�qSr)r)�.0r+rrr�
<listcomp>EszEIRCUser.irc_JOIN.<locals>.cbGroup.<locals>.cbJoin.<locals>.<listcomp>)r1�namesrrG�
_sendTopic)Zign)rRrrrrS@sz1IRCUser.irc_JOIN.<locals>.cbGroup.<locals>.cbJoin)rarTr5)rRrS)r)rRr�cbGroup?sz!IRCUser.irc_JOIN.<locals>.cbGroupcs��tjd�d�dS)Nrpz:No such channel.)rlrr�)r")�	groupNamerrrr�Is
z!IRCUser.irc_JOIN.<locals>.ebGroup)rhrirjrfr}rlrr�r�rN�getGroupr�)rrcr{r�r�r)r�rr�irc_JOIN,s



zIRCUser.irc_JOINcs�y*|d�t|dt�r(|d��j��Wn(tk
rR��tj|dd�dSX��d�rj�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!Nrpr�zutf-8cs$���fdd�}�j�����|�S)Ncs������dS)N)r:)r*)rRr;rrrrUlsz2IRCUser.irc_PART.<locals>.cbGroup.<locals>.cbLeave)rarVr5)rRrU)r;r)rRrr�ksz!IRCUser.irc_PART.<locals>.cbGroupcs,|�tj���tjd�d|���dS)Nrp�:)r�rr�rlr�ERR_NOTONCHANNELr')r")r�rrrr�ps
z!IRCUser.irc_PART.<locals>.ebGroup)
rhrirjrfr}rlrr�r�r<rNr�r�)rrcr{r�r�r)r�r;rr�irc_PARTQs&


zIRCUser.irc_PARTcs�y"|d�t�t�r ���j��Wn(tk
rJ��tj|dd�dSX��d�rb�dd���fdd�}��fdd	�}�j	�
���||�dS)
zb
        Names message

        Parameters: [ <channel> *( "," <channel> ) [ <target> ] ]
        ryz1:No such channel (could not decode your unicode!)Nrpr�cs(���jd|jdd�|��D��dS)NrpcSsg|]
}|j�qSr)r)r�r+rrrr��sz6IRCUser.irc_NAMES.<locals>.cbGroup.<locals>.<listcomp>)r�rrG)rR)rrrr��sz"IRCUser.irc_NAMES.<locals>.cbGroupcs$|�tj����jd�g�dS)Nrp)r�rr�r�r)r")�channelrrrr��s
z"IRCUser.irc_NAMES.<locals>.ebGroup)rhrirjrfr}rlrr�r�rNr�r�)rrcr{r�r�r)r�rr�	irc_NAMESzs	


zIRCUser.irc_NAMEScCs�y&|d}t|dt�r$|�|j�}Wn"tk
rH|�tjd�dSX|�d�r`|dd�}t	|�dkr~|�
||d�n
|�|�dS)zJ
        Topic message

        Parameters: <channel> [ <topic> ]
        rz<:That channel doesn't exist (could not decode your unicode!)Nrpr�)rhrirjrfr}rlrr�r�r<�	_setTopic�	_getTopic)rrcr{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_daterrpN)rrtrrZtopicAuthor)rrRrrx�daterrrr��szIRCUser._sendTopiccs(��fdd�}�j�����j|�dS)Ncs"|�tj���tjd�d�dS)N�=z:That channel doesn't exist.)r�rr�rlrr�)r")r�rrrr��sz"IRCUser._getTopic.<locals>.ebGroup)rNr�r�r�)rr�r�r)r�rrr��szIRCUser._getTopiccs4��fdd�}��fdd�}�j����||�dS)NcsH�j��}�|d<�j|d<tt��|d<��fdd�}��|��|�S)Nrrr�cs��tjd�jd�dS)Nrpz.:You need to be a channel operator to do that.)rlrZERR_CHANOPRIVSNEEDEDr)r")rRrrr�ebSet�sz1IRCUser._setTopic.<locals>.cbGroup.<locals>.ebSet)r�copyr�intrrDr2)rRZnewMetar�)rr)rRrr��s

z"IRCUser._setTopic.<locals>.cbGroupcs"|�tj���tjd�d�dS)Nr�z:That channel doesn't exist.)r�rr�rlrr�)r")r�rrrr��sz"IRCUser._setTopic.<locals>.ebGroup)rNr�r�)rr�rr�r�r)r�rrrr��szIRCUser._setTopiccCs@x,|D]$\}}}|�tj|t|�d|�qW|�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)rlrZRPL_LIST�strZRPL_LISTEND)r�channelsrr=rrrrrg�szIRCUser.listcs�|r�y,|d}t|t�r$|��j�}|�d�}Wn(tk
rX��tj|dd�dSXg}x4|D],}|�	d�r~|dd�}|�
�j�|��qdWt
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�,z1:No such channel (could not decode your unicode!)Nrpr�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)rrrt)r=rRrrr�gotSize"sz3IRCUser.irc_LIST.<locals>.cbGroups.<locals>.gotSizecsg|]}|����|��qSr)r=r5)r�rR)r�rrr�%sz6IRCUser.irc_LIST.<locals>.cbGroups.<locals>.<listcomp>cs��dd�|D��S)NcSsg|]\}}|r|�qSrr)r�r�r�rrrr�&szHIRCUser.irc_LIST.<locals>.cbGroups.<locals>.<lambda>.<locals>.<listcomp>)rg)r()rrrr�&r�z4IRCUser.irc_LIST.<locals>.cbGroups.<locals>.<lambda>)r	r4r5)rLr7)r)r�r�cbGroups!s
z"IRCUser.irc_LIST.<locals>.cbGroups)rhrirjrf�splitr}rlrr�r�r3rNr�r	r4r5rX)rrcr{ZallChannelsr�rL�chr�r)rr�irc_LIST�s*





zIRCUser.irc_LISTcs,���jd|j�fdd�|��D��dS)Nrpc	s*g|]"}|j�j�jj|jdd|jf�qS)�Hr)rr_rN)r��m)rrrr�-sz'IRCUser._channelWho.<locals>.<listcomp>)ZwhorrG)rrRr)rr�_channelWho+szIRCUser._channelWhocCs|�tjd�dS)Nz:User /WHO not implemented)rlr�RPL_ENDOFWHO)rr+rrr�_userWho0szIRCUser._userWhocs�|s��tjd�dSy"|d�t�t�r6���j��Wn(tk
r`��tj|dd�dSX��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!)rpcs |�tj���tj�d�dS)Nz:End of /WHO list.)r�rr�rlrr�)r")r�rrrr�Ssz IRCUser.irc_WHO.<locals>.ebGroupr�cs |�tj���tj�d�dS)Nz:End of /WHO list.)r�r�
NoSuchUserrlrr�)r")r�rrrr�[szIRCUser.irc_WHO.<locals>.ebUser)rlrr�rhrirjrfr}r�rNr�r�r�r�r�)rrcr{r�r7r�r)r�rr�irc_WHO5s&


zIRCUser.irc_WHOcs~�fdd�}��fdd�}y"�d}t|t�r:|��j�}Wn(tk
rd��tj�dd�dSX�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)rp)r)r�rRrrrr�qsz5IRCUser.irc_WHOIS.<locals>.cbUser.<locals>.<listcomp>)ZwhoisrrNr�rrMrPrX)r+)rrr�cbUserksz!IRCUser.irc_WHOIS.<locals>.cbUsercs$|�tj���tj�dd�dS)Nrz:No such nick/channel)r�rr�rlrr�)r")r{rrrr�ss
z!IRCUser.irc_WHOIS.<locals>.ebUserrz:No such nick/channelN)rhrirjrfr}rlrr�rNr�r�)rrcr{r�r�r+r)r{rr�	irc_WHOISes
zIRCUser.irc_WHOIScCs|�tjd�dS)zE
        Oper message

        Parameters: <name> <password>
        z:O-lines not applicableN)rlrZERR_NOOPERHOST)rrcr{rrr�irc_OPER�szIRCUser.irc_OPER)N)N)N)7rHrIrJ�__doc__rLrZrarNrfr`rbrlr1r:r>rBr�rzr|r�r�r\r�rZRPL_WELCOMEZRPL_YOURHOSTZRPL_CREATEDZ
RPL_MYINFOr�Z
RPL_MOTDSTARTZ
RPL_ENDOFMOTDr�r�r�r�r�r�r�r�r�r]r�r�r�r�r�r�r�rgr�r�r�r�r�r�rrrrr[�sn
%	

	
	
*"%)'

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)rNrrr�versionrr�)rrNrrrrr�s
zIRCFactory.__init__N)rHrIrJr�r[r
rrrrrr��sr�c@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)�PBMindcCsdS)Nr)rrrrr�szPBMind.__init__cCs.t�t�}t|t�r|�d�}||j�|�fS)Nzutf-8)r
�qualr�rhrre�invoker�registerReference)r�jellierr�rrr�jellyFor�s


zPBMind.jellyForcCsdS)Nr)rr+rRrrr�remote_userJoined�szPBMind.remote_userJoinedcCsdS)Nr)rr+rRr;rrr�remote_userLeft�szPBMind.remote_userLeftcCsdS)Nr)rr?r@rArrr�remote_receive�szPBMind.remote_receivecCsdS)Nr)rrRrrrr�remote_groupMetaUpdate�szPBMind.remote_groupMetaUpdateN)	rHrIrJrr�r�r�r�r�rrrrr��sr�c@s.eZdZdd�Zdd�Zdd�Zd
dd	�ZdS)�PBMindReferencecCsJtj�|�rt|j|j|�}nt|j|j|�}|�dt|j|j|�||�S)Nr>)rrsr.�PBGrouprNra�PBUser�
callRemote)rr?r@rAZrecrrrr>�szPBMindReference.receivecCs|�dt|j|j|�|�S)NrB)r�r�rNra)rrRrrrrrB�szPBMindReference.groupMetaUpdatecCs&|�dt|j|j|�t|j|j|��S)Nr1)r�r�rNrar�)rrRr+rrrr1�szPBMindReference.userJoinedNcCs(|�dt|j|j|�t|j|j|�|�S)Nr:)r�r�rNrar�)rrRr+r;rrrr:�s
zPBMindReference.userLeft)N)rHrIrJr>rBr1r:rrrrr��sr�c@s6eZdZdd�Zdd�Zdd�Zddd	�Zd
d�ZdS)
r�cCs||_||_||_dS)N)rNrarR)rrNrarRrrrr�szPBGroup.__init__cCst|jj|jj|jjf�S)N)�hashrNrrarR)rrrr�processUniqueID�szPBGroup.processUniqueIDcCsNt�|j�}t|t�r |�d�}|jj}t|t�r<|�d�}|||j�	|�fS)Nzutf-8)
r
r��	__class__rhrrerRrr�r�)rr�r�rRrrrr��s



zPBGroup.jellyForNcCs|j�|j|�S)N)rarVrR)rr;rrr�remote_leave�szPBGroup.remote_leavecCs|j�|j|�S)N)rarWrR)rrArrr�remote_send�szPBGroup.remote_send)N)rHrIrJrr�r�r�r�rrrrr��s


r�c@s&eZdZdd�Zddd�Zdd�ZdS)	�PBGroupReferencecCsF|\}}}||_ttkr2t|jt�r2|j�d�|_tj�||||g�S)Nzutf-8)rrir�rhrjr�RemoteReference�
unjellyFor)rZ	unjellierZunjellyListZclsNamer�refrrrr�s

zPBGroupReference.unjellyForNcCs|�d|�S)NrV)r�)rr;rrrrVszPBGroupReference.leavecCs|�d|�S)NrW)r�)rrArrrrW
szPBGroupReference.send)N)rHrIrJr�rVrWrrrrr��s
r�c@seZdZdd�Zdd�ZdS)r�cCs||_||_||_dS)N)rNrar+)rrNrar+rrrrszPBUser.__init__cCst|jj|jj|jjf�S)N)r�rNrrar+)rrrrr�szPBUser.processUniqueIDN)rHrIrJrr�rrrrr�sr�c@s$eZdZdd�Zdd�Zdd�ZdS)�
ChatAvatarcCs
||_dS)N)ra)rrarrrrszChatAvatar.__init__cCs0t�|j�}t|t�r |�d�}||j�|�fS)Nzutf-8)r
r�r�rhrrer�r�)rr�r�rrrr�s

zChatAvatar.jellyForcs(�fdd�}�jj�|�}|�|�|S)Ncs(��fdd�}�j���}|�|�|S)Ncst�jj�j��S)N)r�rarN)Zignored)rRrrrrS'sz7ChatAvatar.remote_join.<locals>.cbGroup.<locals>.cbJoin)rarTr5)rRrSr7)r)rRrr�&s
z'ChatAvatar.remote_join.<locals>.cbGroup)rarNr�r5)rr�r�r7r)rr�remote_join%s
zChatAvatar.remote_joinN)rHrIrJrr�r�rrrrr�sr�c@seZdZdd�Zdd�ZdS)�AvatarReferencecCs|�d|�S)NrT)r�)rr�rrrrT2szAvatarReference.joincs,t���|j��fdd��|jj���S)Ncs
��d�S)N)�callbackr)r7rrr�7r�z&AvatarReference.quit.<locals>.<lambda>)r	ZDeferredZbrokerZnotifyOnDisconnectr�r�)rr)r7r�quit5szAvatarReference.quitN)rHrIrJrTr�rrrrr�1sr�c@s�eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�ZdZ	d
Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�ZdS)�
WordsRealmzutf-8cCs
||_dS)N)r)rrrrrrBszWordsRealm.__init__cCst|�S)N)rK)rrrrr�userFactoryFszWordsRealm.userFactorycCst|�S)N)r)rrrrr�groupFactoryJszWordsRealm.groupFactorycs��fdd�}|S)Ncs"t�ddd���d�_�_dS)NrZcSsdS)Nrrrrrr�Qr�z:WordsRealm.logoutFactory.<locals>.logout.<locals>.<lambda>)�getattrrNrOr)ra�facetrrrZOsz(WordsRealm.logoutFactory.<locals>.logoutr)rrar�rZr)rar�r�
logoutFactoryNszWordsRealm.logoutFactorycs8t�t�r���j������fdd�}�����|�S)Ncsp|jdk	rt���xN�D]F}||d�}|dk	r|������_��_|�_||��||�fSqWt����dS)N)rNrr�rQrrar��NotImplementedError)rar�r�)�avatarId�
interfacesrOrrr�	gotAvatarZs


z+WordsRealm.requestAvatar.<locals>.gotAvatar)rhrirj�	_encoding�getUserr5)rrrOrrr)rrrOrr�
requestAvatarVs

zWordsRealm.requestAvatarFTcCst�dS)N)r)rrrrrr�nszWordsRealm.lookupUsercCst�dS)N)r)rrRrrrr�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.
        N)r)rr+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.
        N)r)rrRrrr�addGroup�szWordsRealm.addGroupcs.�jr$��fdd�}�����|�S����S)Ncs|�tj�����S)N)r�r�DuplicateGroupr�)r")rrrrr��sz$WordsRealm.getGroup.<locals>.ebGroup)�createGroupOnRequest�createGroupr2r�)rrr�r)rrrr��szWordsRealm.getGroupcs.�jr$��fdd�}�����|�S����S)Ncs|�tj�����S)N)r�r�
DuplicateUserr�)r")rrrrr��sz"WordsRealm.getUser.<locals>.ebUser)�createUserOnRequest�
createUserr2r�)rrr�r)rrrr�szWordsRealm.getUsercsH�fdd�}��fdd�}��������}|�||�|��j�|S)Ncst�t����S)N)rr rr)r+)rrr�cbLookup�sz'WordsRealm.createUser.<locals>.cbLookupcs|�tj�����S)N)r�rr�r�)r")rrrr�ebLookup�sz'WordsRealm.createUser.<locals>.ebLookup)r�r�r�r5r)rrrrr7r)rrrr�s
zWordsRealm.createUsercsH�fdd�}��fdd�}��������}|�||�|��j�|S)Ncst�t����S)N)rr rr	)rR)rrrr�sz(WordsRealm.createGroup.<locals>.cbLookupcs|�tj�����S)N)r�rr�r�)r")rrrrr�sz(WordsRealm.createGroup.<locals>.ebLookup)r�r�r�r5r)rrrrr7r)rrrr�s
zWordsRealm.createGroupN)rHrIrJrrr�r�r�rr
r
r�r�rrr�rrrrrrrr�>s 		r�csDeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Z�Z	S)
�InMemoryWordsRealmcs"tt|�j||�i|_i|_dS)N)�superrrrrL)r�arn)r�rrr�szInMemoryWordsRealm.__init__cCst�t|j��S)N)r	r6rrL)rrrrrX�szInMemoryWordsRealm.itergroupscCs6|j|jkr t�t�t����S||j|j<t�|�S)N)	rrr	�failrr rrr6)rr+rrrr�szInMemoryWordsRealm.addUsercCs6|j|jkr t�t�t����S||j|j<t�|�S)N)	rrLr	rrr rr	r6)rrRrrrr�szInMemoryWordsRealm.addGroupc
CsL|��}y|j|}Wn&tk
r<t�t�t�|���SXt�	|�SdS)N)
r�rr9r	rrr rr�r6)rrr+rrrr��szInMemoryWordsRealm.lookupUserc
CsL|��}y|j|}Wn&tk
r<t�t�t�|���SXt�	|�SdS)N)
r�rLr9r	rrr rr�r6)rrrRrrrr��szInMemoryWordsRealm.lookupGroup)
rHrIrJrrXrrr�r��
__classcell__rr)r�rr�s
rN):r�rrZzope.interfacerZtwistedrZtwisted.credrrrr�Ztwisted.internetr	r
Ztwisted.pythonrrr
Ztwisted.python.compatrrZtwisted.python.componentsrZtwisted.spreadrZ
twisted.wordsrrZtwisted.words.protocolsrrs�objectrr�rKr~r-rkr[Z
ServerFactoryr�Z
Referenceabler�r�r�ZsetUnjellyableForClassr�r�r�r�ZIPerspectiver�ZIRealmZIChatServicer�r�__all__rrrr�<module>sXS,
e





-