
NEQ                 @   s  d  Z  d Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l m	 Z	 m
 Z
 m Z m Z d d l m Z d d   Z e j e  Z d d	   Z d
 d   Z Gd d   d  Z e   Z Gd d   d  Z Gd d   d  Z Gd d   d  Z Gd d   d  Z Gd d   d e  Z Gd d   d e  Z i d d 6d d 6d d 6d  d! 6d" d# 6d$ d% 6d& d' 6d( d) 6d* d+ 6d, d- 6d. d/ 6d0 d1 6d2 d3 6d4 d5 6d6 d7 6d8 d9 6d: d; 6d< d= 6d> d? 6d@ dA 6dB dC 6dD dE 6dF dG 6dH dI 6dJ dK 6dL dM 6dN dO 6dP dQ 6dR dS 6dT dU 6dV dW 6dX dY 6dZ d[ 6d\ d] 6d^ d_ 6d` da 6db dc 6dd de 6df dg 6dh di 6dj dk 6dl dm 6dn do 6dp dq 6dr ds 6dt du 6dv dw 6dx dy 6dz d{ 6d| d} 6d~ d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d6dd6dd6dd6dd	6d
d6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6d d!6d"d#6d$d%6d&d'6d(d)6d*d+6d,d-6d.d/6d0d16d2d36d4d56d6d76d8d96d:d;6d<d=6d>d?6d@dA6dBdC6dDdE6dFdG6dHdI6dJdK6dLdM6dNdO6dPdQ6dRdS6dTdU6Z d S(V  z:Pypeul python IRC client library v0.3 by Mick@el & Zopieuxzutf-8    N)
namedtupleCallableUserDictOrderedDict)wrapc             C   s4   |  j  j   j d  s' t d   n  d |  _ |  S)NZon_z9threaded decorator can only be used on callback functionsT)__name__lower
startswith	TypeErrorthreaded)func r   */home/gordon/BotIrc-pendu-master/pypeul.pyr   (   s    	r   c             C   s   |  j  d  j   j d  S)Nzutf-8)encoder   decode)sr   r   r   	irc_lower0   s    r   c             C   s   t  |   t  |  k S)N)r   )s1s2r   r   r   
irc_equals4   s    r   c               @   s   e  Z d  Z d Z e j d  Z d Z d Z i d d 6d d 6d	 d
 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d  6d! d" 6d# d$ 6Z	 i d% d& 6d' d( 6d) d* 6Z
 d+ d,   Z Gd- d.   d.  Z d/ d0   Z d1 S)2Tagsa  
    This class is used to apply mIRC-style formatting to IRC text.

    There are two types of tags : color tags and formatting tags that can be
    toggled either on or off (those are Bold, Reverse, Underline).

    Color are referred to using the following syntax :
     - Tags.Red + 'hello'        # 'hello' in red
     - Tags.RedBlue + 'hello'    # 'hello' in red on a blue background

    The first color defines the foreground and the second one the backgroud.
    Background color is optional.

    On/off tags work the same way except each use will toggle the previous
    state :
     - Tags.Bold + 'hello'       # 'hello' in bold
     - Tags.Bold + 'foo' +          Tags.Bold + 'bar'       # 'foo' in bold, followed by 'bar' (no bold)

    The two types can be combined as well :
     - Tags.BoldGreen            # 'hello' in bold and green

    It's also possible to call tags as functions instead of concatenating them
    to enclose a string with a starting and ending tag :
    - Tags.Bold('foo') + 'bar'   # 'foo' in bold, followed by 'bar' (no bold)

    Colors work as well, but be warned that a color can not be turned off (you
    must provide another color in order to change it)
    - Tags.BoldRed('foo') + 'bar'  # 'foo' in bold red, and 'bar' in red !

    z\x03(\d{1,2})?(?:,(\d{1,2})?)?Z00ZwhiteZ01ZblackZ02ZblueZ03ZgreenZ04ZredZ05ZbrownZ06ZpurpleZ07ZorangeZ08ZyellowZ09ZltgreenZ10ZtealZ11ZcyanZ12ZltblueZ13ZpinkZ14ZgreyZ15ZltgreyZboldZ	underlinereversec             C   sI   t  j j d |  } x- t j j   D] } | j | d d  } q% W| S)N r   )r   RE_COLORZsub_tagstagsvaluesreplace)selftextvalr   r   r   stript   s    z
