B
    hՂ[c&                 @   sn  d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZmZ dd	lm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 ydd
lZW n  ek
r   d
Zed Y nX edZdZejZdZ dZ!dd
l"Z"G dd deZ#e$dkrjee edZ%e%d Z&e&r,e&Z'ej'Ze(e)ddZ*e#e*e%Z+e+,  erbe- .d e+/  d
S )u  
Infobot - an IRC bot that handles user information on the Subluminal network.
© 2014-2018 Sam van Kampen, Simmo Saan and contributors

Usage: infobot.py [options]
       infobot.py (-h|--help)
       infobot.py --version

Options:
    --debug, -d                 Sets logging level to DEBUG
    --raw, -r                   Show raw protocol traffic
    --disable-plugins <plugins> Disable plugins, comma-separated.
    )DotDict)
IRCHandler)Event)Standard)IRCCallback)Styler)PluginLoaderDependencyError)TagSupportFilterN)docoptzCsd_notify support missing, not notifying systemd of startup successz	libc.so.6z2.0.0-alphazH[%(asctime)s %(msecs)3d] [%(levelname)7s] %(name)7s: %(message)s %(tag)s   c                   sj  e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Ze	ddd Z
e	ddd Ze	ddd Ze	ddd Z fddZe	ddd Ze	ddd Zd d! Zd"d# Ze	d$d%d& Ze	d'd(d) Ze	d*d+d,d- Ze	d.d/d0 Ze	d1d2d3 Ze	d4d5d6 Ze	d7d8d9 Ze	d:d;d< Zd=d> Ze	d?d@dA ZdBdC Z fdDdEZ  ZS )FInfobotz Infobot main class c                s   |    tdatdt td t j||d |d d t | _	|| _
|d | _|d pdd	d
| _di i| _t | _d | _g | _tdd tD | _|   |   t | _d S )NinfobotzInfobot version %su8   © 2014-2018 Sam van Kampen, Simmo Saan and contributorsz--debugz--raw)verboseZ	print_rawnickz--disable-plugins ,topicsc             S   s   i | ]}t ||qS  )r   ).0namer   r   !/home/sam/code/Infobot/infobot.py
<dictcomp>I   s    z$Infobot.__init__.<locals>.<dictcomp>)register_loggerlogging	getLoggerloggerinfoVERSIONsuper__init__r   styleconfigr   splitblacklisted_pluginsdatasetcurrent_capsZauthchannelsr   StandardEventseventsZregister_callbacksregister_pluginsserver_supports)selfr"   args)	__class__r   r   r    2   s"    



zInfobot.__init__c             C   s   d| j d dd  S )NzInfobot(server=%r)server:r   )r"   r#   )r-   r   r   r   __repr__P   s    zInfobot.__repr__c             C   s   |  d|| d S )NzPRIVMSG {} :{})_sendformat)r-   chanmsgr   r   r   _msgS   s    zInfobot._msgc             C   s   |  d|| d S )NzNOTICE {} :{})r3   r4   )r-   r5   r6   r   r   r   noticeV   s    zInfobot.noticec             C   sJ   t |dd}d|kr:x,|dD ]}| || q$W n| || d S )Nr   
)strreplacer#   r7   )r-   r5   r6   itemr   r   r   r6   Y   s
    zInfobot.msgZ005c             C   sN   |d dd }x8|D ]0}d|kr2| d\}}n
|d }}|| j|< qW d S )Nr.   r   =T)r#   r,   )r-   r6   ZoptsZoptkvr   r   r   isupporta   s    

zInfobot.isupportZINVITEc             C   s    |  d|d dd   d S )NzJOIN :argr1   r   )r3   r#   )r-   Zpmsgr   r   r   handleinvitek   s    zInfobot.handleinviteZMODEc             C   sT   |d  ds$|d ddd | _|d }|d ^}}}| jjt|||| dS )	z Handle MODE. rC   # r   r   hostr.   N)
startswithr#   r   r*   ZModefirebot)r-   r6   usertarget
modestringmodeargsr   r   r   modeo   s
    zInfobot.modeZ324c             C   s:   |d ^}}}}d |}| jj| ||dd  | d S )Nr.   rF   r   )joinr*   ZChannelModerI   )r-   r6   ZclientchannelrM   restrN   r   r   r   channel_modez   s    
zInfobot.channel_modec                s:   | j d rt| j| _t   | d| j d   d S )NsslzNICK %sr   )r"   rT   Zwrap_socketZsockr   connectr3   )r-   )r/   r   r   rU      s    

zInfobot.connectPRIVMSGc             C   st   |d  dd }|d   d }| }|ds8|}|d  ddd }| jj| ||| td||| d	S )
z Handles messages. rG   !r   rC   rE   r1   r   z[%s] <%s> %sN)r#   lowerrH   r*   ZMessagerI   r   r   )r-   r6   r   r5   r   r   r   privmsg   s    
zInfobot.privmsgZNOTICEc             C   s.   t d|d |d ddd dd   d S )Nz*%s* %srG   rC   rF   r   )r   r   r#   )r-   r6   r   r   r   notice_listener   s    zInfobot.notice_listenerc          	   C   s   t d}|t t  }|t tjtddiddiddiddiddiddidd}|t	  |
| |t	  |
| t j||gtd	 d S )
Nzinfobot.logZcolorZblueZcyanZredZmagenta)hostnameZprogramnamer   	levelnameasctimetag)fmtZfield_styles)handlerslevel)r   FileHandlersetLevelLOGLEVELStreamHandlercoloredlogsZColoredFormatterFORMAT	addFilterr
   setFormatterbasicConfig)r-   Zfhsh	formatterr   r   r   r      s     




