
    Vh&                     ^   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j8                         G d d             Z eej<                         G d d             ZdZ  eejB                         G d dejD                               Z# G d dejH                        Z% G d dejL                        Z' eejB                         G d dejP                               Z) ejT                  e'e)        G d dejL                        Z+ eej8                         G d dejP                               Z, ejT                  e+e,        G d dejL                        Z- eejB                         G d d ejL                               Z. ee.ej<                  ej^                          G d! d"ejP                        Z0 ejT                  e.e0        eejb                  ejd                         G d# d$             Z3 G d% d&e3      Z4g d'Z5y())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                   D    e Zd Zd Zd Zd Zd ZddZd Zd Z	d	 Z
d
 Zy)Groupc                 4    || _         i | _        ddd| _        y )N )topictopic_author)nameusersmetaselfr   s     E/home/dcms/DCMS/lib/python3.12/site-packages/twisted/words/service.py__init__zGroup.__init__.   s    	

	    c                 @    t        j                  t        ||            S N)r   Failure	Exception)r   errps      r   _ebUserCallzGroup._ebUserCall6   s    yC011r!   c                 |    |D ]7  \  }}|r	|j                   \  }}| j                  ||j                                9 y r#   )valueremovegetErrorMessage)r   resultssuccessresultuserr&   s         r   _cbUserCallzGroup._cbUserCall9   s<    & 	9OGV"LL	cD#"5"5"78	9r!   c                 >   t         j                  j                  |      sJ dj                  |             |j                  | j
                  vrg }|| j
                  |j                  <   | j
                  j                         D ]V  }||ust        j                  |j                  | |      }|j                  | j                  |       |j                  |       X t        j                  |      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 	
4O4V4V5
 	
2 99DJJ&I$(DJJtyy!ZZ&&( (D=++ALL$EALL!1!1QL7$$Q'	(
 y)55d6F6FG}}T""r!   Nc                    	 | j                   |j                  = g }| j                   j                         D ]W  }||ust        j                  |j
                  | ||      }|j                  | j                  |       |j                  |       Y t        j                  |      j                  | j                         t        j                  d       S # t        $ r Y  w xY w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

499% HZZ&&( 'D=++AJJdFKALL!1!1QL7OOA&	'
 x(44T5E5EF}}T""  		s   C 	CCc                 R    t        j                  t        | j                              S r#   )r
   r>   lenr   r   s    r   sizez
Group.size]   s    }}S_--r!   c                    || u sJ g }| j                   j                         D ]W  }||ust        j                  |j                  || |      }|j                  | j                  |       |j                  |       Y t        j                  |      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T--3"		#
 	8$001A1AB}}T""r!   c                 v   || _         g }| j                  j                         D ]Q  }t        j                  |j
                  | |      }|j                  | j                  |       |j                  |       S t        j                  |      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$5$5tTBALL))QL/KKN	 	4 ,,T-=-=>}}T""r!   c                 H    t        | j                  j                               S r#   )iterr   r7   rJ   s    r   	iteruserszGroup.iterusersu   s    DJJ%%'((r!   r#   )__name__
__module____qualname__r    r(   r1   rA   r+   rK   rM   rU   rX    r!   r   r   r   ,   s/    
29##.	##)r!   r   c                   @    e Zd ZdZdZd Zd Zd Zd	dZd Z	d Z
d Zy)
UserNc                 >    || _         g | _        t               | _        y r#   )r   groupsr   lastMessager   s     r   r    zUser.__init__   s    	6r!   c                 >    || _         || _        t               | _        y r#   )realmmindr   signOn)r   rc   rd   s      r   loggedInzUser.loggedIn   s    
	fr!   c                 f      fd}j                   j                        j                  |      S )Nc                 >    j                   j                         | S r#   )r`   r;   r/   groupr   s    r   cbJoinzUser.join.<locals>.cbJoin       KKu%Mr!   )rA   rd   r=   )r   rj   rk   s   `` r   joinz	User.join   s(    	 yy#//77r!   c                 h      fd}j                   j                  |      j                  |      S )Nc                 >    j                   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   s*    	 ||DIIv.::7CCr!   c                 Z    t               | _        |j                  | j                  ||      S r#   )r   ra   rM   rd   )r   rO   rP   s      r   sendz	User.send   s%    6  Iw??r!   c                 ,    t        | j                        S r#   )rW   r`   rJ   s    r   