Tags.stripc               @   sO   e  Z d  Z d d d  Z d d   Z d d   Z d d	   Z d
 d   Z d S)zTags.callable_tagr   c             C   s   | |  _  | |  _ d  S)N)startend)r#   r'   r(   r   r   r   __init__{   s    	zTags.callable_tag.__init__c             C   sM   t  | t  r t |   | St  | t j  rC t |   t |  St  d  S)N)
isinstancestrr   callable_tagr
   )r#   otherr   r   r   __add__   s
    zTags.callable_tag.__add__c             C   sM   t  | t  r | t |   St  | t j  rC t |  t |   St  d  S)N)r*   r+   r   r,   r
   )r#   r-   r   r   r   __radd__   s
    zTags.callable_tag.__radd__c             C   s   |  j  S)N)r'   )r#   r   r   r   __str__   s    zTags.callable_tag.__str__c             G   s   |  j  d j |  |  j S)N )r'   joinr(   )r#   paramsr   r   r   __call__   s    zTags.callable_tag.__call__N)r   
__module____qualname__r)   r.   r/   r0   r4   r   r   r   r   r,   z   s
   r,   c       
      C   s  d  } d  } d } d } x| D]} | | j    7} d } | |  j k r | d  k rf |  j | } q| d  k r |  j | } qt |   n | |  j k r |  j | | k r t |   n  | |  j | 7} nB | d k r| d  k r| d  k rd } qt |   n d } | r d } q q W| sI| d k rX| d  k rXt |   n  d } d }	 | d  k	 rd }	 d | } | r| d | 7} qn  |  j | | | |	  S)Nr   TnoneFr   ,)r   colorsAttributeErrorr    r,   )
r#   nameZfgZbgformatbuffercharfoundZcolorZuncolorr   r   r   __getattr__   sD    	
zTags.__getattr__N)r   r5   r6   __doc__recompiler   ResetZUncolorr9   r    r&   r,   r@   r   r   r   r   r   7   s8   

r   c               @   s   e  Z d  Z d Z d d   Z d d   Z d d   Z d d	   Z e d
 d    Z	 e d d    Z
 e d d    Z e d d    Z d d   Z e d d    Z e d d    Z e d d    Z e d d    Z e d d    Z d S)ServerConfigz
    This classed is used to allow easy access to the RPL_ISUPPORT line returned
    by most IRC servers, Please see http://www.irc.org/tech_docs/005.html for
    more information.
    c             C   s)   i d d 6d d 6d d 6d d 6|  _  d  S)	Nzb,k,l,psitnm	CHANMODESz(ov)@+PREFIXzbeI:10MAXLIST3MODES)info)r#   r   r   r   r)      s
    zServerConfig.__init__c             C   s   |  j  | S)N)rK   )r#   itemr   r   r   __getitem__   s    zServerConfig.__getitem__c             C   s   | |  j  | <d  S)N)rK   )r#   rL   valuer   r   r   __setitem__   s    zServerConfig.__setitem__c             C   s   | |  j  k S)N)rK   )r#   rL   r   r   r   __contains__   s    zServerConfig.__contains__c             C   s!   d d   |  j  d j d  D S)af  
        This is a list of channel modes according to 4 types.
        A = Mode that adds or removes a nick or address to a list. Always has a
        parameter.
        B = Mode that changes a setting and always has a parameter.
        C = Mode that changes a setting and only has a parameter when set.
        D = Mode that changes a setting and never has a parameter.

        Note: Modes of type A return the list when there is no parameter present.
        Note: Some clients assumes that any mode not listed is of type D.
        Note: Modes in PREFIX are not listed but could be considered type B.
        c             S   s   g  |  ] } t  |   q Sr   )set).0_r   r   r   
