
    \d                     >   d Z ddlmZmZ ddlmZ ddlmZ ddlmZm	Z
mZ ddlmZmZ ddlmZmZmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZ  eej                   G d d                      Z eej                   G d d                      ZdZ  eej!                   G d dej"                              Z# G d dej$                  Z% G d dej&                  Z' eej!                   G d dej(                              Z) ej*        e'e)            G d dej&                  Z+ eej                   G d dej(                              Z, ej*        e+e,            G d dej&                  Z- eej!                   G d d ej&                              Z. ee.ej        ej/                    G d! d"ej(                  Z0 ej*        e.e0            eej1        ej2                   G d# d$                      Z3 G d% d&e3          Z4g d'Z5d(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.
    )ctimetime)implementer)	copyright)credentialserrorportal)deferprotocol)failurelogreflect)registerAdapter)pb)ewordsiwords)ircc                   F    e Zd Zd Zd Zd Zd ZddZd Zd Z	d	 Z
d
 ZdS )Groupc                 6    || _         i | _        ddd| _        d S )N )topictopic_author)nameusersmetaselfr   s     5lib/python3.11/site-packages/twisted/words/service.py__init__zGroup.__init__.   s(    	

 
			    c                 F    t          j        t          ||                    S N)r   Failure	Exception)r   errps      r   _ebUserCallzGroup._ebUserCall6   s    yC00111r!   c                 ~    |D ]9\  }}|s2|j         \  }}|                     ||                                           :d S r#   )valueremovegetErrorMessage)r   resultssuccessresultuserr&   s         r   _cbUserCallzGroup._cbUserCall9   sT    !( 	9 	9Wf 9"L	cD#"5"5"7"7888	9 	9r!   c                    t           j                            |          sJ d                    |                      |j        | j        vrg }|| j        |j        <   | j                                        D ]R}||urLt          j        |j	        | |          }|
                    | j        |           |                    |           St          j        |                              | j                   t          j        d           S )Nz{!r} is not a chat clientr'   )r   IChatClient
providedByformatr   r   valuesr
   maybeDeferred
userJoined
addErrbackr(   appendDeferredListaddCallbackr1   succeed)r   r0   	additionsr'   ds        r   addz	Group.add?   s   !,,T22 	
 	