itergroupszUser.itergroups   s    DKK  r!   c                 N    | j                   d d  D ]  }| j                  |        y r#   )r`   rq   )r   gs     r   logoutzUser.logout   s$    Q 	AJJqM	r!   r#   )rY   rZ   r[   rc   rd   r    rf   rm   rq   rs   ru   rx   r\   r!   r   r^   r^   z   s1    ED"

8D@!r!   r^   zNickServ!NickServ@servicesc                      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j0                  dfej2                  dfej4                  dfej6                  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, Z6y).IRCUserzM
    Protocol instance representing an IRC user connected to the server.
    Nutf-8c                     | j                   | _        | j                  j                  | _        | j                  j                  | _        y r#   )irc_NICKSERV_PRIVMSGirc_PRIVMSGfactoryrc   r   hostnamerJ   s    r   connectionMadezIRCUser.connectionMade   s0    44\\''


r!   c                 L    | j                   | j                          d | _        y y r#   )rx   avatarr   rF   s     r   connectionLostzIRCUser.connectionLost   s!    ;;"KKMDK #r!   c                 ^   d|vr| j                   |d<   d|vr(| j                  j                  | j                        |d<   | ||d   gt	        |      z   }g }|D ]4  }t        |t              r|j                  d      }|j                  |       6 t        j                  j                  |i | y )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>yy''6BtH"T(+d>.BB 	'C#u%jj)!!#&	' 	^2r2r!   c                     | j                  |j                   d|j                   d| j                   d|j                  z          y )N!@#)rm   r   r   r   rj   r0   s      r   r9   zIRCUser.userJoined   s6    		TYYKq1T]]O<cEJJ>NOr!   c                     | j                  |j                   d|j                   d| j                   d|j                  z   |xs d       y )Nr   r   r   leaving)partr   r   r   rj   r0   rF   s       r   rD   zIRCUser.userLeft   sB    		yyk499+Qt}}o6%** y	
r!   c                 :   t         j                  j                  |      rd|j                  z   }n|j                  }|j	                  dd      }|j                         D ];  }| j                  |j                   d|j                   d| j                   ||       = y )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.)..0M%NNM{{6#AB" 	ALL;;-qQt}}o>	r!   c           
          d|v rU|d   }|j                  dd      }| j                  | j                  d|j                  z   || d| d| j                          y y )Nr   r   r   r   r   r   )r   r   r   r   )r   rj   r   r   authors        r   rS   zIRCUser.groupMetaUpdate   sa    d?MEXXnb1FJJ		ejj (!F81T]]O4	 r!   c                     |d   | _         y)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                  | j                        }|| _
        || _        | j                  D ].  \  }}| j                  ||| j                  j                  z         0 | j                   | j                  t        |d       y| j                   }d| _        | j#                  ||       y# t        $ r= | j                  t        t        |      d       | j                  j                          Y yw xY w)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 !	,, 	DJD$T4$,,*B*B#BC	D == LL8[9}}H DMLL8,) " 	LLXM
 NN))+	s   +C ADDc                     |d   | _         y)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                  j                          y|j                         dk7  r"| j	                  t
        | j                   d       y| j                   }d| _         | j                  ||       y)^
        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:  sw     ":== NN))+\\^z)LLC }}H DMLL8,r!   c                     | j                   j                  j                  t        j                  ||      | t
        j                        }|j                  | j                  | j                  |f       y )N)errbackArgs)