<listcomp>   s   	 z+ServerConfig.chan_modes.<locals>.<listcomp>rF   r8   )rK   split)r#   r   r   r   
chan_modes   s    zServerConfig.chan_modesc             C   sa   i  } xT |  j  d j d  D]< } | j d  \ } } x | D] } t |  | | <q? Wq W| S)zF
        Maximum number of entries in the list for each mode.
        rH   r8   :)rK   rU   int)r#   ZretZtokenmodesZlimitmoder   r   r   max_lists_entries   s    zServerConfig.max_lists_entriesc             C   s   t  |  j j    |  j d BS)ze
        A set of all type A modes (that add or remove to a list
        such as a ban list)
        r   )rQ   r[   keysrV   )r#   r   r   r   
list_modes   s    zServerConfig.list_modesc             C   s9   |  j  d j d  \ } } t t | d d  |   S)a  
        A list of channel modes a person can get and the respective prefix a
        channel or nickname will get in case the person has it. The order of
        the modes goes from most powerful to least powerful. Those prefixes are
        shown in the output of the WHOIS, WHO and NAMES command.

        Note: Some servers only show the most powerful, others may show all of
        them.

        The result is an ordered dict of mode -> prefix
        rG   )   N)rK   rU   r   zip)r#   leftZrightr   r   r   prefixes   s    zServerConfig.prefixesc             C   s9   t  |  j j    j | d  } t  |  j j    | S)z3
        Get the mode for the given prefix
        r   )listrb   r!   indexr\   )r#   prefixrd   r   r   r   mode_for_prefix  s    "zServerConfig.mode_for_prefixc             C   s   t  |  j j    S)zI
        A set containing all the channel modes a person can get
        )rQ   rb   r\   )r#   r   r   r   prefixes_modes  s    zServerConfig.prefixes_modesc             C   s   t  |  j d  S)zi
        Maximum number of channel modes with a parameter
        allowed for each MODE command.
        rJ   )rX   rK   )r#   r   r   r   	max_modes  s    zServerConfig.max_modesc             C   s   t  |  j d  |  j BS)zV
        A set of all type B modes (which always have a parameter associated)
        r_   )rQ   rV   rg   )r#   r   r   r   param_modes%  s    zServerConfig.param_modesc             C   s   t  |  j d  S)zT
        A set of all type C modes (which always have a parameter when set)
           )rQ   rV   )r#   r   r   r   param_set_modes,  s    zServerConfig.param_set_modesc             C   s   t  |  j d  S)zU
        A set of all type D modes (which never have a parameter associated)
           )rQ   rV   )r#   r   r   r   noparam_modes3  s    zServerConfig.noparam_modesN)r   r5   r6   rA   r)   rM   rO   rP   propertyrV   r[   r]   rb   rf   rg   rh   ri   rk   rm   r   r   r   r   rE      s   rE   c               @   s  e  Z d  Z d d d  Z d d   Z d d   Z d d	   Z d
 d d d  Z d d   Z d d   Z	 d d   Z
 d d d d  Z d d d d d d d d  Z d e d d d  Z d d   Z d d  d!  Z d d" d#  Z d$ d%   Z d& d'   Z d( d)   Z d* d+   Z d d, d-  Z d. d/   Z d d0 d1  Z d2 d3   Z d4 d5   Z d d6 d7  Z d8 d9   Z d: d;   Z d< d=   Z d> d?   Z d@ dA   Z  d S)BIRCFc             C   sU   | |  _  d |  _ d |  _ t   |  _ t   |  _ d  |  _ t   |  _ i  |  _	 d  S)NFT)
thread_callbacks	connectedenabledIrcDictbansusersmyselfrE   
serverconfhandlers)r#   rp   r   r   r   r)   ;  s    				zIRC.__init__c             C   s   | j  d  p | j  d  S)N#&)r	   )r#   r$   r   r   r   
is_channelF  s    zIRC.is_channelc             C   s   t  t |  t |  j   S)N)r   r+   rv   )r#   userr   r   r   is_meI  s    z	IRC.is_mec                s      f d d   |  j  j   D S)Nc                s%   g  |  ] } | j     r |  q Sr   )is_in)rR   u)channelr   r   rT   M  s   	 z IRC.users_in.<locals>.<listcomp>)ru   r!   )r#   r   r   )r   r   users_inL  s    zIRC.users_ini  c             C   s   t  j d | |  t j t j t j  |  _ | rX d d l } | j |  j  |  _ n  |  j j | | f  t  j d  d |  _	 |  j
 d  d S)z!Etablish a connection to a serverzConnecting to %s port %d ...r   NzConnected successfullyTZon_connected)loggerrK   socketZAF_INETZSOCK_STREAMsksslZwrap_socketconnectrq   	_callback)r#   hostZportZuse_sslr   r   r   r   r   O  s    	zIRC.connectc             C   s   |  j  j d  } xu |  j r y | j   } Wn t k
 rC PYn X| d k rT Pn  y |  j | j d   Wq t j d  Yq Xq Wd |  _	 t j
 d  |  j d  d |  _ d  S)Nrb    s   