4O4V4V5
 5
 	
 	
 	
 9DJ&&I$(DJty!Z&&(( ( (D==+AL$EEALL!1QL777$$Q'''y))55d6FGGG}T"""r!   Nc                    	 | j         |j        = g }| j                                         D ]S}||urMt          j        |j        | ||          }|                    | j        |           |                    |           Tt          j	        |          
                    | j                   n# t          $ r Y nw xY wt          j        d           S Nr3   )r   r   r7   r
   r8   userLeftr:   r(   r;   r<   r=   r1   KeyErrorr>   )r   r0   reasonremovalsr'   r@   s         r   r+   zGroup.removeN   s    	G
49% HZ&&(( ' 'D==+AJdFKKALL!1QL777OOA&&&x((44T5EFFFF  	 	 	D	 }T"""s   B+ +
B87B8c                 N    t          j        t          | j                            S r#   )r
   r>   lenr   r   s    r   sizez
Group.size]   s    }S__---r!   c                 l   || u sJ g }| j                                         D ]S}||urMt          j        |j        || |          }|                    | j        |           |                    |           Tt          j        |          	                    | j
                   t          j        d           S rC   )r   r7   r
   r8   receiver:   r(   r;   r<   r=   r1   r>   )r   sender	recipientmessagereceivesr'   r@   s          r   rM   zGroup.receive`   s    D    ""$$ 	# 	#A'	64IIT-333"""8$$001ABBB}T"""r!   c                 d   || _         g }| j                                        D ]N}t          j        |j        | |          }|                    | j        |           |                    |           Ot          j	        |          
                    | j                   t          j        d           S rC   )r   r   r7   r
   r8   groupMetaUpdater:   r(   r;   r<   r=   r1   r>   )r   r   setsr'   r@   s        r   setMetadatazGroup.setMetadatak   s    	""$$ 	 	A#A$5tTBBALL)QL///KKNNNN4  ,,T-=>>>}T"""r!   c                 N    t          | j                                                  S r#   )iterr   r7   rJ   s    r   	iteruserszGroup.iterusersu   s    DJ%%''(((r!   r#   )__name__
__module____qualname__r    r(   r1   rA   r+   rK   rM   rU   rX    r!   r   r   r   ,   s        
 
 
2 2 29 9 9# # ## # # #. . .	# 	# 	## # #) ) ) ) )r!   r   c                   B    e Zd ZdZdZd Zd Zd Zd	dZd Z	d Z
d ZdS )
UserNc                 H    || _         g | _        t                      | _        d S r#   )r   groupsr   lastMessager   s     r   r    zUser.__init__   s"    	66r!   c                 H    || _         || _        t                      | _        d S r#   )realmmindr   signOn)r   rc   rd   s      r   loggedInzUser.loggedIn   s    
	ffr!   c                 l      fd}                      j                                      |          S )Nc                 <    j                                        | S r#   )r`   r;   r/   groupr   s    r   cbJoinzUser.join.<locals>.cbJoin       Ku%%%Mr!   )rA   rd   r=   )r   rj   rk   s   `` r   joinz	User.join   sF    	 	 	 	 	 	 yy##//777r!   c                 n      fd}                      j        |                              |          S )Nc                 <    j                                        | S r#   )r`   r+   ri   s    r   cbLeavezUser.leave.<locals>.cbLeave   rl   r!   )r+   rd   r=   )r   rj   rF   rp   s   ``  r   leavez
User.leave   sH    	 	 	 	 	 	 ||DIv..::7CCCr!   c                 `    t                      | _        |                    | j        ||          S r#   )r   ra   rM   rd   )r   rO   rP   s      r   sendz	User.send   s(    66  Iw???r!   c                 *    t          | j                  S r#   )rW   r`   rJ   s    r   
itergroupszUser.itergroups   s    DK   r!   c                 T    | j         d d          D ]}|                     |           d S r#   )r`   rq   )r   gs     r   logoutzUser.logout   s6    QQQ 	 	AJJqMMMM	 	r!   r#   )rY   rZ   r[   rc   rd   r    rf   rm   rq   rs   ru   rx   r\   r!   r   r^   r^   z   s        ED" " "
  
8 8 8D D D D@ @ @! ! !    r!   r^   zNickServ!NickServ@servicesc                   n   e Zd ZdZdZdZd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 Zd Zd Zd Zej        dfej        dfej        dfej        dfgZej        dfej        dfgZd Z d Z!d Z"d Z#d-dZ$d-dZ%d Z&d Z'd Z(d Z)d  Z*d! Z+d" Z,d# Z-d$ Z.d% Z/d& Z0d' Z1d( Z2d) Z3d* Z4d+ Z5d, Z6dS ).IRCUserzM
    Protocol instance representing an IRC user connected to the server.
    Nutf-8c                 b    | j         | _        | j        j        | _        | j        j        | _        d S r#   )irc_NICKSERV_PRIVMSGirc_PRIVMSGfactoryrc   r   hostnamerJ   s    r   connectionMadezIRCUser.connectionMade   s(    4\'

r!   c                 N    | j         |                                   d | _        d S d S r#   )rx   avatarr   rF   s     r   connectionLostzIRCUser.connectionLost   s*    ;"KKMMMDKKK #"r!   c                 \   d|vr
| j         |d<   d|vr"| j                            | j                  |d<   | ||d         gt	          |          z   }g }|D ]A}t          |t                    r|                    d          }|                    |           Bt          j
        j        |i | d S )Nprefixtor{   )r   r   encodeencodinglist
isinstancebytesdecoder;   r   IRCsendMessage)r   commandparameter_listkwarglistarglistUnicodeargs          r   r   zIRCUser.sendMessage   s    2=BxLr>>y''66BtH"T(+d>.B.BB 	' 	'C#u%% *jj))!!#&&&&^2r22222r!   c                 p    |                      |j         d|j         d| j         d|j        z              d S )N!@#)rm   r   r   r   rj   r0   s      r   r9   zIRCUser.userJoined   s?    		TY<<<<T]<<cEJ>NOOOOOr!   c                 v    |                      |j         d|j         d| j         d|j        z   |pd           d S )Nr   r   r   leaving)partr   r   r   rj   r0   rF   s       r   rD   zIRCUser.userLeft   sS    		y664966t}66%* y	
 	
 	
 	
 	
r!   c                    t           j                            |          rd|j        z   }n|j        }|                    dd          }|                                D ]0}|                     |j         d|j         d| j         ||           1d S )Nr   textz<an unrepresentable message>r   r   )r   IGroupr5   r   get
splitlinesprivmsgr   )r   rN   rO   rP   recipientNamer   Ls          r   rM   zIRCUser.receive   s     =##I.. 	+).0MM%NM{{6#ABB"" 	 	ALL;>>>>t}>>   	 	r!   c           
          d|v rR|d         }|                     dd          }|                     | j        d|j        z   || d| d| j                    d S d S )Nr   r   r   r   r   r   )r   r   r   r   )r   rj   r   r   authors        r   rS   zIRCUser.groupMetaUpdate   s{    d??MEXXnb11FJJ	ej 44F44T]44	     ?r!   c                      |d         | _         dS )z
        Password message -- Register a password.

        Parameters: <password>

        [REQUIRED]

        Note that IRC requires the client send this *before* NICK
        and USER.
        N)passwordr   r   paramss      r   irc_PASSzIRCUser.irc_PASS   s     r
r!   c                 ,   |d         }	 t          |t                    r|                    | j                  }nS# t          $ rF |                     t          t          |          d           | j        	                                 Y dS w xY w|| _
        || _        | j        D ](\  }}|                     ||| j        j        z             )| j        |                     t          |d           dS | j        }d| _        |                     ||           dS )zh
        Nick message -- Set your nickname.

        Parameters: <nickname>

        [REQUIRED]
        r   z;Your nickname cannot be decoded. Please use ASCII or UTF-8.Nz	Password?)r   r   r   r   UnicodeDecodeErrorr   NICKSERVrepr	transportloseConnectionnicknamer   _motdMessagesr   r   _serverInfor   logInAs)r   r   r   r   coder   r   s          r   irc_NICKzIRCUser.irc_NICK  s,    !9
	(E** :#??4=99! 	 	 	LLXM  
 N))+++FF	 !	, 	D 	DJD$T4$,*B#BCCCC= LL8[99999}H DMLL8,,,,,s   /: AB
	B
c                      |d         | _         dS )zk
        User message -- Set your realname.

        Parameters: <user> <mode> <unused> <realname>
        r   N)realnamer   s      r   irc_USERzIRCUser.irc_USER/  s     r
r!   c                 (   |d         }|d         }| j         | j                                         dS |                                dk    r#|                     t
          | j         d           dS | j         }d| _         |                     ||           dS )^
        Send a (private) message.

        Parameters: <msgtarget> <text to be sent>
        r   r   Nnickservz1Denied.  Please send me (NickServ) your password.)r   r   r   lowerr   r   r   )r   r   r   targetr   r   s         r   r}   zIRCUser.irc_NICKSERV_PRIVMSG:  s     ":= N))+++++\\^^z))LLC     }H DMLL8,,,,,r!   c                     | j         j                            t          j        ||          | t
          j                  }|                    | j        | j	        |f           d S )N)errbackArgs)
r   r	   loginr   UsernamePasswordr   IUseraddCallbacks_cbLogin_ebLogin)r   r   r   r@   s       r   r   zIRCUser.logInAsQ  sX    L%%(8<<dFL
 
 	
t}dm(MMMMMr!   z: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.c                     |\  }}}|t           j        u sJ d|            | `|| _        || _        | j        D ](\  }}|                     ||| j        j        z             )d S )NzRealm is buggy, got )	r   r   r~   r   rx   _welcomeMessagesr   r   r   )r   r/   ifacer   rx   r   r   s          r   r   zIRCUser._cbLoginn  s    "($$$&FU&F&F$$$ / 	D 	DJD$T4$,*B#BCCCC	D 	Dr!   c                    |                     t          j                  r|                     t          |d           n|                     t
          j                  r|                     t          |d           nDt          j        d           t          j	        |           |                     t          |d           | j
                                         d S )Nz*Already logged in.  No pod people allowed!zLogin failed.  Goodbye.zUnhandled error during login:z"Server error during login.  Sorry.)checkr   AlreadyLoggedInr   r   ecredUnauthorizedLoginr   msgr&   r   r   )r   r&   r   s      r   r   zIRCUser._ebLoginz  s    99V+,, 		SLL($P    YYu.// 	SLL8-FGGGGG3444GCLLLLL8-QRRR%%'''''r!   c                 N    | j         |                     d| j                   dS dS )zK
        Ping message

        Parameters: <server1> [ <server2> ]
        NPONG)rc   r   r   r   s      r   irc_PINGzIRCUser.irc_PING  s2     :!VT]33333 "!r!   c                 8    | j                                          dS )z>
        Quit

        Parameters: [ <Quit Message> ]
        N)r   r   r   s      r   irc_QUITzIRCUser.irc_QUIT  s     	%%'''''r!   c                     |r"|                      t          j        d           d S |                     | j        d|j        z   d           d S )N:Unknown MODE flag.r   +)r   r   ERR_UNKNOWNMODEchannelModer   )r   rj   modesargss       r   _channelModezIRCUser._channelMode  sQ     	?S02GHHHHHTYej(8#>>>>>r!   c                     |r"|                      t          j        d           d S || j        u r"|                      t          j        d           d S |                      t          j        d           d S )Nr   r   z(:You can't look at someone else's modes.)r   r   r   r   RPL_UMODEISERR_USERSDONTMATCH)r   r0   r   s      r   	_userModezIRCUser._userMode  s     	S02GHHHHHT[  S_c22222&(R    r!   c           	      p    	 d         }t          |t                    r|                     j                  }n8# t          $ r+                      t          j        d         d           Y dS w xY w|                    d          r\ fd} j	        
                    |dd                   }|                     j        |t          dd                              dS  fd} j	                            |          }|                     j        |t          dd                              dS )	z
        User mode message

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

        r   z2:No such nickname (could not decode your unicode!)Nr   c                     |                      t          j                                       t          j        d         d           d S )Nr   :That channel doesn't exist.trapr   NoSuchGroupr   r   ERR_NOSUCHCHANNELr&   r   r   s    r   ebGroupz!IRCUser.irc_MODE.<locals>.ebGroup  sI    +,,,  )6!96T    r!      )callbackArgsc                 H                         t          j        d           d S )Nz:No such nickname.r   r   ERR_NOSUCHNICK)r&   r   s    r   ebUserz IRCUser.irc_MODE.<locals>.ebUser  s#      !35IJJJJJr!   )r   r   r   r   r   r   r   r   
startswithrc   lookupGroupr   r   tuple
lookupUserr   )r   r   r   channelOrUserr   r@   r   s   ` `    r   irc_MODEzIRCUser.irc_MODE  sw   
	"1IM-// D - 4 4T] C C! 	 	 	"q	D  
 FF	 ##C(( 	S      
&&}QRR'899ANN4,gE&QRQSQS*DUDUNVVVVVK K K K K 
%%m44ANN4>6fQRRj@Q@QNRRRRR   7< 1A10A1c                     dS )zl
        Userhost message

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

        [Optional]
        Nr\   r   s      r   irc_USERHOSTzIRCUser.irc_USERHOST  s	     	r!   c                     	 |d         t          t                    r                     j                  n8# t          $ r+                      t          j        |d         d           Y dS w xY w|d                             d          r# j	        
                    dd                   }n. j	                                                          d           } fd} fd	}|                    ||           dS )
r   r   z6:No such nick/channel (could not decode your unicode!)Nr   r   r   c                     | j         S r#   )rd   )r0   s    r   <lambda>z%IRCUser.irc_PRIVMSG.<locals>.<lambda>  s    TY r!   c                 F    | j                             | di          S d S )Nr   )r   rs   )targmessageTextr   s    r   cbTargetz%IRCUser.irc_PRIVMSG.<locals>.cbTarget  s.    {''v{.CDDD  r!   c                 J                         t          j        d           d S )Nz:No such nick/channel.r   )r&   r   
targetNames    r   ebTargetz%IRCUser.irc_PRIVMSG.<locals>.ebTarget  s%    S/=UVVVVVr!   )r   r   r   r   r   r   r   r   r   rc   r   r   r=   r   )r   r   r   r   r  r  r  r  s   `     @@r   r~   zIRCUser.irc_PRIVMSG  sX   
	J*e,, >'..t}==
! 	 	 	"q	H  
 FF	 Rj  %% 	Z++JqrrN;;FFZ**:66BB&& F	E 	E 	E 	E 	E 	E	W 	W 	W 	W 	W 	W 	Hh/////s   7= 1A21A2c                     	 |d         t          t                    r                     j                  n8# t          $ r+                      t          j        |d         d           Y dS w xY w                    d          r
dd          fd} fd} j	        
                                                  ||           dS )zm
        Join message

        Parameters: ( <channel> *( "," <channel> ) [ <key> *( "," <key> ) ] )
        r   1:No such channel (could not decode your unicode!)Nr   r   c                 l      fd}j                                                            |          S )Nc                                                                         j        dj        z   d                                 D                                                       d S )Nr   c                     g | ]	}|j         
S r\   r   .0r0   s     r   
<listcomp>zEIRCUser.irc_JOIN.<locals>.cbGroup.<locals>.cbJoin.<locals>.<listcomp>  s    ===4TY===r!   )r9   namesr   rX   
_sendTopic)ignrj   r   s    r   rk   z1IRCUser.irc_JOIN.<locals>.cbGroup.<locals>.cbJoin  sq    t,,,

I%*$==5??+<+<===  
 &&&&&r!   r   rm   r=   )rj   rk   r   s   ` r   cbGroupz!IRCUser.irc_JOIN.<locals>.cbGroup  sH    ' ' ' ' ' ' ;##E**66v>>>r!   c                 P                         t          j        dz   d           d S )Nr   z:No such channel.)r   r   r   r&   	groupNamer   s    r   r   z!IRCUser.irc_JOIN.<locals>.ebGroup  s4    %sY8K    r!   )r   r   r   r   r   r   r   r   r   rc   getGroupr   )r   r   r   r  r   r  s   `    @r   irc_JOINzIRCUser.irc_JOIN  s   
	q	I)U++ <%,,T];;	! 	 	 	%q	C  
 FF	 $$ 	&!!""I
	? 
	? 
	? 
	? 
	?	 	 	 	 	 	
 	
I&&33GWEEEEEr   c                 H    	 |d         t          |d         t                    r |d                              j                  n8# t          $ r+                      t          j        |d         d           Y dS w xY w                    d          r
dd         t          |          dk    r3|d         t          t                    r                    d          nd fd} fd} j
                                                          ||           dS )	zc
        Part message

        Parameters: <channel> *( "," <channel> ) [ <Part Message> ]
        r   z:Could not decode your unicode!Nr   r   r{   c                 p      fd}j                                                            |          S )Nc                 6                                    d S r#   )rD   )r/   rj   rF   r   s    r   rp   z2IRCUser.irc_PART.<locals>.cbGroup.<locals>.cbLeave@  s    eT622222r!   )r   rq   r=   )rj   rp   rF   r   s   ` r   r  z!IRCUser.irc_PART.<locals>.cbGroup?  sO    3 3 3 3 3 3 3 ;$$UF33??HHHr!   c                     |                      t          j                                       t          j        dz   d|                                 z              d S )Nr   :)r   r   r   r   r   ERR_NOTONCHANNELr,   r  s    r   r   z!IRCUser.irc_PART.<locals>.ebGroupE  sY    HHV'((($cIosS=P=P=R=R7R    r!   )r   r   r   r   r   r   r   r   r   rI   rc   r   r   )r   r   r   r  r   r  rF   s   `    @@r   irc_PARTzIRCUser.irc_PART%  sd   	q	I&)U++ <"1I,,T];;	! 	 	 	$fQi1R   FF		 $$ 	&!!""Iv;;??AYF&%(( 0w//F	I 	I 	I 	I 	I 	I	 	 	 	 	 	 	
y))66wHHHHHs   AA	 	1A>=A>c                     	 |d         t          t                    r                     j                  n8# t          $ r+                      t          j        |d         d           Y dS w xY w                    d          r
dd          fd} fd} j	        
                                                  ||           dS )zb
        Names message

        Parameters: [ <channel> *( "," <channel> ) [ <target> ] ]
        r   r	  Nr   r   c                                          j        d| j        z   d |                                 D                        d S )Nr   c                     g | ]	}|j         
S r\   r  r  s     r   r  z6IRCUser.irc_NAMES.<locals>.cbGroup.<locals>.<listcomp>g  s    -V-V-VDdi-V-V-Vr!   )r  r   rX   )rj   r   s    r   r  z"IRCUser.irc_NAMES.<locals>.cbGroupe  sL    JJ	3+-V-VEOODUDU-V-V-V    r!   c                     |                      t          j                                       j        dz   g            d S )Nr   )r   r   r   r  r   r&   channelr   s    r   r   z"IRCUser.irc_NAMES.<locals>.ebGroupj  s:    HHV'(((JJty#-44444r!   )r   r   r   r   r   r   r   r   r   rc   r   r   )r   r   r   r  r   r'  s   `    @r   	irc_NAMESzIRCUser.irc_NAMESM  s   
	RjG'5)) 8!..77! 	 	 	%r
C  
 FF	 c"" 	"abbkG	 	 	 	 	
	5 	5 	5 	5 	5 	5
 	
w''44WgFFFFFr   c                    	 |d         }t          |d         t                    r|                    | j                  }n1# t          $ r$ |                     t          j        d           Y dS w xY w|                    d          r
|dd         }t          |          dk    r| 
                    ||d                    dS |                     |           dS )zJ
        Topic message

        Parameters: <channel> [ <topic> ]
        r   z<:That channel doesn't exist (could not decode your unicode!)Nr   r   )r   r   r   r   r   r   r   r   r   rI   	_setTopic	_getTopic)r   r   r   r'  s       r   	irc_TOPICzIRCUser.irc_TOPICq  s    		QiG&)U++ 8!..77! 	 	 	%N   FF	 c"" 	"abbkGv;;??NN7F1I.....NN7#####s   =A   *A.-A.c                 B   |j                             d          }|r|j                             d          pd}|j                             dd          }|                     | j        d|j        z   |           |                     | j        d|j        z   ||           dS dS )zP
        Send the topic of the given group to this user, if it has one.
        r   r   z<noone>
topic_dater   r   N)r   r   r   r   topicAuthor)r   rj   r   r   dates        r   r  zIRCUser._sendTopic  s     
w'' 	HZ^^N33@yF:>>,22DJJty#
"2E:::TYej(8&$GGGGG		H 	Hr!   c                 |      fd} j                                                            j        |           d S )Nc                     |                      t          j                                       t          j        dd           d S N=r   r   r&  s    r   r   z"IRCUser._getTopic.<locals>.ebGroup  G    HHV'(((%sG5S    r!   )rc   r   r   r  )r   r'  r   s   `` r   r+  zIRCUser._getTopic  sR    	 	 	 	 	 	 	
w''44T_gNNNNNr!   c                       fd} fd} j                                                           ||           d S )Nc                       j                                         }|d<   j        |d<   t          t	                                |d<    fd}                     |                              |          S )Nr   r   r.  c                 Z                         t          j        dj        z   d           d S )Nr   z.:You need to be a channel operator to do that.)r   r   ERR_CHANOPRIVSNEEDEDr   )r&   rj   r   s    r   ebSetz1IRCUser._setTopic.<locals>.cbGroup.<locals>.ebSet  s8      ,%*$D    r!   )r   copyr   intr   rU   r:   )rj   newMetar:  r   r   s   `  r   r  z"IRCUser._setTopic.<locals>.cbGroup  s    joo''G$GG&*iGN#$'KKGL!      $$W--88???r!   c                     |                      t          j                                       t          j        dd           d S r3  r   r&  s    r   r   z"IRCUser._setTopic.<locals>.ebGroup  r5  r!   )rc   r   r   )r   r'  r   r  r   s   ```  r   r*  zIRCUser._setTopic  su    	@ 	@ 	@ 	@ 	@ 	@	 	 	 	 	 	 	
w''44WgFFFFFr!   c                     |D ]8\  }}}|                      t          j        |t          |          d|z              9|                      t          j        d           dS )z
        Send a group of LIST response lines

        @type channels: C{list} of C{(str, int, str)}
        @param channels: Information about the channels being sent:
            their name, the number of participants, and their topic.
        r  z:End of /LISTN)r   r   RPL_LISTstrRPL_LISTEND)r   channelsr   rK   r   s        r   r   zIRCUser.list  sc     $, 	I 	IT4S\4TC%KHHHH/:::::r!   c                     |r	 |d         }t          |t                    r|                     j                  }|                    d          }n8# t
          $ r+                      t          j        |d         d           Y dS w xY wg }|D ]N}|	                    d          r
|dd         }|
                     j                            |                     Ot          j        |d          }|                    d	            n j                                        } fd
}|                    |           dS )z
        List query

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

        Parameters: [ <channel> *( "," <channel> ) [ <target> ] ]
        r   ,r	  Nr   r   T)consumeErrorsc                     d | D             S )Nc                     g | ]	\  }}||
S r\   r\   r  srs      r   r  z6IRCUser.irc_LIST.<locals>.<lambda>.<locals>.<listcomp>  s!    *C*C*C!Q*C1*C*C*Cr!   r\   )gss    r   r   z"IRCUser.irc_LIST.<locals>.<lambda>  s    *C*C2*C*C*C r!   c                     d t          j        fd| D                       }|                    fd           |S )Nc                 F    |j         | |j                            d          fS )Nr   )r   r   r   )rK   rj   s     r   gotSizez3IRCUser.irc_LIST.<locals>.cbGroups.<locals>.gotSize  s    z4)@)@@@r!   c                 `    g | ]*}|                                                     |          +S r\   )rK   r=   )r  rj   rO  s     r   r  z6IRCUser.irc_LIST.<locals>.cbGroups.<locals>.<listcomp>  s1    NNNe))'599NNNr!   c                 B                         d | D                       S )Nc                     g | ]	\  }}||
S r\   r\   rI  s      r   r  zHIRCUser.irc_LIST.<locals>.cbGroups.<locals>.<lambda>.<locals>.<listcomp>  s"    4R4R4R6AqPQ4RQ4R4R4Rr!   )r   )r-   r   s    r   r   z4IRCUser.irc_LIST.<locals>.cbGroups.<locals>.<lambda>  s"    $))4R4RW4R4R4R*S*S r!   )r
   r<   r=   )r`   r@   rO  r   s     @r   cbGroupsz"IRCUser.irc_LIST.<locals>.cbGroups  sd    A A A "NNNNvNNN A MMSSSSTTTHr!   )r   r   r   r   splitr   r   r   r   r   r;   rc   r   r
   r<   r=   ru   )r   r   r   allChannelsrC  r`   chrS  s   `       r   irc_LISTzIRCUser.irc_LIST  sz     	-$Qik511 D"-"4"4T]"C"CK&,,S11%     )1IG  
  F : :==%%  ABBBdj44R889999'dCCCFCCDDDD Z**,,F	 	 	 	 	 	8$$$$$s   AA 1BBc                                             j        d|j        z    fd|                                D                        d S )Nr   c           	      ^    g | ])}|j         j        j        j         |j         d d|j         f*S )Hr   )r   r   rc   )r  mr   s     r   r  z'IRCUser._channelWho.<locals>.<listcomp>   sD        
aP  r!   )whor   rX   r   rj   s   ` r   _channelWhozIRCUser._channelWho  sb    I%*   **  	
 	
 	
 	
 	
r!   c                 F    |                      t          j        d           d S )Nz:User /WHO not implemented)r   r   RPL_ENDOFWHOr   r0   s     r   _userWhozIRCUser._userWho  s"    )+GHHHHHr!   c                 ^    |s"                      t          j        d           dS 	 |d         t          t                    r                     j                  n8# t          $ r+                       t          j        |d         d           Y dS w xY w                    d          rE fd} j	        
                    dd                   }|                     j        |           dS  fd} j	                                      }|                     j        |           dS )	zC
        Who query

        Parameters: [ <mask> [ "o" ] ]
        z:/WHO not supported.Nr   z2:End of /WHO list (could not decode your unicode!)r   c                     |                      t          j                                       t          j        d           d S Nz:End of /WHO list.)r   r   r   r   r   r`  r&   r   r   s    r   r   z IRCUser.irc_WHO.<locals>.ebGroup*  s:    +,,,  !1=BVWWWWWr!   r   c                     |                      t          j                                       t          j        d           d S re  )r   r   
NoSuchUserr   r   r`  rf  s    r   r   zIRCUser.irc_WHO.<locals>.ebUser2  s:    *+++  !1=BVWWWWWr!   )r   r   r`  r   r   r   r   r   r   rc   r   r   r^  r   rb  )r   r   r   r   r@   r   r   s   `     @r   irc_WHOzIRCUser.irc_WHO	  s     	S-/EFFFF
	"1IM-// D - 4 4T] C C! 	 	 	 q	D  
 FF	 ##C(( 	2X X X X X X 
&&}QRR'899ANN4+W55555X X X X X X 
%%m44ANN4=&11111s   7A   1BBc                 ^     fd} fd}	 d         }t          |t                    r|                     j                  }n8# t          $ r+                      t          j        d         d           Y dS w xY w j        	                    |          
                    ||           dS )zV
        Whois query

        Parameters: [ <target> ] <mask> *( "," <mask> )
        c                                         j        | j        | j        j        j        | j        j        j        ddt          t	                      | j        z
            | j        d |                                 D                        d S )NzHi mom!Fc                 "    g | ]}d |j         z   S )r   r  )r  rj   s     r   r  z5IRCUser.irc_WHOIS.<locals>.cbUser.<locals>.<listcomp>L  s    AAAeuz!AAAr!   )whoisr   rc   r<  r   ra   re   ru   )r0   r   s    r   cbUserz!IRCUser.irc_WHOIS.<locals>.cbUser@  s    JJ			
	
DFFT--..AAt/@/@AAA    r!   c                     |                      t          j                                       t          j        d         d           d S )Nr   :No such nick/channel)r   r   rh  r   r   r   r   s    r   r   z!IRCUser.irc_WHOIS.<locals>.ebUserO  s>    HHV&'''S/<STTTTTr!   r   rp  N)r   r   r   r   r   r   r   r   rc   r   r   )r   r   r   rn  r   r0   s   ` `   r   	irc_WHOISzIRCUser.irc_WHOIS9  s    	 	 	 	 		U 	U 	U 	U 	U 	U	!9D$&& 2{{4=11! 	 	 	S/<STTTFF	 	
d##00@@@@@s   7A 1A<;A<c                 F    |                      t          j        d           dS )zE
        Oper message

        Parameters: <name> <password>
        z:O-lines not applicableN)r   r   ERR_NOOPERHOSTr   s      r   irc_OPERzIRCUser.irc_OPER^  s$     	+-FGGGGGr!   r#   )7rY   rZ   r[   __doc__r`   rx   r   rc   r   r   r   r   r9   rD   rM   rS   r   r   r   r   r   r}   r   r   RPL_WELCOMERPL_YOURHOSTRPL_CREATED
RPL_MYINFOr   RPL_MOTDSTARTRPL_ENDOFMOTDr   r   r   r   r   r   r   r   r   r~   r  r!  r(  r,  r  r+  r*  r   rW  r^  rb  ri  rq  rt  r\   r!   r   rz   rz      s        
 F F F E H( ( (
  3 3 3P P P
 
 
 
  "	 	 	 HH# # # -  -  -D	# 	# 	#- - -.N N N 
56O	
 
HI
 N 5		
& 
	FG		45M

D 
D 
D( ( (4 4 4( ( (? ? ? ?   $S $S $SL  !0 !0 !0F&F &F &FP&I &I &IP"G "G "GH$ $ $2	H 	H 	H
O 
O 
OG G G6
; 
; 
;2% 2% 2%h
 
 
I I I.2 .2 .2`"A "A "AJH H H H Hr!   rz   c                       e Zd ZdZeZd ZdS )
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.
    c                 x    || _         || _        | j         j        t          j        t                      d| _        d S )N)serviceNameserviceVersioncreationDate)rc   r	   r   r   versionr   r   )r   rc   r	   s      r   r    zIRCFactory.__init__s  s9    
:?'/!GG
 
r!   N)rY   rZ   r[   ru  rz   r   r    r\   r!   r   r}  r}  g  s4          H
 
 
 
 
r!   r}  c                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )PBMindc                     d S r#   r\   rJ   s    r   r    zPBMind.__init__~      r!   c                     t          j        t                    }t          |t                    r|                    d          }||j                            |           fS Nr{   )r   qualr  r   rA  r   invokerregisterReferencer   jellierr  s      r   jellyForzPBMind.jellyFor  sO    |F##dC   	(;;w''DW_66t<<<<r!   c                     d S r#   r\   )r   r0   rj   s      r   remote_userJoinedzPBMind.remote_userJoined  r  r!   c                     d S r#   r\   )r   r0   rj   rF   s       r   remote_userLeftzPBMind.remote_userLeft  r  r!   c                     d S r#   r\   r   rN   rO   rP   s       r   remote_receivezPBMind.remote_receive  r  r!   c                     d S r#   r\   r   rj   r   s      r   remote_groupMetaUpdatezPBMind.remote_groupMetaUpdate  r  r!   N)	rY   rZ   r[   r    r  r  r  r  r  r\   r!   r   r  r  }  sn          = = =          r!   r  c                   ,    e Zd ZdZd Zd Zd ZddZdS )PBMindReferencer   c                    t           j                            |          rt          | j        | j        |          }nt          | j        | j        |          }|                     dt          | j        | j        |          ||          S )NrM   )r   r   r5   PBGrouprc   r   PBUser
callRemote)r   rN   rO   rP   recs        r   rM   zPBMindReference.receive  su    =##I.. 	=$*dk9==CCT[)<<Cvdj$+v>>W
 
 	
r!   c                 b    |                      dt          | j        | j        |          |          S )NrS   )r  r  rc   r   r  s      r   rS   zPBMindReference.groupMetaUpdate  s/    wtz4;FF
 
 	
r!   c           	          |                      dt          | j        | j        |          t	          | j        | j        |                    S )Nr9   r  r  rc   r   r  r   s      r   r9   zPBMindReference.userJoined  sA    DJU334:t{D11
 
 	
r!   Nc           	          |                      dt          | j        | j        |          t	          | j        | j        |          |          S )NrD   r  r   s       r   rD   zPBMindReference.userLeft  sD    DJU334:t{D11	
 
 	
r!   r#   )rY   rZ   r[   r   rM   rS   r9   rD   r\   r!   r   r  r    s\         D
 
 

 
 


 
 

 
 
 
 
 
r!   r  c                   .    e Zd Zd Zd Zd ZddZd ZdS )r  c                 0    || _         || _        || _        d S r#   )rc   r   rj   )r   rc   r   rj   s       r   r    zPBGroup.__init__  s    



r!   c                 b    t          | j        j        | j        j        | j        j        f          S r#   )hashrc   r   r   rj   rJ   s    r   processUniqueIDzPBGroup.processUniqueID  s$    TZ_dk&6
HIIIr!   c                 .   t          j        | j                  }t          |t                    r|                    d          }| j        j        }t          |t                    r|                    d          }|||j        	                    |           fS r  )
r   r  	__class__r   rA  r   rj   r   r  r  )r   r  r  rj   s       r   r  zPBGroup.jellyFor  s    |DN++dC   	(;;w''D
eS!! 	*LL))EUGO==dCCCCr!   Nc                 B    | j                             | j        |          S r#   )r   rq   rj   r   s     r   remote_leavezPBGroup.remote_leave  s    {  V444r!   c                 B    | j                             | j        |          S r#   )r   rs   rj   r   rP   s     r   remote_sendzPBGroup.remote_send  s    {
G444r!   r#   )rY   rZ   r[   r    r  r  r  r  r\   r!   r   r  r    sj          
J J JD D D5 5 5 55 5 5 5 5r!   r  c                   H    e Zd Zd ZddZd Zd Zd Zd ZddZ	d	 Z
d
 ZdS )PBGroupReferencec                     |\  }}}|| _         t          t          k    r9t          | j         t                    r| j                             d          | _         t
          j                            | |||g          S r  )r   r   rA  r   r   r   RemoteReference
unjellyFor)r   	unjellierunjellyListclsNamer   refs         r   r  zPBGroupReference.unjellyFor  sd    (s	C<<Jty%88<	((11DI!,,T9wnMMMr!   Nc                 .    |                      d|          S )Nrq   r  r   s     r   rq   zPBGroupReference.leave  s    w///r!   c                 .    |                      d|          S )Nrs   r  r  s     r   rs   zPBGroupReference.send  s    vw///r!   c                     d S r#   r\   ra  s     r   rA   zPBGroupReference.add      r!   c                     d S r#   r\   rJ   s    r   rX   zPBGroupReference.iterusers  r  r!   c                     d S r#   r\   r  s       r   rM   zPBGroupReference.receive  r  r!   c                     d S r#   r\   )r   r0   rF   s      r   r+   zPBGroupReference.remove  r  r!   c                     d S r#   r\   )r   r   s     r   rU   zPBGroupReference.setMetadata  r  r!   c                     d S r#   r\   rJ   s    r   rK   zPBGroupReference.size  r  r!   r#   )rY   rZ   r[   r  rq   rs   rA   rX   rM   r+   rU   rK   r\   r!   r   r  r    s        N N N0 0 0 00 0 0               r!   r  c                       e Zd Zd Zd ZdS )r  c                 0    || _         || _        || _        d S r#   )rc   r   r0   )r   rc   r   r0   s       r   r    zPBUser.__init__  s    
			r!   c                 b    t          | j        j        | j        j        | j        j        f          S r#   )r  rc   r   r   r0   rJ   s    r   r  zPBUser.processUniqueID  s$    TZ_dk&6	GHHHr!   N)rY   rZ   r[   r    r  r\   r!   r   r  r    s7          
I I I I Ir!   r  c                   p    e Zd Zd Zd Zd Zed             Zej        d             Zd Z	d Z
d Zdd
Zd	S )
ChatAvatarc                     || _         d S r#   )r   )r   r   s     r   r    zChatAvatar.__init__
  s    r!   c                     t          j        | j                  }t          |t                    r|                    d          }||j                            |           fS r  )r   r  r  r   rA  r   r  r  r  s      r   r  zChatAvatar.jellyFor  sQ    |DN++dC   	(;;w''DW_66t<<<<r!   c                 z      fd} j         j                            |          }|                    |           |S )Nc                 t      fd}j                                        }|                    |           |S )Nc                 D    t          j        j        j                  S r#   )r  r   rc   )ignoredrj   r   s    r   rk   z7ChatAvatar.remote_join.<locals>.cbGroup.<locals>.cbJoin  s    t{0$+uEEEr!   r  )rj   rk   r@   r   s   `  r   r  z'ChatAvatar.remote_join.<locals>.cbGroup  sV    F F F F F F   ''AMM&!!!Hr!   )r   rc   r  r=   )r   r  r  r@   s   `   r   remote_joinzChatAvatar.remote_join  sM    	 	 	 	 	 K&&y11	gr!   c                     d S r#   r\   rJ   s    r   r   zChatAvatar.name   	     	r!   c                     d S r#   r\   )r   r*   s     r   r   zChatAvatar.name%  r  r!   c                     d S r#   r\   r  s      r   rS   zChatAvatar.groupMetaUpdate*  r  r!   c                     d S r#   r\   r  s       r   rM   zChatAvatar.receive.  r  r!   c                     d S r#   r\   r   s      r   r9   zChatAvatar.userJoined2  r  r!   Nc                     d S r#   r\   r   s       r   rD   zChatAvatar.userLeft6  r  r!   r#   )rY   rZ   r[   r    r  r  propertyr   setterrS   rM   r9   rD   r\   r!   r   r  r    s          = = =     X 
[  [           r!   r  c                       e Zd Zd Zd ZdS )AvatarReferencec                 .    |                      d|          S )Nrm   r  )r   r  s     r   rm   zAvatarReference.join?  s    vy111r!   c                     t          j                    | j                            fd           | j        j                                         S )Nc                  .                          d           S r#   )callback)r@   s   r   r   z&AvatarReference.quit.<locals>.<lambda>D  s    qzz$/?/? r!   )r
   DeferredbrokernotifyOnDisconnectr   r   )r   r@   s    @r   quitzAvatarReference.quitB  sL    N&&'?'?'?'?@@@,,...r!   N)rY   rZ   r[   rm   r  r\   r!   r   r  r  >  s2        2 2 2    r!   r  c                   n    e Zd ZdZd Zd Zd Zd Zd Zd Z	dZ
d	Zd
 Zd Zd Zd Zd Zd Zd Zd ZdS )
WordsRealmr{   c                     || _         d S r#   r  r   s     r   r    zWordsRealm.__init__P  s    			r!   c                      t          |          S r#   )r^   r   s     r   userFactoryzWordsRealm.userFactoryS  s    Dzzr!   c                      t          |          S r#   )r   r   s     r   groupFactoryzWordsRealm.groupFactoryV  s    T{{r!   c                     fd}|S )Nc                  X     t          dd                        d x _         _        d S )Nrx   c                      d S r#   r\   r\   r!   r   r   z:WordsRealm.logoutFactory.<locals>.logout.<locals>.<lambda>\  s    T r!   )getattrrc   rd   )r   facets   r   rx   z(WordsRealm.logoutFactory.<locals>.logoutZ  s1    2GE8\\22444)--FL6;;;r!   r\   )r   r   r  rx   s    `` r   logoutFactoryzWordsRealm.logoutFactoryY  s)    	. 	. 	. 	. 	. 	.
 r!   c                      t          t                    r                     j                   fd}                                                   |          S )Nc                 
   | j         t          j                    D ]V} || d           }|F|                                _        _         | _        ||                    | |          fc S Wt                    r#   )rc   r   r   rf   r   r   r  NotImplementedError)r   r   r  avatarId
interfacesrd   r   s      r   	gotAvatarz+WordsRealm.requestAvatar.<locals>.gotAvatare  s    |',...# K Kfd++$OOD$/// (DI!%DJ"(DK %););FE)J)JJJJJ % &dJ777r!   )r   r   r   	_encodinggetUserr=   )r   r  rd   r  r  s   ```` r   requestAvatarzWordsRealm.requestAvatara  su    h&& 	7t~66H	8 	8 	8 	8 	8 	8 	8 	8 ||H%%11)<<<r!   c                     d S r#   r\   rJ   s    r   ru   zWordsRealm.itergroupst  r  r!   FTc                     t           r#   r  r   s     r   r   zWordsRealm.lookupUser|      !!r!   c                     t           r#   r  r]  s     r   r   zWordsRealm.lookupGroup  r  r!   c                     t           )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.
        r  ra  s     r   addUserzWordsRealm.addUser  s
     "!r!   c                     t           )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.
        r  r]  s     r   addGroupzWordsRealm.addGroup  s
     "!r!   c                       j         r. fd}                                                   |          S                                S )Nc                 l    |                      t          j                                                 S r#   )r   r   DuplicateGroupr   r&   r   r   s    r   r   z$WordsRealm.getGroup.<locals>.ebGroup  s,    .///''---r!   )createGroupOnRequestcreateGroupr:   r   )r   r   r   s   `` r   r  zWordsRealm.getGroup  se    $ 	>. . . . . . ##D))44W===%%%r!   c                       j         r. fd}                                                   |          S                                S )Nc                 l    |                      t          j                                                 S r#   )r   r   DuplicateUserr   r  s    r   r   z"WordsRealm.getUser.<locals>.ebUser  s*    -...t,,,r!   )createUserOnRequest
createUserr:   r   )r   r   r   s   `` r   r  zWordsRealm.getUser  sa    # 	<- - - - - - ??4((33F;;;t$$$r!   c                      fd} fd}                                                                }|                    ||           |                     j                   |S )Nc                 P    t          j        t          j                            S r#   )r   r$   r   r	  )r0   r   s    r   cbLookupz'WordsRealm.createUser.<locals>.cbLookup  s    ?6#7#=#=>>>r!   c                 l    |                      t          j                                                 S r#   )r   r   rh  r  r  s    r   ebLookupz'WordsRealm.createUser.<locals>.ebLookup  s,    HHV&'''##D)))r!   )r   r   r   r=   r  r   r   r  r  r@   s   ``   r   r  zWordsRealm.createUser  s    	? 	? 	? 	? 	?	* 	* 	* 	* 	* 	* zz||OOD!!	x***	dl###r!   c                      fd} fd}                                                                }|                    ||           |                     j                   |S )Nc                 P    t          j        t          j                            S r#   )r   r$   r   r  )rj   r   s    r   r  z(WordsRealm.createGroup.<locals>.cbLookup  s    ?6#8#>#>???r!   c                 l    |                      t          j                                                 S r#   )r   r   r   r  r  s    r   r  z(WordsRealm.createGroup.<locals>.ebLookup  s,    HHV'((($$T***r!   )r   r   r   r=   r   r  s   ``   r   r  zWordsRealm.createGroup  s    	@ 	@ 	@ 	@ 	@	+ 	+ 	+ 	+ 	+ 	+ zz||T""	x***	dm$$$r!   N)rY   rZ   r[   r  r    r  r  r  r  ru   r  r
  r   r   r  r   r  r  r  r  r\   r!   r   r  r  L  s        I        = = =&  
 !" " "" " "" " """ " "& & &% % %      r!   r  c                   <     e Zd Z fdZd Zd Zd Zd Zd Z xZ	S )InMemoryWordsRealmc                 V     t                      j        |i | i | _        i | _        d S r#   )superr    r   r`   )r   ar   r  s      r   r    zInMemoryWordsRealm.__init__  s1    !"r"""