r   r	   loginr   UsernamePasswordr   IUseraddCallbacks_cbLogin_ebLogin)r   r   r   r@   s       r   r   zIRCUser.logInAsQ  sR    LL%%((8<dFLL
 	
t}}dmm(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                  j                  z         0 y )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}    "($F(<UI&FF$ // 	DJD$T4$,,*B*B#BC	Dr!   c                    |j                  t        j                        r| j                  t        |d       nx|j                  t
        j                        r| j                  t        |d       nAt        j                  d       t        j                  |       | j                  t        |d       | j                  j                          y )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++,LL($P YYu../LL8-FGGG34GGCLLL8-QR%%'r!   c                 V    | j                   | j                  d| j                         yy)zK
        Ping message

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

        Parameters: [ <Quit Message> ]
        N)r   r   r   s      r   irc_QUITzIRCUser.irc_QUIT  s     	%%'r!   c                     |r!| j                  t        j                  d       y | j                  | j                  d|j                  z   d       y )N:Unknown MODE flag.r   +)r   r   ERR_UNKNOWNMODEchannelModer   )r   rj   modesargss       r   _channelModezIRCUser._channelMode  s;    S002GHTYYejj(8#>r!   c                     |r!| j                  t        j                  d       y || j                  u r!| j                  t        j                  d       y | j                  t        j
                  d       y )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  sV    S002GHT[[ S__c2&&(Rr!   c           	      $    	 d   }t        |t              r|j                   j                        }|j                  d      rO fd} j                  j                  |dd       }|j                   j                  |t        dd              y fd} j                  j                  |      }|j                   j                  |t        dd              y# t        $ r'  j                  t        j                  d   d       Y yw xY w)	z
        User mode message

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

        r   z2:No such nickname (could not decode your unicode!)Nr   c                     | j                  t        j                         j                  t        j
                  d   d       y )Nr   :That channel doesn't exist.trapr   NoSuchGroupr   r   ERR_NOSUCHCHANNELr&   r   r   s    r   ebGroupz!IRCUser.irc_MODE.<locals>.ebGroup  s5    ++,  ))6!96Tr!      )callbackArgsc                 F    j                  t        j                  d       y )Nz:No such nickname.r   r   ERR_NOSUCHNICK)r&   r   s    r   ebUserz IRCUser.irc_MODE.<locals>.ebUser  s      !3!35I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  s    
	"1IM-/ - 4 4T]] C ##C( 

&&}QR'89ANN4,,gE&QRQS*DUNVK 

%%m4ANN4>>6fQRj@QNR1 " 	""q	D
 	s   0C -DDc                      y)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                   j                        |d   j                  d      r j                  j                  dd       }n+ j                  j                        j                  d       } fd} fd	}|j                  ||       y# t        $ r'  j                  t        j                  |d   d       Y yw xY w)
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
    TYY r!   c                 F    | j                   j                  | di      S y )Nr   )r   rs   )targmessageTextr   s    r   cbTargetz%IRCUser.irc_PRIVMSG.<locals>.cbTarget  s*    {{''v{.CDD  r!   c                 H    j                  t        j                  d       y )Nz:No such nick/channel.r   )r&   r   
targetNames    r   ebTargetz%IRCUser.irc_PRIVMSG.<locals>.ebTarget  s    S//=U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  s    
	J*e,'..t}}=
 Rj  %ZZ++JqrN;FZZ**:6BB&F	E	W 	Hh// " 	""q	H
 	s   0B4 4-C$#C$c                 h    	 |d   t        t              rj                   j                        j                  d      rdd  fd} fd} j                  j                        j                  ||       y# t        $ r'  j                  t        j                  |d   d       Y yw xY w)zm
        Join message

        Parameters: ( <channel> *( "," <channel> ) [ <key> *( "," <key> ) ] )
        r   1:No such channel (could not decode your unicode!)Nr   r   c                 f      fd}j                   j                         j                  |      S )Nc                     j                         j                  j                  dj                  z   j                         D cg c]  }|j                   c}       j	                         y c c}w Nr   )r9   namesr   rX   
_sendTopic)ignr0   rj   r   s     r   rk   z1IRCUser.irc_JOIN.<locals>.cbGroup.<locals>.cbJoin  s\    t,

II%**$+0??+<=4TYY=
 & >s   
