1
0
Fork 0

New module: soutenance

This commit is contained in:
Némunaire 2012-04-12 03:06:17 +02:00
parent 4f0744ab24
commit 0c18611c7f
4 changed files with 227 additions and 38 deletions

77
message.py Executable file → Normal file
View File

@ -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":

View File

@ -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

0
server.py Executable file → Normal file
View File

186
soutenance.py Normal file
View 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 ()