From 0c18611c7f4ec4cdfee24fa28c09ab1ecff3ae98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=A9munaire?= Date: Thu, 12 Apr 2012 03:06:17 +0200 Subject: [PATCH] New module: soutenance --- message.py | 77 +++++++++++---------- nemubot.py | 2 +- server.py | 0 soutenance.py | 186 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 227 insertions(+), 38 deletions(-) mode change 100755 => 100644 message.py mode change 100755 => 100644 server.py create mode 100644 soutenance.py diff --git a/message.py b/message.py old mode 100755 new mode 100644 index a0d7803..ad130e0 --- a/message.py +++ b/message.py @@ -82,6 +82,44 @@ class Message: self.srv.send_msg (self.sender, msg) + def just_countdown (self, delta): + sec = delta.seconds + hours, remainder = divmod(sec, 3600) + minutes, seconds = divmod(remainder, 60) + + sentence = "" + force = False + + if force or delta.days > 0: + force = True + sentence += " %i jour"%(delta.days) + + if delta.days > 1: + sentence += "s" + sentence += "," + + if force or hours > 0: + force = True + sentence += " %i heure"%(hours) + if hours > 1: + sentence += "s" + sentence += "," + + if force or minutes > 0: + force = True + sentence += " %i minute"%(minutes) + if minutes > 1: + sentence += "s" + sentence += " et" + + if force or seconds > 0: + force = True + sentence += " %i seconde"%(seconds) + if seconds > 1: + sentence += "s" + return sentence[1:] + + def countdown_format (self, date, msg_before, msg_after, timezone = None): if timezone != None: os.environ['TZ'] = timezone @@ -95,46 +133,11 @@ class Message: sentence_c = msg_before delta = date - 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 += " %i jour"%(delta.days) - - if delta.days > 1: - sentence += "s" - sentence += "," - - if force or hours > 0: - force = 1 - sentence += " %i heure"%(hours) - if hours > 1: - sentence += "s" - sentence += "," - - if force or minutes > 0: - force = 1 - sentence += " %i minute"%(minutes) - if minutes > 1: - sentence += "s" - sentence += " et" - - if force or seconds > 0: - force = 1 - sentence += " %i seconde"%(seconds) - if seconds > 1: - sentence += "s" - - return sentence_c % sentence[1:] - if timezone != None: os.environ['TZ'] = "Europe/Paris" + return sentence_c % self.just_countdown(delta) + def treat (self, mods): if self.cmd == "PING": diff --git a/nemubot.py b/nemubot.py index f9b1d71..e25f061 100755 --- a/nemubot.py +++ b/nemubot.py @@ -10,7 +10,7 @@ from datetime import datetime from datetime import timedelta from xml.dom.minidom import parse -imports = ["birthday", "qd", "events", "youtube", "watchWebsite"] +imports = ["birthday", "qd", "events", "youtube", "watchWebsite", "soutenance"] imports_launch = ["watchWebsite"] mods = list () import server diff --git a/server.py b/server.py old mode 100755 new mode 100644 diff --git a/soutenance.py b/soutenance.py new file mode 100644 index 0000000..81a3e88 --- /dev/null +++ b/soutenance.py @@ -0,0 +1,186 @@ +# coding=utf-8 + +import http.client +import time +import re +from datetime import date +from datetime import datetime +from datetime import timedelta + +stack = list() + +def getPage (): + conn = http.client.HTTPSConnection("intra.acu.epita.fr") + conn.request("GET", "/intra/sout_liste.html") + + res = conn.getresponse() + data = res.read() + + conn.close() + return data + +class Soutenance: + def __init__(self): + self.hour = None + self.rank = 0 + self.login = None + self.state = None + self.assistant = None + self.start = None + self.end = None + +class SiteSoutenances: + def __init__(self, page): + save = False + self.souts = list() + self.updated = datetime.now () + last = None + for line in page.split("\n"): + if re.match("", line) is not None: + save = False + elif re.match("", line) is not None: + save = True + last = Soutenance() + self.souts.append(last) + elif save: + result = re.match("]+>(.*)", line) + if last.hour is None: + try: + last.hour = datetime.fromtimestamp (time.mktime (time.strptime (result.group(1), "%Y-%m-%d %H:%M"))) + except ValueError: + continue + elif last.rank == 0: + last.rank = int (result.group(1)) + elif last.login == None: + last.login = result.group(1) + elif last.state == None: + last.state = result.group(1) + elif last.assistant == None: + last.assistant = result.group(1) + elif last.start == None: + try: + last.start = datetime.fromtimestamp (time.mktime (time.strptime (result.group(1), "%Y-%m-%d %H:%M"))) + except ValueError: + last.start = None + elif last.end == None: + try: + last.end = datetime.fromtimestamp (time.mktime (time.strptime (result.group(1), "%Y-%m-%d %H:%M"))) + except ValueError: + last.end = None + + def update(self): + if datetime.now () - self.updated < timedelta(hours=1): + return self + else: + return None + + def findAssistants(self): + h = {} + for s in self.souts: + if s.assistant is not None and s.assistant != "": + h[s.assistant] = (s.start, s.end) + return h + + + def findLast(self): + close = None + for s in self.souts: + if s.state != "En attente" and s.start is not None and (close.start is None or close.start < s.start): + close = s + return close + + def findAll(self, login): + ss = list() + for s in self.souts: + if s.login == login: + ss.append(s) + return ss + + def findClose(self, login): + ss = self.findAll(login) + close = None + for s in ss: + if close is None or close.hour > s.hour: + close = s + return close + + +def load_module(datas_path): + """Load this module""" + return + +def save_module(): + """Save the module state""" + return + +def help_tiny (): + """Line inserted in the response to the command !help""" + return None + +def help_full (): + return None + +datas = None + +def parseanswer (msg): + global datas + if msg.cmd[0] == "soutenance" or msg.cmd[0] == "soutenances": + #Starts by updating datas + if datas is not None: + datas = datas.update () + if datas is None: + datas = SiteSoutenances(getPage().decode()) + + if len(msg.cmd) == 1 or msg.cmd[1] == "next": + soutenance = datas.findLast() + if soutenance is None: + msg.send_chn ("Il ne semble pas y avoir de soutenance pour le moment.") + else: + if soutenance.start > soutenance.hour: + avre = "%s de retard"%msg.just_countdown(soutenance.hour - soutenance.start) + else: + avre = "%s d'avance"%msg.just_countdown(soutenance.start - soutenance.hour) + msg.send_chn ("Actuellement à la soutenance numéro %d commencée il y a %s avec %s."%(soutenance.rank, msg.just_countdown(datetime.now () - soutenance.start), avre)) + + else: + name = msg.cmd[1] + + if msg.cmd[0] == "soutenance": + soutenance = datas.findClose(name) + if soutenance is None: + msg.send_chn ("Pas d'horaire de soutenance pour %s."%name) + else: + if soutenance.state == "En cours": + msg.send_chn ("%s est actuellement en soutenance avec %s. Elle était prévue à %s, position %d."%(name, soutenance.assistant, soutenance.hour, soutenance.rank)) + elif soutenance.state == "Effectue": + msg.send_chn ("%s a passé sa soutenance avec %s. Elle a duré %s."%(name, soutenance.assistant, msg.just_countdown(soutenance.end - soutenance.start))) + elif soutenance.state == "Retard": + msg.send_chn ("%s était en retard à sa soutenance de %s."%(name, soutenance.hour)) + else: + msg.send_chn ("Soutenance de %s : %s, position %d."%(name, soutenance.hour, soutenance.rank)) + + elif msg.cmd[0] == "soutenances": + souts = datas.findAll(name) + if souts is None: + msg.send_snd ("Pas de soutenance prévues pour %s."%name) + else: + first = True + for s in souts: + if first: + msg.send_snd ("Soutenance(s) de %s : - %s ;"%(name, s.hour)) + first = False + else: + msg.send_snd (" %s - %s ;"%(len(name)*' ', s.hour)) + + return True + return False + +def parseask (msg): + return False + +def parselisten (msg): + return False + + +def startThread(site): + site.check ()