A6r   rm   r=   )rj   rk   r   s   ` r   cbGroupz!IRCUser.irc_JOIN.<locals>.cbGroup  s*    ' ;;##E*66v>>r!   c                 N    j                  t        j                  dz   d       y )Nr   z:No such channel.)r   r   r   r&   	groupNamer   s    r   r   z!IRCUser.irc_JOIN.<locals>.ebGroup  s#    %%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]];	 $!!"I
	?	
 	

I&33GWE9 " 	%%q	C
 	   0B -B10B1c                     	 |d   t        |d   t              r|d   j                   j                        j                  d      rdd t        |      dkD  r'|d   t        t              rj                  d      nd fd} fd} j                  j                        j                  ||       y# t        $ r'  j                  t        j                  |d   d       Y yw xY w)	zc
        Part message

        Parameters: <channel> *( "," <channel> ) [ <Part Message> ]
        r   z:Could not decode your unicode!Nr   r   r{   c                 j      fd}j                   j                         j                  |      S )Nc                 ,    j                         y r#   )rD   )r/   rj   rF   r   s    r   rp   z2IRCUser.irc_PART.<locals>.cbGroup.<locals>.cbLeave@  s    eT62r!   )r   rq   r=   )rj   rp   rF   r   s   ` r   r  z!IRCUser.irc_PART.<locals>.cbGroup?  s,    3 ;;$$UF3??HHr!   c                     | j                  t        j                         j                  t        j
                  dz   d| j                         z          y )Nr   :)r   r   r   r   r   ERR_NOTONCHANNELr,   r  s    r   r   z!IRCUser.irc_PART.<locals>.ebGroupE  sB    HHV''($$cIosS=P=P=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%  s    	q	I&)U+"1I,,T]];	 $!!"Iv;?AYF&%(w/F	I	 	

y)66wH9 " 	$$fQi1R 		s   6C   -C0/C0c                 h    	 |d   t        t              rj                   j                        j                  d      rdd  fd} fd} j                  j                        j                  ||       y# t        $ r'  j                  t        j                  |d   d       Y yw xY w)zb
        Names message

        Parameters: [ <channel> *( "," <channel> ) [ <target> ] ]
        r   r  Nr   r   c                     j                  j                  d| j                  z   | j                         D cg c]  }|j                   c}       y c c}w r  )r  r   rX   )rj   r0   r   s     r   r  z"IRCUser.irc_NAMES.<locals>.cbGroupe  s<    JJ		3+EOODU-VDdii-V-Vs   Ac                     | j                  t        j                         j                  j                  dz   g        y r  )r   r   r   r  r   r&   channelr   s    r   r   z"IRCUser.irc_NAMES.<locals>.ebGroupj  s-    HHV''(JJtyy#-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)!..7 c"abkG	
	5
 	

w'44WgF+ " 	%%r
C
 	r  c                 `   	 |d   }t        |d   t              r|j                  | j                        }|j                  d      r|dd }t        |      dkD  r| j                  ||d          y| j                  |       y# t        $ r# | j                  t        j                  d       Y yw xY w)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+!..7 c"abkGv;?NN7F1I.NN7# " 	%%N 	s   3B )B-,B-c                 `   |j                   j                  d      }|r|j                   j                  d      xs d}|j                   j                  dd      }| j                  | j                  d|j                  z   |       | j	                  | j                  d|j                  z   ||       yy)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'ZZ^^N3@yF::>>,2DJJtyy#

"2E:TYYejj(8&$G	 r!   c                 ~      fd} j                   j                        j                   j                  |       y )Nc                     | j                  t        j                         j                  t        j
                  dd       y N=r   r   r!  s    r   r   z"IRCUser._getTopic.<locals>.ebGroup  3    HHV''(%%sG5Sr!   )rc   r   r   r  )r   r"  r   s   `` r   r&  zIRCUser._getTopic  s-    	 	

w'44T__gNr!   c                 x      fd} fd} j                   j                        j                  ||       y )Nc                       j                   j                         }|d<   j                  |d<   t        t	                     |d<    fd} j                  |      j                  |      S )Nr   r   r)  c                 b    j                  t        j                  dj                  z   d       y )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  s)      ,,%**$Dr!   )r   copyr   intr   rU   r:   )rj   newMetar5  r   r   s   `  r   r  z"IRCUser._setTopic.<locals>.cbGroup  s^    jjoo'G$GG&*iiGN#$'KGL! $$W-88??r!   c                     | j                  t        j                         j                  t        j
                  dd       y r.  r   r!  s    r   r   z"IRCUser._setTopic.<locals>.ebGroup  r0  r!   )rc   r   r   )r   r"  r   r  r   s   ```  r   r%  zIRCUser._setTopic  s/    	@	 	

w'44WgFr!   c                     |D ]4  \  }}}| j                  t        j                  |t        |      d|z          6 | j                  t        j                  d       y)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  sP     "* 	ID$S\\4TC%KH	I/:r!   c                 :    |r	 |d   }t        |t              r|j                   j                        }|j	                  d      }g }|D ]B  }|j                  d      r|dd }|j                   j                  j                  |             D t        j                  |d      }|j                  d	        n j                  j!                         } fd
}|j                  |       y# t
        $ r'  j                  t        j                  |d   d       Y yw xY w)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 cg c]
  \  }}|s	| c}}S c c}}w r#   r\   )gssrs      r   r   z"IRCUser.irc_LIST.<locals>.<lambda>  s    2*C!Q1*C *Cs   
c           	          d }t        j                  | D cg c]"  }|j                         j                  ||      $ c}      }|j                  fd       |S c c}w )Nc                 R    |j                   | |j                  j                  d      fS )Nr   )r   r   r   )rK   rj   s     r   gotSizez3IRCUser.irc_LIST.<locals>.cbGroups.<locals>.gotSize  s     zz4)@@@r!   c                 ^    j                  | D cg c]
  \  }}|s	| c}}      S c c}}w r#   )r   )r-   rD  rE  r   s      r   r   z4IRCUser.irc_LIST.<locals>.cbGroups.<locals>.<lambda>  s%    $))W4R6AqPQQ4R*S 4Rs   
)
)
)r
   r<   rK   r=   )r`   rH  rj   r@   r   s       r   cbGroupsz"IRCUser.irc_LIST.<locals>.cbGroups  sV    A ""GMNe))'59NA MMSTH Os   'A)r   r   r   r   splitr   r   r   r   r   r;   rc   r   r
   r<   r=   ru   )r   r   r   allChannelsr>  r`   chrJ  s   `       r   irc_LISTzIRCUser.irc_LIST  s    $Qik51"-"4"4T]]"CK&,,S1 F :==%ABBdjj44R89:
 ''dCFCD ZZ**,F	 	8$= &   ))1IG
 s   AC* *-DDc                     | j                  | j                  d|j                  z   |j                         D cg c]G  }|j                  | j                  | j                  j                  |j                  dd|j                  fI c}       y c c}w )Nr   Hr   )whor   rX   r   rc   )r   rj   ms      r   _channelWhozIRCUser._channelWho  sl    II%** * 