r!   c                 X    t          j        | j                                                  S r#   )r
   r>   r`   r7   rJ   s    r   ru   zInMemoryWordsRealm.itergroups  s     }T[//11222r!   c                     |j         | j        v r7t          j        t	          j        t          j                                        S || j        |j         <   t          j        |          S r#   )	r   r   r
   failr   r$   r   r	  r>   ra  s     r   r  zInMemoryWordsRealm.addUser  sR    9
"":gof.B.D.DEEFFF $
49}T"""r!   c                     |j         | j        v r7t          j        t	          j        t          j                                        S || j        |j         <   t          j        |          S r#   )	r   r`   r
   r  r   r$   r   r  r>   r]  s     r   r   zInMemoryWordsRealm.addGroup  sR    :$$:gof.C.E.EFFGGG"'EJ}U###r!   c                     |                                 }	 | j        |         }t          j        |          S # t          $ r; t          j        t          j        t          j	        |                              cY S w xY wr#   )
r   r   r
   r>   rE   r  r   r$   r   rh  )r   r   r0   s      r   r   zInMemoryWordsRealm.lookupUser  s~    zz||	':d#D =&&&  	H 	H 	H:gof.?.E.EFFGGGGG	H   7 AA<;A<c                     |                                 }	 | j        |         }t          j        |          S # t          $ r; t          j        t          j        t          j	        |                              cY S w xY wr#   )
