# coding=utf-8 import imp import re import sys from datetime import timedelta from datetime import datetime import time import threading import traceback nemubotversion = 3.2 from event import ModuleEvent from hooks import Hook def help_tiny (): """Line inserted in the response to the command !help""" return "events manager" 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 def load(context): global DATAS, CONTEXT CONTEXT = context #Define the index DATAS.setIndex("name") 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") DATAS.index[evt]["id"] = context.add_event(event) 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["sender"], "%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 cmd_we(msg): ndate = datetime.today() + timedelta(5 - datetime.today().weekday()) ndate = datetime(ndate.year, ndate.month, ndate.day, 0, 0, 1) return Response(msg.sender, msg.countdown_format(ndate, "Il reste %s avant le week-end, courage ;)", "Youhou, on est en week-end depuis %s."), channel=msg.channel) def cmd_newyear(msg): return Response(msg.sender, 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 !"), channel=msg.channel) def cmd_vacances(msg): return Response(msg.sender, msg.countdown_format(datetime(2013, 7, 30, 18, 0, 1), "Il reste %s avant les vacances :)", "Profitons, c'est les vacances depuis %s."), channel=msg.channel) def start_countdown(msg): if msg.cmd[1] not in DATAS.index: strnd = ModuleState("strend") strnd["server"] = msg.srv.id strnd["channel"] = msg.channel strnd["proprio"] = msg.nick strnd["sender"] = msg.sender 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") strnd["id"] = CONTEXT.add_event(evt) save() return Response(msg.sender, "%s commencé le %s et se terminera le %s."% (msg.cmd[1], datetime.now(), strnd.getDate("end"))) except: save() return Response(msg.sender, "Impossible de définir la fin de %s.\n%s commencé le %s."% (msg.cmd[1], msg.cmd[1], datetime.now())) save() return Response(msg.sender, "%s commencé le %s"% (msg.cmd[1], datetime.now())) else: return Response(msg.sender, "%s existe déjà."% (msg.cmd[1])) def end_countdown(msg): if msg.cmd[1] in DATAS.index: res = Response(msg.sender, "%s a duré %s." % (msg.cmd[1], msg.just_countdown(datetime.now () - DATAS.index[msg.cmd[1]].getDate("start"))), channel=msg.channel) if DATAS.index[msg.cmd[1]]["proprio"] == msg.nick or (msg.cmd[0] == "forceend" and msg.nick == msg.srv.owner): CONTEXT.del_event(DATAS.index[msg.cmd[1]]["id"]) DATAS.delChild(DATAS.index[msg.cmd[1]]) save() else: res.append_message("Vous ne pouvez pas terminer le compteur %s, créé par %s."% (msg.cmd[1], DATAS.index[msg.cmd[1]]["proprio"])) return res else: return Response(msg.sender, "%s n'est pas un compteur connu."% (msg.cmd[1])) def liste(msg): msg.send_snd ("Compteurs connus : %s." % ", ".join(DATAS.index.keys())) def parseanswer(msg): if msg.cmd[0] in DATAS.index: if DATAS.index[msg.cmd[0]].name == "strend": if DATAS.index[msg.cmd[0]].hasAttribute("end"): return Response(msg.sender, "%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())), channel=msg.channel) else: return Response(msg.sender, "%s commencé il y a %s." % (msg.cmd[0], msg.just_countdown(datetime.now () - DATAS.index[msg.cmd[0]].getDate("start"))), channel=msg.channel) else: save() return Response(msg.sender, msg.countdown_format (DATAS.index[msg.cmd[0]].getDate("start"), DATAS.index[msg.cmd[0]]["msg_before"], DATAS.index[msg.cmd[0]]["msg_after"]), channel=msg.channel) def parseask(msg): msgl = msg.content.lower() if re.match("^.*((create|new) +(a|an|a +new|an *other)? *(events?|commande?)|(nouvel(le)?|ajoute|cr[ée]{1,3}) +(un)? *([eé]v[ée]nements?|commande?)).*$", msgl) is not None: name = re.match("^.*!([^ \"'@!]+).*$", msg.content) if name is not None and name.group (1) not in DATAS.index: texts = re.match("^[^\"]*(avant|après|apres|before|after)?[^\"]*\"([^\"]+)\"[^\"]*((avant|après|apres|before|after)?.*\"([^\"]+)\".*)?$", msg.content) if texts is not None and texts.group (3) is not None: extDate = msg.extractDate () if extDate is None or extDate == "": return Response(msg.sender, "La date de l'événement est invalide...", channel=msg.channel) else: if texts.group (1) is not None and (texts.group (1) == "après" or texts.group (1) == "apres" or texts.group (1) == "after"): msg_after = texts.group (2) msg_before = texts.group (5) if (texts.group (4) is not None and (texts.group (4) == "après" or texts.group (4) == "apres" or texts.group (4) == "after")) or texts.group (1) is None: msg_before = texts.group (2) msg_after = texts.group (5) if msg_before.find ("%s") != -1 and msg_after.find ("%s") != -1: evt = ModuleState("event") evt["server"] = msg.srv.id evt["channel"] = msg.channel evt["proprio"] = msg.nick evt["sender"] = msg.sender evt["name"] = name.group(1) evt["start"] = extDate evt["msg_after"] = msg_after evt["msg_before"] = msg_before DATAS.addChild(evt) save() return Response(msg.sender, "Nouvel événement !%s ajouté avec succès." % name.group(1), msg.channel) else: return Response(msg.sender, "Pour que l'événement soit valide, ajouter %s à" " l'endroit où vous voulez que soit ajouté le" " compte à rebours.") elif texts is not None and texts.group (2) is not None: evt = ModuleState("event") evt["server"] = msg.srv.id evt["channel"] = msg.channel evt["proprio"] = msg.nick evt["sender"] = msg.sender evt["name"] = name.group(1) evt["msg_before"] = texts.group (2) DATAS.addChild(evt) save() return Response(msg.sender, "Nouvelle commande !%s ajoutée avec succès." % name.group(1)) else: return Response(msg.sender, "Veuillez indiquez les messages d'attente et d'après événement entre guillemets.") elif name is None: return Response(msg.sender, "Veuillez attribuer une commande à l'événement.") else: return Response(msg.sender, "Un événement portant ce nom existe déjà.")