aP	
s   ABc                 D    | j                  t        j                  d       y )Nz:User /WHO not implemented)r   r   RPL_ENDOFWHOr   r0   s     r   _userWhozIRCUser._userWho  s    ))+GHr!   c                 4    |s! j                  t        j                  d       y	 |d   t        t              rj                   j                        j                  d      rA fd} j                  j                  dd       }|j                   j                  |       y fd} j                  j                        }|j                   j                  |       y# t        $ r'  j                  t        j                  |d   d       Y yw xY w)	zC
        Who query

        Parameters: [ <mask> [ "o" ] ]
        z:/WHO not supported.Nr   z2:End of /WHO list (could not decode your unicode!)r   c                     | j                  t        j                         j                  t        j
                  d       y Nz:End of /WHO list.)r   r   r   r   r   rU  r&   r   r   s    r   r   z IRCUser.irc_WHO.<locals>.ebGroup*  s.    ++,  !1!1=BVWr!   r   c                     | j                  t        j                         j                  t        j
                  d       y rZ  )r   r   
NoSuchUserr   r   rU  r[  s    r   r   zIRCUser.irc_WHO.<locals>.ebUser2  s.    **+  !1!1=BVWr!   )r   r   rU  r   r   r   r   r   r   rc   r   r   rS  r   rW  )r   r   r   r   r@   r   r   s   `     @r   irc_WHOzIRCUser.irc_WHO	  s     S--/EF
	"1IM-/ - 4 4T]] C ##C(X 

&&}QR'89ANN4++W5X 

%%m4ANN4==&1/ " 	  q	D
 	s   0C' '-DDc                 <     fd} fd}	 d   }t        |t              r|j                   j                        } j                  j                  |      j                  ||       y# t        $ r'  j                  t        j                  d   d       Y yw xY w)zV
        Whois query

        Parameters: [ <target> ] <mask> *( "," <mask> )
        c                    j                  j                  | j                  | j                  j                  j                  | j                  j                  j                  ddt        t	               | j
                  z
        | j                  | j                         D cg c]  }d|j                  z    c}       y c c}w )NzHi mom!Fr   )whoisr   rc   r7  r   ra   re   ru   )r0   rj   r   s     r   cbUserz!IRCUser.irc_WHOIS.<locals>.cbUser@  s    JJ						

		

DFT---./3/@Aeuzz!A Bs   !B?c                     | j                  t        j                         j                  t        j
                  d   d       y )Nr   :No such nick/channel)r   r   r]  r   r   r   r   s    r   r   z!IRCUser.irc_WHOIS.<locals>.ebUserO  s2    HHV&&'S//<STr!   r   rd  N)r   r   r   r   r   r   r   r   rc   r   r   )r   r   r   rb  r   r0   s   ` `   r   	irc_WHOISzIRCUser.irc_WHOIS9  s    		U	!9D$&{{4==1
 	

d#00@	 " 	S//<ST	s   0A+ +-BBc                 D    | j                  t        j                  d       y)zE
        Oper message

        Parameters: <name> <password>
        z:O-lines not applicableN)r   r   ERR_NOOPERHOSTr   s      r   irc_OPERzIRCUser.irc_OPER^  s     	++-F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   rN  rS  rW  r^  re  rh  r\   r!   r   rz   rz      sl   
 F F F E H(
3P
"	 HH# -D	#-.N 
56O	
 
HI
 NN 5		
& 
		FG			45M

D(4(?$SL!0F&FP&IP"GH$2	H
OG6
;2%h
I.2`"AJHr!   rz   c                       e Zd ZdZeZd Zy)
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                     || _         || _        | j                   j                  t        j                  t               d| _        y )N)serviceNameserviceVersioncreationDate)rc   r	   r   r   versionr   r   )r   rc   r	   s      r   r    zIRCFactory.__init__s  s3    
::??'//!G
r!   N)rY   rZ   r[   ri  rz   r   r    r\   r!   r   rq  rq  g  s     H
r!   rq  c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)PBMindc                      y r#   r\   rJ   s    r   r    zPBMind.__init__~      r!   c                     t        j                  t              }t        |t              r|j                  d      }||j                  j                  |       fS Nr{   )r   qualrx  r   r<  r   invokerregisterReferencer   jellierr}  s      r   jellyForzPBMind.jellyFor  sB    ||F#dC ;;w'DW__66t<<<r!   c                      y r#   r\   )r   r0   rj   s      r   remote_userJoinedzPBMind.remote_userJoined  rz  r!   c                      y r#   r\   )r   r0   rj   rF   s       r   remote_userLeftzPBMind.remote_userLeft  rz  r!   c                      y r#   r\   r   rN   rO   rP   s       r   remote_receivezPBMind.remote_receive  rz  r!   c                      y r#   r\   r   rj   r   s      r   remote_groupMetaUpdatezPBMind.remote_groupMetaUpdate  rz  r!   N)	rY   rZ   r[   r    r  r  r  r  r  r\   r!   r   rx  rx  }  s     =r!   rx  c                   *    e Zd ZdZd Zd Zd ZddZy)PBMindReferencer   c                 ,   t         j                  j                  |      r"t        | j                  | j
                  |      }n!t        | j                  | 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  sk    ==##I.$**dkk9=CT[[)<Cvdjj$++v>W
 	
