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 ()