z+Exception raised while processing a messageFZDisconnectedZon_disconnnected)r   makefilerr   readlineIOError_process_messager&   r   Z	exceptionrq   rK   r   )r#   fileZtxtr   r   r   run_  s     	zIRC.runc             C   s0   t  j d |  j  } | j d  | j   | S)NtargetT)	threadingThreadr   Z	setDaemonr'   )r#   Zthreadr   r   r   run_threadedv  s    
zIRC.run_threadedc             C   s2   |  j  j | j t  d  t j d |  d S)zSend a raw message to servers   
z> N)r   sendr   ENCODINGr   debug)r#   rawr   r   r   r   }  s    zIRC.rawlastr   c            G   s   d } x | D]~ } t  |  } | s+ q n  d | k sC d | k rR t d   n  d | k sn | d d k r} t d   n  | | d 7} q W| d	 d  } d | k s d | k r t d   n  | r |  j | d |  n |  j |  d	 S)z
        Send a message to the server.
        Arguments can not contain space, newlines or begin with a ':'

        Only the "last" keywork argument can contain spaces and is prefixed
        with a ':' character in the raw message.
        r   
z"newlines not allowed in parametersr1   r   rW   z(space or ':' prefix in non-last argumentNr_   z%newlines not allowed in last argumentz :)r+   
ValueErrorr   )r#   r   r3   re   prmr   r   r   r     s     	zIRC.sendno_break	no_formatc            G   sL  | r;d } d } g  } x-| j  d  D]} | j   s@ q( n  | rR | g }	 n" t | d t d j |    }	 x|	 D]}
 d j |  } | s | r | d | 7} | r | d | 7} q n  | |
 7} |  j d | j d d  |  | r q{ n  d	 } x.| t |  k  r/| | } | d
 7} | t j k rJd } } g  } q| t j	 j
   k r| | k r{| j |  q,| j |  q| d k rt j j | | d
 d   } | j d
  sd } } q,| j d
  r| j d
  } n  | j d  r| j d  } n  | | j   d
 7} qqWq{ Wq( Wn |  j |   d S)a  
        Send a command multiple times to the server.
        For each newline in the last argument, the command will be repeated.

        If the last argument is too long, it will be split into multiple lines
        unless the no_break argument is set.

        The effective formatting at the end of each line will be repeated on the
        beginning of the next line unless the no_format argument is set.
        r   r   i  r1   r   r8   r   r   r   r_   Nrj   )rU   r&   r   lenr2   r   r"   r   rD   r    r!   removeappendr   matchgroupr(   )r#   r   r   r   r3   ZfgcolorZbgcolorr<   Zunwrapped_lineZwrapsZwrapped_linelineir>   r   r   r   r   
send_multi  sR    "



	 &zIRC.send_multiNc             C   sv   | s | } n  t  |  |  j |  _ | |  j _ |  j |  |  j d | | | d | | rr |  j d |  n  d S)zRIdentify with nick, password and real name.
        must be called after connect()ZUSERr   ZPASSN)UserMaskr|   rv   identnickr   )r#   r   r   Zrealnamepasswordr   r   r   r     s    	z	IRC.identc             C   s   |  j  d |  d  S)NNICK)r   )r#   r   r   r   r   r     s    zIRC.nickc             C   s   |  j  d | |  d S)zJoin a channelJOINN)r   )r#   r   r   r   r   r   r2     s    zIRC.joinc             C   s   |  j  d | d | d  S)NPARTr   )r   )r#   r   reasonr   r   r   part  s    zIRC.partc             C   s   |  j  d | d | d S)z"Send a message to a nick / channelPRIVMSGr   N)r   )r#   r   r$   r   r   r   message  s    zIRC.messagec             C   s   |  j  | d | d  d S)z"Send an action to a nick / channelzACTION N)r   )r#   r   r$   r   r   r   action  s    z
