From e7f9d329ccedfa0d9ed3d6e06922bf5f775ebb9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=A9munaire?= Date: Thu, 16 Aug 2012 04:34:22 +0200 Subject: [PATCH] Convert the events module to v3.2 --- modules/events.xml | 17 +++- modules/events/Manager.py | 48 ---------- modules/events/__init__.py | 192 +++++++++++++++++++------------------ 3 files changed, 117 insertions(+), 140 deletions(-) delete mode 100644 modules/events/Manager.py diff --git a/modules/events.xml b/modules/events.xml index cfe99a1..ceca83d 100644 --- a/modules/events.xml +++ b/modules/events.xml @@ -1,2 +1,17 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + diff --git a/modules/events/Manager.py b/modules/events/Manager.py deleted file mode 100644 index d638d70..0000000 --- a/modules/events/Manager.py +++ /dev/null @@ -1,48 +0,0 @@ -# coding=utf-8 - -from datetime import datetime -import threading - -newStrendEvt = threading.Event() - -class Manager(threading.Thread): - def __init__(self, datas, srvs): - self.stop = False - self.DATAS = datas - self.SRVS = srvs - threading.Thread.__init__(self) - - def alertEnd(self, evt): - global newStrendEvt - #Send the message on each matched servers - for server in self.SRVS.keys(): - if not evt.hasAttribute("server") or server == evt["server"]: - if evt["channel"] == self.SRVS[server].nick: - self.SRVS[server].send_msg_usr(evt["proprio"], "%s: %s arrivé à échéance." % (evt["proprio"], evt["name"])) - else: - self.SRVS[server].send_msg(evt["channel"], "%s: %s arrivé à échéance." % (evt["proprio"], evt["name"])) - self.DATAS.delChild(self.DATAS.index[evt["name"]]) - save() - newStrendEvt.set() - - def run(self): - global newStrendEvt - while not self.stop: - newStrendEvt.clear() - closer = None - #Gets the closer event - for evt in self.DATAS.index.keys(): - if self.DATAS.index[evt].hasAttribute("end") and (closer is None or self.DATAS.index[evt].getDate("end") < closer.getDate("end")) and self.DATAS.index[evt].getDate("end") > datetime.now(): - closer = self.DATAS.index[evt] - if closer is not None and closer.hasAttribute("end"): - #print ("Closer: %s à %s"%(closer.name, closer["end"])) - timeleft = (closer.getDate("end") - datetime.now()).seconds - timer = threading.Timer(timeleft, self.alertEnd, (closer,)) - timer.start() - #print ("Start timer (%ds)"%timeleft) - - newStrendEvt.wait() - - if closer is not None and closer.hasAttribute("end") and closer.getDate("end") > datetime.now(): - timer.cancel() - self.threadManager = None diff --git a/modules/events/__init__.py b/modules/events/__init__.py index 349a939..10152bf 100644 --- a/modules/events/__init__.py +++ b/modules/events/__init__.py @@ -8,11 +8,11 @@ from datetime import datetime import time import threading -nemubotversion = 3.0 +nemubotversion = 3.2 -from module_state import ModuleState - -from . import Manager +from event import ModuleEvent +from hooks import Hook +from xmlparser.node import ModuleState def help_tiny (): """Line inserted in the response to the command !help""" @@ -21,109 +21,119 @@ def help_tiny (): def help_full (): return "This module store a lot of events: ny, we, vacs, " + (", ".join(DATAS.index.keys())) + "\n!eventslist: gets list of timer\n!start /something/: launch a timer" +CONTEXT = None -threadManager = None +def load(context): + global DATAS, CONTEXT + CONTEXT = context + #Define the index + DATAS.setIndex("name") -def load(): - global DATAS, SRVS, threadManager - #Define the index - DATAS.setIndex("name") - #Load the manager - Manager.save = save - threadManager = Manager.Manager(DATAS, SRVS) - threadManager.start() + for evt in DATAS.index.keys(): + if DATAS.index[evt].hasAttribute("end"): + event = ModuleEvent(call=fini, call_data=dict(strend=DATAS.index[evt])) + event.end = DATAS.index[evt].getDate("end") + context.add_event(event) + context.hooks.add_hook(context.hooks.cmd_hook, + Hook(other, DATAS.index[evt]["name"])) -def reload(): - imp.reload(Manager) +def fini(strend): + for server in CONTEXT.servers.keys(): + if not strend.hasAttribute("server") or server == strend["server"]: + if strend["channel"] == CONTEXT.servers[server].nick: + CONTEXT.servers[server].send_msg_usr(strend["proprio"], "%s: %s arrivé à échéance." % (strend["proprio"], strend["name"])) + else: + CONTEXT.servers[server].send_msg(strend["channel"], "%s: %s arrivé à échéance." % (strend["proprio"], strend["name"])) + DATAS.delChild(DATAS.index[strend["name"]]) + save() -def close(): - global threadManager - if threadManager is not None: - threadManager.stop = True - Manager.newStrendEvt.set() - - -def parseanswer(msg): - global DATAS - if msg.cmd[0] == "we" or msg.cmd[0] == "week-end" or msg.cmd[0] == "weekend": +def cmd_we(data, msg): ndate = datetime.today() + timedelta(5 - datetime.today().weekday()) ndate = datetime(ndate.year, ndate.month, ndate.day, 0, 0, 1) msg.send_chn ( - msg.countdown_format (ndate, - "Il reste %s avant le week-end, courage ;)", - "Youhou, on est en week-end depuis %s.")) - return True - elif msg.cmd[0] == "new-year" or msg.cmd[0] == "newyear" or msg.cmd[0] == "ny": - msg.send_chn ( - msg.countdown_format (datetime(datetime.today().year + 1, 1, 1, 0, 0, 1), - "Il reste %s avant la nouvelle année.", - "Nous faisons déjà la fête depuis %s !")) - return True - elif msg.cmd[0] == "vacances" or msg.cmd[0] == "vacs" or msg.cmd[0] == "holiday" or msg.cmd[0] == "holidays": - msg.send_chn ( - msg.countdown_format (datetime(2012, 7, 30, 18, 0, 1), - "Il reste %s avant les vacances :)", - "Profitons, c'est les vacances depuis %s.")) - return True - elif msg.cmd[0] == "start" and len(msg.cmd) > 1: - if msg.cmd[1] not in DATAS: - strnd = ModuleState("strend") - strnd["server"] = msg.srv.id - strnd["channel"] = msg.channel - strnd["proprio"] = msg.nick - strnd["start"] = datetime.now() - strnd["name"] = msg.cmd[1] - DATAS.addChild(strnd) + msg.countdown_format (ndate, + "Il reste %s avant le week-end, courage ;)", + "Youhou, on est en week-end depuis %s.")) - if len(msg.cmd) > 2: - result = re.match("([0-9]+)([smhdjSMHDJ])?", msg.cmd[2]) - if result is not None: - try: - if result.group(2) is not None and (result.group(2) == "m" or result.group(2) == "M"): - strnd["end"] = datetime.now() + timedelta(minutes=int(result.group(1))) - elif result.group(2) is not None and (result.group(2) == "h" or result.group(2) == "H"): - strnd["end"] = datetime.now() + timedelta(hours=int(result.group(1))) - elif result.group(2) is not None and (result.group(2) == "d" or result.group(2) == "D" or result.group(2) == "j" or result.group(2) == "J"): - strnd["end"] = datetime.now() + timedelta(days=int(result.group(1))) +def cmd_newyear(data, msg): + msg.send_chn ( + msg.countdown_format (datetime(datetime.today().year + 1, 1, 1, 0, 0, 1), + "Il reste %s avant la nouvelle année.", + "Nous faisons déjà la fête depuis %s !")) + +def cmd_vacances(data, msg): + msg.send_chn ( + msg.countdown_format (datetime(2012, 7, 30, 18, 0, 1), + "Il reste %s avant les vacances :)", + "Profitons, c'est les vacances depuis %s.")) + +def start_countdown(data, msg): + if msg.cmd[1] not in DATAS: + + strnd = ModuleState("strend") + strnd["server"] = msg.srv.id + strnd["channel"] = msg.channel + strnd["proprio"] = msg.nick + strnd["start"] = datetime.now() + strnd["name"] = msg.cmd[1] + DATAS.addChild(strnd) + + evt = ModuleEvent(call=fini, call_data=dict(strend=strnd)) + + if len(msg.cmd) > 2: + result = re.match("([0-9]+)([smhdjSMHDJ])?", msg.cmd[2]) + if result is not None: + try: + if result.group(2) is not None and (result.group(2) == "m" or result.group(2) == "M"): + strnd["end"] = datetime.now() + timedelta(minutes=int(result.group(1))) + elif result.group(2) is not None and (result.group(2) == "h" or result.group(2) == "H"): + strnd["end"] = datetime.now() + timedelta(hours=int(result.group(1))) + elif result.group(2) is not None and (result.group(2) == "d" or result.group(2) == "D" or result.group(2) == "j" or result.group(2) == "J"): + strnd["end"] = datetime.now() + timedelta(days=int(result.group(1))) + else: + strnd["end"] = datetime.now() + timedelta(seconds=int(result.group(1))) + evt.end = strnd.getDate("end") + CONTEXT.add_event(evt) + msg.send_snd ("%s commencé le %s et se terminera le %s."% (msg.cmd[1], datetime.now(), strnd.getDate("end"))) + except: + msg.send_snd ("Impossible de définir la fin de %s."% (msg.cmd[1])) + msg.send_snd ("%s commencé le %s."% (msg.cmd[1], datetime.now())) else: - strnd["end"] = datetime.now() + timedelta(seconds=int(result.group(1))) - Manager.newStrendEvt.set() - msg.send_snd ("%s commencé le %s et se terminera le %s."% (msg.cmd[1], datetime.now(), strnd.getDate("end"))) - except: - msg.send_snd ("Impossible de définir la fin de %s."% (msg.cmd[1])) - msg.send_snd ("%s commencé le %s."% (msg.cmd[1], datetime.now())) - else: - msg.send_snd ("%s commencé le %s"% (msg.cmd[1], datetime.now())) - save() - else: - msg.send_snd ("%s existe déjà."% (msg.cmd[1])) - return True - elif (msg.cmd[0] == "end" or msg.cmd[0] == "forceend") and len(msg.cmd) > 1: - if msg.cmd[1] in DATAS.index: - msg.send_chn ("%s a duré %s." % (msg.cmd[1], msg.just_countdown(datetime.now () - DATAS.index[msg.cmd[1]].getDate("start")))) - if DATAS.index[msg.cmd[1]]["proprio"] == msg.nick or (msg.cmd[0] == "forceend" and msg.nick == msg.srv.owner): - DATAS.delChild(DATAS.index[msg.cmd[1]]) - Manager.newStrendEvt.set() + msg.send_snd ("%s commencé le %s"% (msg.cmd[1], datetime.now())) + + context.hooks.add_hook(context.hooks.cmd_hook, + Hook(other, DATAS.index[evt]["name"])) save() - else: - msg.send_snd ("Vous ne pouvez pas terminer le compteur %s, créé par %s."% (msg.cmd[1], DATAS.index[msg.cmd[1]]["proprio"])) else: - msg.send_snd ("%s n'est pas un compteur connu."% (msg.cmd[1])) + msg.send_snd ("%s existe déjà."% (msg.cmd[1])) return True - elif msg.cmd[0] == "eventslist" or msg.cmd[0] == "eventlist" or msg.cmd[0] == "eventsliste" or msg.cmd[0] == "eventliste": + +def end_countdown(data, msg): + if msg.cmd[1] in DATAS.index: + msg.send_chn ("%s a duré %s." % (msg.cmd[1], msg.just_countdown(datetime.now () - DATAS.index[msg.cmd[1]].getDate("start")))) + if DATAS.index[msg.cmd[1]]["proprio"] == msg.nick or (msg.cmd[0] == "forceend" and msg.nick == msg.srv.owner): + DATAS.delChild(DATAS.index[msg.cmd[1]]) + Manager.newStrendEvt.set() + save() + else: + msg.send_snd ("Vous ne pouvez pas terminer le compteur %s, créé par %s."% (msg.cmd[1], DATAS.index[msg.cmd[1]]["proprio"])) + else: + msg.send_snd ("%s n'est pas un compteur connu."% (msg.cmd[1])) + return True + +def liste(data, msg): msg.send_snd ("Compteurs connus : %s." % ", ".join(DATAS.index.keys())) - elif msg.cmd[0] in DATAS.index: + +def other(data, msg): if DATAS.index[msg.cmd[0]].name == "strend": - if DATAS.index[msg.cmd[0]].hasAttribute("end"): - msg.send_chn ("%s commencé il y a %s et se terminera dans %s." % (msg.cmd[0], msg.just_countdown(datetime.now() - DATAS.index[msg.cmd[0]].getDate("start")), msg.just_countdown(DATAS.index[msg.cmd[0]].getDate("end") - datetime.now()))) - else: - msg.send_chn ("%s commencé il y a %s." % (msg.cmd[0], msg.just_countdown(datetime.now () - DATAS.index[msg.cmd[0]].getDate("start")))) + if DATAS.index[msg.cmd[0]].hasAttribute("end"): + msg.send_chn ("%s commencé il y a %s et se terminera dans %s." % (msg.cmd[0], msg.just_countdown(datetime.now() - DATAS.index[msg.cmd[0]].getDate("start")), msg.just_countdown(DATAS.index[msg.cmd[0]].getDate("end") - datetime.now()))) + else: + msg.send_chn ("%s commencé il y a %s." % (msg.cmd[0], msg.just_countdown(datetime.now () - DATAS.index[msg.cmd[0]].getDate("start")))) else: - msg.send_chn (msg.countdown_format (DATAS.index[msg.cmd[0]].getDate("start"), DATAS.index[msg.cmd[0]]["msg_before"], DATAS.index[msg.cmd[0]]["msg_after"])) - save() + msg.send_chn (msg.countdown_format (DATAS.index[msg.cmd[0]].getDate("start"), DATAS.index[msg.cmd[0]]["msg_before"], DATAS.index[msg.cmd[0]]["msg_after"])) + save() return True - else: - return False def parseask(msg):