r!   c                 f    | j                  dt        | j                  | j                  |      |      S )NrS   )r  r  rc   r   r  s      r   rS   zPBMindReference.groupMetaUpdate  s+    wtzz4;;F
 	
r!   c           	          | j                  dt        | j                  | j                  |      t	        | j                  | j                  |            S )Nr9   r  r  rc   r   r  r   s      r   r9   zPBMindReference.userJoined  s>    DJJU34::t{{D1
 	
r!   Nc           	          | j                  dt        | j                  | j                  |      t	        | j                  | j                  |      |      S )NrD   r  r   s       r   rD   zPBMindReference.userLeft  sA    DJJU34::t{{D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y)r  c                 .    || _         || _        || _        y r#   )rc   r   rj   )r   rc   r   rj   s       r   r    zPBGroup.__init__  s    

r!   c                     t        | j                  j                  | j                  j                  | j                  j                  f      S r#   )hashrc   r   r   rj   rJ   s    r   processUniqueIDzPBGroup.processUniqueID  s.    TZZ__dkk&6&6

HIIr!   c                 ,   t        j                  | j                        }t        |t              r|j                  d      }| j                  j                  }t        |t              r|j                  d      }|||j                  j                  |       fS r|  )
r   r}  	__class__r   r<  r   rj   r   r~  r  )r   r  r}  rj   s       r   r  zPBGroup.jellyFor  sm    ||DNN+dC ;;w'D

eS!LL)EUGOO==dCCCr!   Nc                 N    | j                   j                  | j                  |      S r#   )r   rq   rj   r   s     r   remote_leavezPBGroup.remote_leave  s    {{  V44r!   c                 N    | j                   j                  | j                  |      S r#   )r   rs   rj   r   rP   s     r   remote_sendzPBGroup.remote_send  s    {{

G44r!   r#   )rY   rZ   r[   r    r  r  r  r  r\   r!   r   r  r    s    
JD55r!   r  c                   F    e Zd Zd ZddZd Zd Zd Zd ZddZ	d	 Z
d
 Zy)PBGroupReferencec                     |\  }}}|j                  d      | _        t        j                  j	                  | |||g      S r|  )r   r   r   RemoteReference