IRC.actionc             C   s   |  j  d | d | d S)z!Send a notice to a nick / channelNOTICEr   N)r   )r#   r   r$   r   r   r   notice  s    z
IRC.noticec             C   s   |  j  d | d | d S)z$Change the topic of chan to newtopicZTOPICr   N)r   )r#   chanZnewtopicr   r   r   topic  s    z	IRC.topicc             C   s   |  j  d | | d | d S)zKick user on chanKICKr   N)r   )r#   r   r|   r   r   r   r   kick  s    zIRC.kickc             C   s   |  j  d | |  d S)zInvite an user on a channelZINVITEN)r   )r#   r   r|   r   r   r   invite  s    z
IRC.invitec             C   s   |  j  d d | d  S)NQUITr   )r   )r#   r   r   r   r   quit#  s    zIRC.quitc             G   sl  d d   } t  t | d |  } | s. d Sd } x1| t |  k  rgd } d } g  } d }	 x t | | d j |   d k  rM|	 |  j j k  rM| t |  k  rMt | | t  r | | }
 d } n | | \ }
 } | |
 d k r|
 d } | |
 d 7} n  | |
 d	 d  7} | r6| | g 7} n  |	 d	 7}	 | d	 7} qd W|  j d
 | | |  q7 Wd S)z<usage: set_modes('#foo', ('-o', 'Foo2'), ('+l', '30'), '-k')c             S   s>   t  |  t  r |  } d } n |  \ } } t |  | | f S)Nr   )r*   r+   bool)r   r;   r%   r   r   r   _key)  s
    	zIRC.set_modes.<locals>._keykeyNr   r   r1   i  r_   MODE)	tuplesortedr   r2   rw   rh   r*   r+   r   )r#   r   rY   r   mjZcur_signZ	modenamesZmodevalsr   r;   r%   r   r   r   	set_modes&  s2    	&$
	