r   r`   r
   r>   rE   r  r   r$   r   r   )r   r   rj   s      r   r   zInMemoryWordsRealm.lookupGroup  s~    zz||	(K%E ='''  	I 	I 	I:gof.@.F.FGGHHHHH	Ir  )
rY   rZ   r[   r    ru   r  r   r   r   __classcell__)r  s   @r   r  r    s            
3 3 3# # #$ $ $' ' '( ( ( ( ( ( (r!   r  )r   r^   r  r  N)6ru  r   r   zope.interfacer   twistedr   twisted.credr   r   r   r	   twisted.internetr
   r   twisted.pythonr   r   r   twisted.python.componentsr   twisted.spreadr   twisted.wordsr   r   twisted.words.protocolsr   r   r   r   r^   r   r4   r   rz   ServerFactoryr}  Referenceabler  r  r  setUnjellyableForClassr  r  r  r  IPerspectiver  IRealmIChatServicer  r  __all__r\   r!   r   <module>r2     s  
 2         & & & & & &       < < < < < < < < < < , , , , , , , , 0 0 0 0 0 0 0 0 0 0 5 5 5 5 5 5       ( ( ( ( ( ( ( ( ' ' ' ' ' ' V]J) J) J) J) J) J) J) J)Z V\% % % % % % % %P ( V  }
H }
H }
H }
H }
Hcg }
H }
H ! }
H@
 
 
 
 
' 
 
 
,    R   . V  
 
 
 
 
b( 
 
 ! 
D  &/ 2 2 25 5 5 5 5b 5 5 52 V]$ $ $ $ $r) $ $ $N  '#3 4 4 4I I I I IR I I I V  / / / / /! / / ! /d 
FL"/ : : :    b(     *o 6 6 6 V]F/00B B B B B B B 10BJ%( %( %( %( %( %( %( %(P  r!   