New module: soutenance
This commit is contained in:
parent
4f0744ab24
commit
0c18611c7f
77
message.py
Executable file → Normal file
77
message.py
Executable file → Normal file
|
@ -82,6 +82,44 @@ class Message:
|
||||||
self.srv.send_msg (self.sender, msg)
|
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):
|
def countdown_format (self, date, msg_before, msg_after, timezone = None):
|
||||||
if timezone != None:
|
if timezone != None:
|
||||||
os.environ['TZ'] = timezone
|
os.environ['TZ'] = timezone
|
||||||
|
@ -95,46 +133,11 @@ class Message:
|
||||||
sentence_c = msg_before
|
sentence_c = msg_before
|
||||||
delta = date - datetime.now()
|
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:
|
if timezone != None:
|
||||||
os.environ['TZ'] = "Europe/Paris"
|
os.environ['TZ'] = "Europe/Paris"
|
||||||
|
|
||||||
|
return sentence_c % self.just_countdown(delta)
|
||||||
|
|
||||||
|
|
||||||
def treat (self, mods):
|
def treat (self, mods):
|
||||||
if self.cmd == "PING":
|
if self.cmd == "PING":
|
||||||
|
|
|
@ -10,7 +10,7 @@ from datetime import datetime
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from xml.dom.minidom import parse
|
from xml.dom.minidom import parse
|
||||||
|
|
||||||
imports = ["birthday", "qd", "events", "youtube", "watchWebsite"]
|
imports = ["birthday", "qd", "events", "youtube", "watchWebsite", "soutenance"]
|
||||||
imports_launch = ["watchWebsite"]
|
imports_launch = ["watchWebsite"]
|
||||||
mods = list ()
|
mods = list ()
|
||||||
import server
|
import server
|
||||||
|
|
186
soutenance.py
Normal file
186
soutenance.py
Normal file
|
@ -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("</tr>", line) is not None:
|
||||||
|
save = False
|
||||||
|
elif re.match("<tr.*>", line) is not None:
|
||||||
|
save = True
|
||||||
|
last = Soutenance()
|
||||||
|
self.souts.append(last)
|
||||||
|
elif save:
|
||||||
|
result = re.match("<td[^>]+>(.*)</td>", 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 ()
|
Loading…
Reference in New Issue
Block a user