2012-04-09 02:19:39 +00:00
#!/usr/bin/python3
2011-12-31 10:14:19 +00:00
# coding=utf-8
import sys
2012-04-09 02:19:39 +00:00
import signal
2011-12-31 10:14:19 +00:00
import os
import re
2012-01-29 14:28:02 +00:00
from datetime import date
from datetime import datetime
from datetime import timedelta
2012-02-21 11:41:23 +00:00
from xml . dom . minidom import parse
2011-12-31 10:14:19 +00:00
2012-04-09 02:19:39 +00:00
imports = [ " birthday " , " qd " , " events " ]
imports_launch = [ " watchWebsite " ]
mods = list ( )
import server
2011-12-31 10:14:19 +00:00
2012-02-21 11:41:23 +00:00
if len ( sys . argv ) == 1 :
2012-04-09 02:19:39 +00:00
print ( " This script takes exactly 1 arg: a XML config file " )
2012-02-21 11:41:23 +00:00
sys . exit ( 1 )
2012-04-09 02:19:39 +00:00
def onSignal ( signum , frame ) :
print ( " \n SIGINT receive, saving states and close " )
2012-02-21 11:41:23 +00:00
2012-04-09 02:19:39 +00:00
for imp in mods :
imp . save_module ( )
sys . exit ( 0 )
signal . signal ( signal . SIGINT , onSignal )
dom = parse ( sys . argv [ 1 ] )
config = dom . getElementsByTagName ( ' config ' ) [ 0 ]
servers = list ( )
for imp in imports :
mod = __import__ ( imp )
mods . append ( mod )
mod . load_module ( " datas/ " )
for serveur in config . getElementsByTagName ( ' server ' ) :
srv = server . Server ( serveur , config . getAttribute ( ' nick ' ) , config . getAttribute ( ' owner ' ) , config . getAttribute ( ' realname ' ) )
srv . launch ( mods )
servers . append ( srv )
for imp in imports_launch :
mod = __import__ ( imp )
mod . load_module ( " datas/ " )
mod . launch ( servers )
print ( " Nemubot ready, my PID is %i ! " % ( os . getpid ( ) ) )
2012-02-21 11:41:23 +00:00
prompt = " "
while prompt != " quit " :
prompt = sys . stdin . readlines ( )
sys . exit ( 0 )
2011-12-31 10:14:19 +00:00
def parsemsg ( msg ) :
2012-03-21 22:12:16 +00:00
global birthdays , score42
2011-12-31 10:14:19 +00:00
complete = msg [ 1 : ] . split ( ' : ' , 1 ) #Parse the message into useful data
info = complete [ 0 ] . split ( ' ' )
msgpart = complete [ 1 ]
sender = info [ 0 ] . split ( ' ! ' )
2012-02-21 12:47:49 +00:00
if len ( msgpart ) < = 0 :
return
2012-03-21 22:12:16 +00:00
qd . go ( s , sender , msgpart , info [ 2 ] )
2011-12-31 10:14:19 +00:00
if CHANLIST . find ( info [ 2 ] ) != - 1 and re . match ( " .*(norme|coding style).* " , msgpart ) is not None and re . match ( " .*(please|give|obtenir|now|plz|stp|svp|s ' il (te|vous) pla.t|check).* " , msgpart ) is not None :
norme . launch ( s , sender , msgpart )
2012-01-29 14:28:02 +00:00
elif CHANLIST . find ( info [ 2 ] ) != - 1 and msgpart [ 0 ] == ' ! ' : #Treat all messages starting with '!' as command
cmd = msgpart [ 1 : ] . split ( ' ' )
if cmd [ 0 ] == ' help ' or cmd [ 0 ] == ' h ' :
2012-02-20 13:26:41 +00:00
s . send ( " PRIVMSG %s :Pour me demander quelque chose, commencer votre message par !. \n Voici ce dont je suis capable : \r \n " % ( sender [ 0 ] ) )
s . send ( " PRIVMSG %s : - !new-year !newyear !ny : Affiche le temps restant avant la nouvelle année \r \n " % ( sender [ 0 ] ) )
s . send ( " PRIVMSG %s : - !end-of-world !worldend !eow : Temps restant avant la fin du monde \r \n " % ( sender [ 0 ] ) )
s . send ( " PRIVMSG %s : - !weekend !week-end !we : Affiche le temps restant avant le prochain week-end \r \n " % ( sender [ 0 ] ) )
s . send ( " PRIVMSG %s : - !partiels : Affiche le temps restant avant les prochains partiels \r \n " % ( sender [ 0 ] ) )
s . send ( " PRIVMSG %s : - !vacs !vacances !holidays !free-time : Affiche le temps restant avant les prochaines vacances \r \n " % ( sender [ 0 ] ) )
s . send ( " PRIVMSG %s : - !jpo !next-jpo : Affiche le temps restant avant la prochaine JPO \r \n " % ( sender [ 0 ] ) )
2012-03-21 22:12:16 +00:00
s . send ( " PRIVMSG %s : - !42 !scores : Affiche les scores des gens \r \n " % ( sender [ 0 ] ) )
if cmd [ 0 ] == ' score ' or cmd [ 0 ] == ' scores ' or cmd [ 0 ] == ' 42 ' :
qd . scores ( s , cmd , info [ 2 ] )
if cmd [ 0 ] == ' chronos ' or cmd [ 0 ] == ' edt ' or cmd [ 0 ] == ' cours ' :
s . send ( " PRIVMSG %s :chronos \r \n " % ( info [ 2 ] ) )
2012-01-29 14:28:02 +00:00
if cmd [ 0 ] == ' jpo ' or cmd [ 0 ] == ' JPO ' or cmd [ 0 ] == ' next-jpo ' :
#ndate = datetime(2012, 5, 12, 8, 30, 1)
#ndate = datetime(2012, 3, 31, 8, 30, 1)
2012-02-20 13:26:41 +00:00
ndate = datetime ( 2012 , 3 , 17 , 8 , 30 , 1 )
#ndate = datetime(2012, 2, 4, 8, 30, 1)
newyear . launch ( s , info [ 2 ] , ndate , [ " Il reste %s avant la prochaine JPO... We want you! " , " Nous somme en pleine JPO depuis %s " ] , cmd )
if cmd [ 0 ] == ' professional-project ' or cmd [ 0 ] == ' project-professionnel ' or cmd [ 0 ] == ' projet-professionnel ' or cmd [ 0 ] == ' project-professionel ' or cmd [ 0 ] == ' tc ' or cmd [ 0 ] == ' next-rendu ' or cmd [ 0 ] == ' rendu ' :
2012-03-21 22:12:16 +00:00
ndate = datetime ( 2012 , 3 , 18 , 23 , 42 , 1 )
newyear . launch ( s , info [ 2 ] , ndate , [ " Il reste %s avant la fermeture du rendu de TC-5 et de corewar, vite au boulot ! " , " À %s près, il aurait encore été possible de rendre " ] , cmd )
2011-12-31 10:14:19 +00:00
elif msgpart [ 0 ] == ' ` ' and sender [ 0 ] == OWNER and CHANLIST . find ( info [ 2 ] ) != - 1 : #Treat all messages starting with '`' as command
cmd = msgpart [ 1 : ] . split ( ' ' )
if cmd [ 0 ] == ' op ' :
s . send ( " MODE %s +o %s \r \n " % ( info [ 2 ] , cmd [ 1 ] ) )
if cmd [ 0 ] == ' deop ' :
s . send ( " MODE %s -o %s \r \n " % ( info [ 2 ] , cmd [ 1 ] ) )
if cmd [ 0 ] == ' voice ' :
s . send ( ' MODE ' + info [ 2 ] + ' +v ' + cmd [ 1 ] + ' n ' )
if cmd [ 0 ] == ' devoice ' :
s . send ( ' MODE ' + info [ 2 ] + ' -v ' + cmd [ 1 ] + ' n ' )
if cmd [ 0 ] == ' restart ' :
2012-04-09 02:19:39 +00:00
print ( " Restarting thread " )
2012-01-29 14:28:02 +00:00
launch ( s )
2011-12-31 10:14:19 +00:00
if cmd [ 0 ] == ' stop ' :
2012-04-09 02:19:39 +00:00
print ( " Bye! " )
2012-02-20 13:26:41 +00:00
s . send ( " PRIVMSG %s :Bye! \r \n " % ( info [ 2 ] ) )
2011-12-31 10:14:19 +00:00
sys . exit ( 0 )
if cmd [ 0 ] == ' sys ' :
syscmd ( msgpart [ 1 : ] , info [ 2 ] )
if msgpart [ 0 ] == ' - ' and sender [ 0 ] == OWNER : #Treat msgs with - as explicit command to send to server
cmd = msgpart [ 1 : ]
#s.send(cmd+'n')
2012-04-09 02:19:39 +00:00
print ( ' cmd= ' + cmd )
2011-12-31 10:14:19 +00:00
def read ( ) :
global s , readbuffer
while 1 :
readbuffer = readbuffer + s . recv ( 1024 ) #recieve server messages
temp = readbuffer . split ( " \n " )
readbuffer = temp . pop ( )
#signal.signal(signal.SIGHUP, onSignal)
for line in temp :
2012-04-09 02:19:39 +00:00
print ( line )
2011-12-31 10:14:19 +00:00
line = line . rstrip ( ) #remove trailing 'rn'
if line . find ( ' PRIVMSG ' ) != - 1 : #Call a parsing function
parsemsg ( line )
line = line . split ( )
if ( line [ 0 ] == ' PING ' ) : #If server pings then pong
s . send ( " PONG %s \r \n " % line [ 1 ] )
2012-01-29 14:28:02 +00:00
def launch ( s ) :
2012-02-20 13:26:41 +00:00
# thread.start_new_thread(ontime.startThread, (s,datetime(2012, 1, 18, 6, 0, 1),["Il reste%s avant la fin de Wikipédia", "C'est fini, Wikipédia a sombrée depuis%s"],CHANLIST))
2012-03-21 22:12:16 +00:00
# thread.start_new_thread(ontime.startThread, (s,datetime(2012, 2, 23, 0, 0, 1),[],CHANLIST))
thread . start_new_thread ( watchWebsite . startThread , ( s , " you.p0m.fr " , " " , " #42sh #epitaguele " , " Oh, quelle est cette nouvelle image sur http://you.p0m.fr/ ? :p " ) )
2012-02-20 13:26:41 +00:00
thread . start_new_thread ( watchWebsite . startThread , ( s , " intra.nbr23.com " , " " , " #42sh " , " Oh, quel est ce nouveau film sur http://intra.nbr23.com/ ? :p " ) )
2012-04-09 02:19:39 +00:00
print ( " Launched successfuly " )
2012-01-29 14:28:02 +00:00
launch ( s )
2011-12-31 10:14:19 +00:00
read ( )