From c3a7318489ad10dde3f3ed12ed687cd4b8841557 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=A9munaire?= Date: Sat, 31 Dec 2011 11:14:19 +0100 Subject: [PATCH] Second revision of nemubot with thread for time related events, newyear script, norme checker script, some commands --- nemubot.py | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++ newyear.py | 67 +++++++++++++++++++++++++++++++++++ norme.py | 44 +++++++++++++++++++++++ ontime.py | 43 +++++++++++++++++++++++ 4 files changed, 255 insertions(+) create mode 100755 nemubot.py create mode 100644 newyear.py create mode 100644 norme.py create mode 100644 ontime.py diff --git a/nemubot.py b/nemubot.py new file mode 100755 index 0000000..070b716 --- /dev/null +++ b/nemubot.py @@ -0,0 +1,101 @@ +#!/usr/bin/python2.7 +# coding=utf-8 + +#import signal +import sys +import socket +import string +import os +import re +import thread + +import norme +import newyear +import ontime + +if len(sys.argv) > 1: + sys.exit(0) + +HOST='192.168.0.242' +PORT=2770 +#HOST='irc.rezosup.org' +#PORT=6667 +NICK='nemubot' +IDENT='nemubot' +REALNAME='nemubot' +OWNER='nemunaire' #The bot owner's nick +#CHANLIST='#nemutest' +CHANLIST='#42sh #nemutest' +readbuffer='' #Here we store all the messages from server + +s = socket.socket( ) #Create the socket +s.connect((HOST, PORT)) #Connect to server +s.send("PASS %s\r\n" % "McsuapTesbuf") +s.send("NICK %s\r\n" % NICK) +s.send("USER %s %s bla :%s\r\n" % (IDENT, HOST, REALNAME)) +#s.send("JOIN %s\r\n" % CHANLIST) + +print("Welcome on Nemubot. I operate on %s. My PID is %i" % (CHANLIST, os.getpid())) + +def parsemsg(msg): + complete = msg[1:].split(':',1) #Parse the message into useful data + info = complete[0].split(' ') + msgpart = complete[1] + sender = info[0].split('!') + + 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) + + elif msgpart[0] == '!' and CHANLIST.find(info[2]) != -1: #Treat all messages starting with '!' as command + cmd=msgpart[1:].split(' ') + if cmd[0] == 'new-year' or cmd[0] == 'newyear' or cmd[0] == 'ny': + newyear.launch (s, info[2], cmd) + + + 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': + print "Restarting thread" + thread.start_new_thread(ontime.startThread, (s,CHANLIST)) + if cmd[0]=='stop': + print "Bye!" + s.send("PRIVMSG {0} :Bye!\r\n".format(info[2])) + 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') + print 'cmd='+cmd + +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: + print line + 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]) + +thread.start_new_thread(ontime.startThread, (s,CHANLIST)) +read() diff --git a/newyear.py b/newyear.py new file mode 100644 index 0000000..20e03cd --- /dev/null +++ b/newyear.py @@ -0,0 +1,67 @@ +# coding=utf-8 +import re +import os +from datetime import datetime +import time + +def launch(s, chan, msgpart): + #What is the next year? + nyear = datetime.today().year + 1; + + if msgpart != 0 and len(msgpart) > 1: + os.environ['TZ'] = msgpart[1] + time.tzset() + + sentence_c = "PRIVMSG " + chan + " :" + + #Calculate time before new year + if datetime.now() > datetime(nyear, 1, 1, 0, 0, 1): + sentence_c += "Nous faisons déjà la fête depuis{0}" + delta = datetime.now() - datetime(nyear, 1, 1, 0, 0, 1) + + else: + sentence_c += "Il reste{0} avant la nouvelle année" + delta = datetime(nyear, 1, 1, 0, 0, 1) - datetime.now() + + sec = delta.seconds + hours, remainder = divmod(sec, 3600) + minutes, seconds = divmod(remainder, 60) + + sentence = "" + force = 0 + + if force or delta.days > 0: + force = 1 + sentence += " {0} jour".format(delta.days) + + if delta.days > 1: + sentence += "s" + sentence += "," + + if force or hours > 0: + force = 1 + sentence += " {0} heure".format(hours) + if hours > 1: + sentence += "s" + sentence += "," + + if force or minutes > 0: + force = 1 + sentence += " {0} minute".format(minutes) + if minutes > 1: + sentence += "s" + sentence += " et" + + if force or seconds > 0: + force = 1 + sentence += " {0} seconde".format(seconds) + if seconds > 1: + sentence += "s" + + s.send(sentence_c.format(sentence) + "\r\n") + + if msgpart != 0 and len(msgpart) > 1: + os.environ['TZ'] = "Europe/Paris" + +def special(s, chan): + s.send("PRIVMSG {0} :Bonne année {1} !\r\n".format(chan, datetime.today().year)) diff --git a/norme.py b/norme.py new file mode 100644 index 0000000..49dfb6b --- /dev/null +++ b/norme.py @@ -0,0 +1,44 @@ +import re +import os +import subprocess + +def launch(s, sender, msgpart): + result = re.match(".*((dans|in) (la |the )?bran?ch?e?|(dans|in) (la |the )?bran?c?he?) +([^ ]+).*", msgpart) + if result is not None: + branch = "acu/" + result.group(6); + else: + branch = "master" + + result = re.match(".*(dans|in) (la |the |le fichier |le dossier )?([^b][^r][^ ]+).*", msgpart) + if result is not None and re.search("(^/|.*\.\..*)", result.group(3)) is None: + checkpath = result.group(3) + if not os.path.exists(checkpath): + if os.path.exists("./src/" + checkpath): + checkpath = "./src/" + checkpath + else: + dirList = os.listdir("./src/") + for f in dirList: + if os.path.exists("./src/" + os.path.basename(f) + "/" + checkpath): + checkpath = "./src/" + os.path.basename(f) + "/" + checkpath + break + + if not os.path.exists(checkpath): + s.send("PRIVMSG %s :I don't find %s in branch %s\r\n" % (sender[0], checkpath, branch)) + return + else: + checkpath = "./src/" + + if subprocess.call(["git", "checkout", branch]) == 0: + try: + #s.send("PRIVMSG %s :Let me check %s in %s\r\n" % (sender[0], branch, checkpath)) + faults = subprocess.check_output(["/home/nemunaire/workspace_/moulinette/main.py", checkpath]) + lines = faults.split('\n') + for l in lines: + if len(l) > 1: + #print l + #print sender + s.send("PRIVMSG %s :%s\r\n" % (sender[0], l)) + except: + s.send("PRIVMSG %s :An error occurs, all is broken\r\n" % sender[0]) + else: + s.send("PRIVMSG %s :I haven't the branch %s here.\r\n" % (sender[0], branch)) diff --git a/ontime.py b/ontime.py new file mode 100644 index 0000000..375f2c2 --- /dev/null +++ b/ontime.py @@ -0,0 +1,43 @@ +# coding=utf-8 +from datetime import datetime +import time + +import newyear + +def sync(sec): + print "Time thread synchronization..." + + time.sleep(((60 + sec) - datetime.now().second - 1) % 60) + + while datetime.now().second % sec != 0: + time.sleep (0.1) + + time.sleep (0.4) + + print "Synchonized on {0}={1} seconds...".format(sec, datetime.now().second) + + +def startThread(s, CHANLIST): + sync (60); + while 1: + minute = datetime.now ().minute + + if minute == 0 and datetime.now ().hour == 0 and datetime.now ().day == 1 and datetime.now ().month == 1: + print("Happy new year!") + for chan in CHANLIST.split(): + newyear.special (s, chan) + + if minute == 18: + for chan in CHANLIST.split(): + newyear.launch (s, chan, 0) + + if minute == 42: + sync(42) + print("42!") + for chan in CHANLIST.split(): + s.send("PRIVMSG %s :42 !\r\n" % chan) + + if datetime.now ().second != 0: + sync(60) + else: + time.sleep(60)