unjellyFor)r   	unjellierunjellyListclsNamer   refs         r   r  zPBGroupReference.unjellyFor  s=    (sKK(	!!,,T9wnMMr!   Nc                 &    | j                  d|      S )Nrq   r  r   s     r   rq   zPBGroupReference.leave  s    w//r!   c                 &    | j                  d|      S )Nrs   r  r  s     r   rs   zPBGroupReference.send  s    vw//r!   c                      y r#   r\   rV  s     r   rA   zPBGroupReference.add      r!   c                      y r#   r\   rJ   s    r   rX   zPBGroupReference.iterusers  r  r!   c                      y r#   r\   r  s       r   rM   zPBGroupReference.receive  r  r!   c                      y r#   r\   )r   r0   rF   s      r   r+   zPBGroupReference.remove  r  r!   c                      y r#   r\   )r   r   s     r   rU   zPBGroupReference.setMetadata  r  r!   c                      y 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    s0    N
00r!   r  c                       e Zd Zd Zd Zy)r  c                 .    || _         || _        || _        y r#   )rc   r   r0   )r   rc   r   r0   s       r   r    zPBUser.__init__  s    
	r!   c                     t        | j                  j                  | j                  j                  | j                  j                  f      S r#   )r  rc   r   r   r0   rJ   s    r   r  zPBUser.processUniqueID  s.    TZZ__dkk&6&6		GHHr!   N)rY   rZ   r[   r    r  r\   r!   r   r  r    s    
Ir!   r  c                   l    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y	)
ChatAvatarc                     || _         y r#   )r   )r   r   s     r   r    zChatAvatar.__init__  s	    r!   c                     t        j                  | j                        }t        |t              r|j                  d      }||j                  j                  |       fS r|  )r   r}  r  r   r<  r   r~  r  r  s      r   r  zChatAvatar.jellyFor
  sF    ||DNN+dC ;;w'DW__66t<<<r!   c                 ~      fd} j                   j                  j                  |      }|j                  |       |S )Nc                 n      fd}j                   j                         }|j                  |       |S )Nc                 Z    t        j                  j                  j                        S r#   )r  r   rc   )ignoredrj   r   s    r   rk   z7ChatAvatar.remote_join.<locals>.cbGroup.<locals>.cbJoin  s     t{{00$++uEEr!   r  )rj   rk   r@   r   s   `  r   r  z'ChatAvatar.remote_join.<locals>.cbGroup  s0    F   'AMM&!Hr!   )r   rc   r  r=   )r   r  r  r@   s   `   r   remote_joinzChatAvatar.remote_join  s5    	 KK&&y1	gr!   c                      y r#   r\   rJ   s    r   r   zChatAvatar.name       	r!   c                      y r#   r\   )r   r*   s     r   r   zChatAvatar.name"  r  r!   c                      y r#   r\   r  s      r   rS   zChatAvatar.groupMetaUpdate'  r  r!   c                      y r#   r\   r  s       r   rM   zChatAvatar.receive+  r  r!   c                      y r#   r\   r   s      r   r9   zChatAvatar.userJoined/  r  r!   Nc                      y r#   r\   r   s       r   rD   zChatAvatar.userLeft3  r  r!   r#   )rY   rZ   r[   r    r  r  propertyr   setterrS   rM   r9   rD   r\   r!   r   r  r    sQ    =   
[[ r!   r  c                       e Zd Zd Zd Zy)AvatarReferencec                 &    | j                  d|      S )Nrm   r  )r   r  s     r   rm   zAvatarReference.join<  s    vy11r!   c                     t        j                         | j                  j                  fd       | j                  j                  j                          S )Nc                  &     j                  d       S r#   )callback)r@   s   r   r   z&AvatarReference.quit.<locals>.<lambda>A  s    qzz$/? r!   )r
   DeferredbrokernotifyOnDisconnectr   r   )r   r@   s    @r   quitzAvatarReference.quit?  s=    NN&&'?@,,.r!   N)rY   rZ   r[   rm   r  r\   r!   r   r  r  ;  s    2r!   r  c                   l    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y)