zInfobot.register_loggerc       	      C   s  t | jd}y|  | _}W n: tk
rX } ztd|  tt W d d }~X Y nX x|D ]}t	|drxZ|j
 D ]L\}}xB|D ]:}y| j| | W q tk
r   |g| j|< Y qX qW qzW t	|dr`x|jD ]}||  qW q`W tdt|ddd |D  d S )	N)Z	blacklistzDependency error: __callbacks__	__inits__zLoaded %d plugin(s) (%s)u    ⇒ c             s   s    | ]}|j d dd V  qdS ).r   N)__name__rsplit)r   pluginr   r   r   	<genexpr>   s    z+Infobot.register_plugins.<locals>.<genexpr>)r   r$   Zload_allpluginsr	   r   errorexitEXIT_FAILUREhasattrrm   items__irccallbacks__appendKeyErrorrn   r   lenrP   )	r-   ZpluginLoaderrt   err   r@   rA   iinitr   r   r   r+      s$    



zInfobot.register_pluginsZ332c             C   s>   |d   d }| }|d  ddd }|| jd |< d S )NrC   r   r1   r   )r#   rX   r%   )r-   r6   r5   rC   r   r   r   topicget   s    zInfobot.topicgetZCAPc             C   s   |d   d }|dkr|d  dd }|  jt|  O  _td|  x.| jD ]$}td|  | d|  qVW x | jd D ]}| d	|  qW d S )
NrC   r   ZACKr1   zAcknowleged CAPs: zSending NAMES for zNAMES autojoinzJOIN :%s)	r#   r'   r&   r   r   r(   debugr3   r"   )r-   r6   Z
cap_methodZcapsrQ   r   r   r   	cap_reply   s    zInfobot.cap_replyZ376Z422c             C   sT   | j dd r*| | j d d| j d   | d | d| j  | jj  d S )NZ
ident_passZident_servicezidentify %sz'CAP REQ :userhost-in-names multi-prefixz
MODE %s +B)r"   getr7   r3   r   r*   ZWelcomerI   )r-   r6   r   r   r   welcome   s    
zInfobot.welcomeZ353c             C   s   d| j krd S td|d  \}}|d ddd }td|}g }x,|D ]$}|\}}	}}
|||	||
d qPW | jj	| ||| d S )Nzuserhost-in-namesz\S+ ([=@*]) (#\S+)rC   r1   r   z([+%@&~]*)(\S+?)!(\S+?)@(\S+))modesr   rK   rG   )
r'   rematchgroupsr#   findallr{   r*   ZNamesrI   )r-   r6   Zchannel_typeZchannel_nameZ	user_listZusersZusers_as_dictrK   r   r   rG   r   r   r   _names   s    


zInfobot._namesZ366c             C   s$   |d   d }| jj| | d S )NrC   r   )r#   r*   ZNamesEndrI   )r-   r6   rQ   r   r   r   	_namesend   s    zInfobot._namesendZPARTc             C   s,   |d }|d \}}| j j| ||| d S )NrG   r.   )r*   ZPartrI   )r-   r6   rK   rQ   reasonr   r   r   _part  s    zInfobot._partZKICKc             C   sB   |d ^}}}|r|d }nd}|d }| j j| |||| d S )Nr.   r   r   rG   )r*   ZKickrI   )r-   r6   rQ   ZkickedrR   r   Zkickerr   r   r   _kick
  s    
zInfobot._kickZQUITc             C   s   |d }| j j| | d S )NrG   )r*   ZQuitrI   )r-   r6   rK   r   r   r   _quit  s    zInfobot._quitc             C   s0   x*| j d D ]}t|dr|j|kr|S qW d S )NrV   cmd_name)rz   rx   r   )r-   r   handlerr   r   r   get_cmd  s    zInfobot.get_cmdZJOINc             C   sJ   |d dd  }|d }|  d|  | j| | jj| || d S )NrC   r   rG   zMODE )r3   r(   r{   r*   ZJoinrI   )r-   r6   r5   rG   r   r   r   _join  s
    zInfobot._joinc             C   s   t | jd |dS )NZapisF)boolr"   r   )r-   keyr   r   r   has_api)  s    zInfobot.has_apic                s   t    d S )N)r   gracefully_terminate)r-   )r/   r   r   r   ,  s    zInfobot.gracefully_terminate) rp   
__module____qualname____doc__r    r2   r7   r8   r6   r   rB   rD   rO   rS   rU   rY   rZ   r   r+   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   )r/   r   r   0   s6   

r   __main__)versionz--debugzconfig.jsonrzREADY=1)0r   Zcorer   Zcore.ircr   Zcore.eventsr   r   r)   Zcore.decoratorsr   Z
core.styler   Zcore.pluginsr   r	   Zcore.loggingr
   jsonr   rT   r   Zctypesr   ZsdnotifyImportErrorprintZCDLLZlibcr   INFOrd   rg   rw   rf   r   rp   r.   r   DEBUGloadopenr"   rJ   rU   ZSystemdNotifiernotifyrunr   r   r   r   <module>   sP   
  