zIRC.set_modesc             C   s$   g  |  j  | <|  j d | d  d  S)Nr   z+b)rt   r   )r#   r   r   r   r   retrieve_ban_listW  s    zIRC.retrieve_ban_listc             C   sH   t  |  } t  |  } |  j | d | | r8 d | n d d  d  S)Nr   r1   r   )r+   r   )r#   totyperN   r   r   r   ctcp_request[  s    zIRC.ctcp_requestc             C   sQ   d t  |  } t  |  } | r3 | d | 7} n  | d 7} |  j | |  d  S)Nr   r1   )r+   r   )r#   r   r   rN   r$   r   r   r   
ctcp_reply`  s    
zIRC.ctcp_replyc             C   ss   t  | t  r | Sy | j d  SWnH t k
 rn y | j d  SWn" t k
 ri | j d d  SYn XYn Xd  S)Nasciizutf-8ziso-8859-15r"   )r*   r+   r   UnicodeDecodeError)r#   Zstringr   r   r   
to_unicodej  s    zIRC.to_unicodec             C   s   d  } d } g  } x | D] } | d k r7 | } q n  | d  k rR t  d   n  |  j j |  j j B} | d k r | |  j j O} n  | | k r | j | d k | | | f  | d 7} q | j | d k | d  f  q W| S)Nr   z+-zModes have to begin with + or -+r_   )r   rw   ri   r]   rk   r   )r#   modestrtargetsr   r   Zoutr>   ri   r   r   r   parse_modesv  s"      zIRC.parse_modesc             G   s   x |  g t  |  j j    D] } t | | d   } t | t  sJ q n  t j d | | f  |  j s| t | d d   r t	 j
 d | d |  } d | _ | j   q | |   q Wd  S)Nzcalling %s() on instance %rr   r   argsT)rc   rx   r!   getattrr*   r   r   r   rp   r   r   Zdaemonr'   )r#   r;   Z
parametersZinstftr   r   r   r     s    #	zIRC._callbackc                s  t  t   j | j d    } t j d d j |   d } d  } | d j d  r | d d d   } | d d   } t   |  } n  t	 |  d k r | d } | d d   } n | d } g  } g  } d } x| | D]t } | j d  r$| r$d	 } | d d   } | j
 |  q | rI| t	 |  d d | 7<q | j
 |  q Wt j | | j    } | d4 k r  j d | j   | |  | d }	 | d k rt   | d  n | }
 | d
 k r|
 j j |	  q|
 j j |	  n | d k r| j j   n    j d | j   | |  | d k r[  j d d | d n#| d k r| r| j j | d } }   j j | |  | | j _ n| d k r  j d  n| d k ruxt | d d    D] \ } } | t	 |  k rPn  y& | j d  \ } } |   j | <Wqt k
 rmd	   j | <| d k ri  j d d  n  YqXqWn	| d k r| d }	 |	   j k rg    j |	 <n    j |	 j
 | d d    n| d k r| d }	   j d |	   j |	  n| d k r| d } xg| d j   D]g }   f d  d!   | D } | t	 |  d   } t   |  j } | j |  t |  | j | <q%Wn| d" k r| d j d#  r| d j d#  r| d d d   d  d5  } d  } | j d  } | d6 k r,| d  |  | | d d   } } n  | d$ k rU  j d% | | d |  q  j d& | | |    j d' | j   d( | |  q~  j d) | |    j  | d  r  j d* | |  q~  j! | d  r~  j d+ | | d  q~n| d, k rF| d  k	 rF| d j d#  r| d j d#  r| d d d   d  d7  } d  } | j d  } | d8 k r| d  |  | | d d   } } n    j d- | | |    j d' | j   d. | |  q~  j d/ | |    j  | d  r  j d0 | |  q~  j! | d  r~  j d1 | | d  q~n8| d2 k rL| rLt	 |  d k rL  j  | d  rL| d }	 | d } | d d   } x   j" | |  D] \ } } } |   j j#   j j$ t   j j%  Bk rt   |  j } | j& |	  } | r&| j' |  qE| | k rE| j( |  qEqqWn2 | r~  j! |  r~  j d3 | j   |  n  d  S)9N    z< r1   r   r   rW   r_   FTr   r   r   Zon_pre_server_r   Z
on_server_ZPINGZPONGr   r   welcomeon_readyfeaturelist=ZNAMESXZPROTOCTLbanlistrj   endofbanlistZon_banlist_receivednamreplyrl   c                s:   g  |  ]0 } |   j  j j   k r   j  j |   q Sr   )rw   rb   r!   rf   )rR   rS   )r#   r   r   rT     s   	 z(IRC._process_message.<locals>.<listcomp>r   r   ZACTIONZ	on_actionZon_ctcp_requestZon_ctcp_Z_requestZ
on_messageon_channel_messageZon_private_messager   Zon_ctcp_replyZ_replyZ	on_noticeZon_channel_noticeZon_private_noticer   Zon_self_)zJOINzPARTzKICKr   r   r   r   ))rc   mapr   rU   r   r   r2   r	   r   r   r   numeric_eventsgetupperr   r   r|   joinedra   deleter   r   ru   
rename_key	enumeraterw   r   rt   rQ   channelsendswithfindr{   r}   r   rg   r]   r[   modes_inaddr   )r#   r$   re   umaskcmdZprmsr3   r   r   r   r   ZoldnickZnewnickr   Zparamr;   rN   r   Zraw_nickrY   r   r|   Zposr   r   r   rZ   Zmode_setr   )r#   r   r     s    !


%#
!

&($&($7

"	zIRC._process_message)!r   r5   r6   r)   r{   r}   r   r   r   r   r   r   r   __version__r   r   r2   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ro   :  s<   #I1
ro   c               @   sC   e  Z d  Z e j d  Z d d   Z d d   Z d d   Z d S)	r   z([^!]+)!([^@]+)@(.+)c             C   s*  | |  _  d |  _ d |  _ d |  _ d  |  _ t |  } |  j j |  } | rr | j   \ |  _ |  _ |  _ n	 | |  _ |  j |  j  j	 k r|  j  j	 |  j |  _ |  j r |  j |  j j k r |  j |  j _ n  |  j r&|  j j r&|  j |  j _ q&n% t
 |   |  _ |  j |  j  j	 |  j <d  S)Nr   )ircr   r   r   r|   r+   	maskRegexr   Zgroupsru   User)r#   r   maskr   r   r   r   r)   J  s$    					!	zUserMask.__init__c             C   s   d j  |  j |  j |  j  S)Nz<UserMask: {0}!{1}@{2}>)r<   r   r   r   )r#   r   r   r   __repr__d  s    zUserMask.__repr__c             C   s   |  j  S)N)r   )r#   r   r   r   r0   g  s    zUserMask.__str__N)	r   r5   r6   rB   rC   r   r)   r   r0   r   r   r   r   r   G  s   r   c               @   s|   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z d d   Z d d   Z	 d d   Z
 d d   Z d S)r   c             C   sn   | j  |  _  | j |  _ | j |  _ | j |  _ t   |  _ d |  _ |  j  |  j j k rj t j	 d  n  d  S)NFz>Tried instanciating multiple User instances for the same user.)
r   r   r   r   rs   r   deletedru   r   error)r#   r   r   r   r   r)   k  s    	zUser.__init__c             C   s   | |  j  k S)N)r   )r#   r   r   r   r   r~   v  s    z
User.is_inc             C   s   |  j  t |  j |  j j  k S)N)r   r   r   r|   )r#   r   r   r   r   is_ghost_ofy  s    zUser.is_ghost_ofc             C   s   |  j  | S)N)r   )r#   r   r   r   r   r   |  s    zUser.modes_inc             C   sA   |  j  r t j d  d  S|  j |  r- d  St   |  j | <d  S)Nz!joined() called on a deleted user)r   r   r   r~   rQ   r   )r#   r   r   r   r   r     s    	zUser.joinedc             C   sT   |  j  r t j d  d  S|  j |  s- d  Sy |  j | =Wn t k
 rO Yn Xd  S)Nzleft() called on a deleted user)r   r   r   r~   r   KeyError)r#   r   r   r   r   ra     s    	z	User.leftc             C   s)   t    |  _ d |  _ |  j j |  j =d  S)NT)rs   r   r   r   ru   r   )r#   r   r   r   r     s    	zUser.deletec             C   s.   d j  |  j r d n d |  j |  j |  j  S)Nz<{0}User: {1}!{2}@{3}>zDeleted r   )r<   r   r   r   r   )r#   r   r   r   r     s    zUser.__repr__c             C   s   |  j  S)N)r   )r#   r   r   r   r0     s    zUser.__str__N)r   r5   r6   r)   r~   r   r   r   ra   r   r   r0   r   r   r   r   r   j  s   
r   c                   sm   e  Z d  Z e e j  Z   f d d   Z d d   Z d d   Z	 d d   Z
 d	 d
   Z d d   Z   S)NormalizedDictc                s&   i  |  _  t t |   j | |   d  S)N)_mapsuperr   r)   )r#   r   kwargs)	__class__r   r   r)     s    	zNormalizedDict.__init__c             C   s   |  j  |  |  j k S)N)functionr   )r#   r   r   r   r   rP     s    zNormalizedDict.__contains__c             C   s   |  j  |  j |  j |  S)N)datar   r   )r#   r   r   r   r   rM     s    zNormalizedDict.__getitem__c             C   sS   | |  k r, | |  j  |  j |  j |  <n# | |  j |  j |  <| |  j  | <d  S)N)r   r   r   )r#   r   rN   r   r   r   rO     s     zNormalizedDict.__setitem__c             C   s1   |  j  |  j |  j |  =|  j |  j |  =d  S)N)r   r   r   )r#   r   r   r   r   __delitem__  s    zNormalizedDict.__delitem__c             C   s   |  | } |  | =| |  | <d  S)Nr   )r#   ZoldkeyZnewkeyr%   r   r   r   r     s    
zNormalizedDict.rename_key)r   r5   r6   staticmethodr+   r   r   r)   rP   rM   rO   r  r   r   r   )r   r   r     s   r   c               @   s   e  Z d  Z e e  Z d S)rs   N)r   r5   r6   r  r   r   r   r   r   r   rs     s   rs   r   Z001ZyourhostZ002ZcreatedZ003ZmyinfoZ004r   Z005Z	tracelinkZ200ZtraceconnectingZ201ZtracehandshakeZ202ZtraceunknownZ203ZtraceoperatorZ204Z	traceuserZ205ZtraceserverZ206ZtraceserviceZ207ZtracenewtypeZ208Z
traceclassZ209ZtracereconnectZ210ZstatslinkinfoZ211ZstatscommandsZ212Z
statsclineZ213Z
statsnlineZ214Z
statsilineZ215Z
statsklineZ216Z
statsqlineZ217Z
statsylineZ218Z
endofstatsZ219ZumodeisZ221ZserviceinfoZ231ZendofservicesZ232ZserviceZ233ZservlistZ234ZservlistendZ235Z
statsllineZ241ZstatsuptimeZ242Z
statsolineZ243Z
statshlineZ244Z
luserconnsZ250ZluserclientZ251ZluseropZ252ZluserunknownZ253ZluserchannelsZ254ZlusermeZ255ZadminmeZ256Z	adminloc1Z257Z	adminloc2Z258Z
adminemailZ259ZtracelogZ261Z
endoftraceZ262ZtryagainZ263Zn_localZ265Zn_globalZ266r7   Z300ZawayZ301ZuserhostZ302ZisonZ303ZunawayZ305ZnowawayZ306Z	whoisuserZ311ZwhoisserverZ312ZwhoisoperatorZ313Z
whowasuserZ314ZendofwhoZ315ZwhoischanopZ316Z	whoisidleZ317Z
endofwhoisZ318ZwhoischannelsZ319Z	liststartZ321rc   Z322ZlistendZ323ZchannelmodeisZ324ZchannelcreateZ329ZnotopicZ331ZcurrenttopicZ332Z	topicinfoZ333ZinvitingZ341Z	summoningZ342Z
invitelistZ346ZendofinvitelistZ347Z
exceptlistZ348ZendofexceptlistZ349versionZ351ZwhoreplyZ352r   Z353ZkilldoneZ361ZclosingZ362ZcloseendZ363ZlinksZ364Z
endoflinksZ365Z
endofnamesZ366r   Z367r   Z368ZendofwhowasZ369rK   Z371ZmotdZ372Z	infostartZ373Z	endofinfoZ374Z	motdstartZ375Z	endofmotdZ376Zmotd2Z377Z	youreoperZ381Z	rehashingZ382ZmyportisZ384ZtimeZ391Z
usersstartZ392ru   Z393Z
endofusersZ394ZnousersZ395Z
nosuchnickZ401ZnosuchserverZ402ZnosuchchannelZ403ZcannotsendtochanZ404ZtoomanychannelsZ405ZwasnosuchnickZ406ZtoomanytargetsZ407ZnooriginZ409ZnorecipientZ411ZnotexttosendZ412Z
notoplevelZ413ZwildtoplevelZ414ZunknowncommandZ421ZnomotdZ422ZnoadmininfoZ423Z	fileerror424ZnonicknamegivenZ431ZerroneusnicknameZ432ZnicknameinuseZ433ZnickcollisionZ436Zunavailresource437ZusernotinchannelZ441ZnotonchannelZ442ZuseronchannelZ443ZnologinZ444ZsummondisabledZ445ZusersdisabledZ446ZnotregisteredZ451ZneedmoreparamsZ461ZalreadyregisteredZ462ZnopermforhostZ463ZpasswdmismatchZ464ZyourebannedcreepZ465ZyouwillbebannedZ466ZkeysetZ467ZchannelisfullZ471ZunknownmodeZ472ZinviteonlychanZ473ZbannedfromchanZ474ZbadchannelkeyZ475ZbadchanmaskZ476ZnochanmodesZ477ZbanlistfullZ478ZnoprivilegesZ481ZchanoprivsneededZ482ZcantkillserverZ483Z
restrictedZ484ZuniqopprivsneededZ485Z
nooperhostZ491ZnoservicehostZ492ZumodeunknownflagZ501ZusersdontmatchZ502)r   r   r   r   rB   sysiologgingZcollectionsr   r   r   r   textwrapr   r   Z	getLoggerr   r   r   r   r   rE   ro   r   r   r   rs   r   r   r   r   r   <module>   sl  "	w  #7