WordsRealmr{   c                     || _         y r#   )r   r   s     r   r    zWordsRealm.__init__M  s	    	r!   c                     t        |      S r#   )r^   r   s     r   userFactoryzWordsRealm.userFactoryP  s    Dzr!   c                     t        |      S r#   )r   r   s     r   groupFactoryzWordsRealm.groupFactoryS  s    T{r!   c                     fd}|S )Nc                  H     t        dd               d x _         _        y )Nrx   c                       y r#   r\   r\   r!   r   r   z:WordsRealm.logoutFactory.<locals>.logout.<locals>.<lambda>Y  s    r!   )getattrrc   rd   )r   facets   r   rx   z(WordsRealm.logoutFactory.<locals>.logoutW  s"    2GE8\24)--FL6;r!   r\   )r   r   r  rx   s    `` r   logoutFactoryzWordsRealm.logoutFactoryV  s    	.
 r!   c                      t        t              rj                   j                         fd} j	                        j                  |      S )Nc                     | j                   t        j                         D ]K  } || d       }|| j                         _        _         | _        ||j                  | |      fc S  t              r#   )rc   r   r   rf   r   r   r  NotImplementedError)r   r   r  avatarId
interfacesrd   r   s      r   	gotAvatarz+WordsRealm.requestAvatar.<locals>.gotAvatarb  s    ||',,..# Kfd+$OOD$/ (DI!%DJ"(DK %););FE)JJJK &dJ77r!   )r   r   r   	_encodinggetUserr=   )r   r  rd   r  r  s   ```` r   requestAvatarzWordsRealm.requestAvatar^  s@    h&t~~6H	8 ||H%11)<<r!   c                      y r#   r\   rJ   s    r   ru   zWordsRealm.itergroupsq  r  r!   FTc                     t         r#   r  r   s     r   r   zWordsRealm.lookupUsery      !!r!   c                     t         r#   r  r   rj   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  rV  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} j                        j                  |      S  j                        S )Nc                 d    | j                  t        j                         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  s@    $$. ##D)44W==%%r!   c                       j                   r& fd} j                        j                  |      S  j                        S )Nc                 d    | j                  t        j                         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  s<    ##- ??4(33F;;t$$r!   c                      fd} fd}j                          j                        }|j                  ||       |j                   j                         |S )Nc                 T    t        j                  t        j                              S r#   )r   r$   r   r  )r0   r   s    r   cbLookupz'WordsRealm.createUser.<locals>.cbLookup  s    ??6#7#7#=>>r!   c                 d    | j                  t        j                         j                        S r#   )r   r   r]  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  sK    	?	* zz|OOD!	x*	dll#r!   c                      fd} fd}j                          j                        }|j                  ||       |j                   j                         |S )Nc                 T    t        j                  t        j                              S r#   )r   r$   r   r  )rj   r   s    r   r  z(WordsRealm.createGroup.<locals>.cbLookup  s    ??6#8#8#>??r!   c                 d    | j                  t        j                         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  sN    	@	+ zz|T"	x*	dmm$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  I  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                 @    t        |   |i | i | _        i | _        y r#   )superr    r   r`   )r   ar   r  s      r   r    zInMemoryWordsRealm.__init__  s#    !"r"
r!   c                 \    t        j                  | j                  j                               S r#   )r
   r>   r`   r7   rJ   s    r   ru   zInMemoryWordsRealm.itergroups  s    }}T[[//122r!   c                    |j                   | j                  v r:t        j                  t	        j
                  t        j                                     S || j                  |j                   <   t        j                  |      S r#   )	r   r   r
   failr   r$   r   r  r>   rV  s     r   r  zInMemoryWordsRealm.addUser  sT    99

"::goof.B.B.DEFF $

499}}T""r!   c                    |j                   | j                  v r:t        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  sT    ::$::goof.C.C.EFGG"'EJJ}}U##r!   c                     |j                         }	 | 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   r0   s      r   r   zInMemoryWordsRealm.lookupUser  sg    zz|	'::d#D ==&&  	H::goof.?.?.EFGG	H   6 AA=<A=c                     |j                         }	 | 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  sg    zz|	(KK%E ==''  	I::goof.@.@.FGHH	Ir  )
rY   rZ   r[   r    ru   r  r  r   r   __classcell__)r  s   @r   r  r    s!    
3#$'(r!   r  )r   r^   r  r  N)6ri  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   ServerFactoryrq  Referenceablerx  r  r  setUnjellyableForClassr  r  r  r  IPerspectiver  IRealmIChatServicer  r  __all__r\   r!   r   <module>r'     s'  
2  &  < < , 0 0 5  ( ' V]]J) J) J)Z V\\% % %P ( V }
Hcgg }
H !}
H@
'' 
,R . V 
b(( 
 !
B   &/ 25b 52 V]]"r)) " "J   '#3 4IR I V /!! / !/d 
FLL"// :b((    *o 6 V]]F//0B B 1BJ%( %(Pr!   