From e83c4091bfcd74d3970de7c041c042611604c439 Mon Sep 17 00:00:00 2001 From: nemunaire Date: Sat, 14 Nov 2015 16:17:25 +0100 Subject: [PATCH] Avoid catchall DirectAsk --- modules/events.py | 102 +++++++++++++++++++++++++--------------------- nemubot/bot.py | 8 ++-- 2 files changed, 60 insertions(+), 50 deletions(-) diff --git a/modules/events.py b/modules/events.py index 7d79a08..2887514 100644 --- a/modules/events.py +++ b/modules/events.py @@ -14,9 +14,11 @@ from nemubot.tools.xmlparser.node import ModuleState from more import Response + def help_full (): return "This module store a lot of events: ny, we, " + (", ".join(context.datas.index.keys())) + "\n!eventslist: gets list of timer\n!start /something/: launch a timer" + def load(context): #Define the index context.data.setIndex("name") @@ -35,6 +37,7 @@ def fini(d, strend): context.data.delChild(context.data.index[strend["name"]]) context.save() + @hook.command("goûter") def cmd_gouter(msg): ndate = datetime.now(timezone.utc) @@ -44,6 +47,7 @@ def cmd_gouter(msg): "Nous avons %s de retard pour le goûter :("), channel=msg.channel) + @hook.command("week-end") def cmd_we(msg): ndate = datetime.now(timezone.utc) + timedelta(5 - datetime.today().weekday()) @@ -53,6 +57,7 @@ def cmd_we(msg): "Youhou, on est en week-end depuis %s."), channel=msg.channel) + @hook.command("start") def start_countdown(msg): """!start /something/: launch a timer""" @@ -132,6 +137,7 @@ def start_countdown(msg): msg.date.strftime("%A %d %B %Y à %H:%M:%S")), nick=msg.frm) + @hook.command("end") @hook.command("forceend") def end_countdown(msg): @@ -151,6 +157,7 @@ def end_countdown(msg): else: return Response("%s n'est pas un compteur connu."% (msg.args[0]), channel=msg.channel, nick=msg.nick) + @hook.command("eventslist") def liste(msg): """!eventslist: gets list of timer""" @@ -166,6 +173,7 @@ def liste(msg): else: return Response("Compteurs connus : %s." % ", ".join(context.data.index.keys()), channel=msg.channel) + @hook.command(match=lambda msg: isinstance(msg, Command) and msg.cmd in context.data.index) def parseanswer(msg): res = Response(channel=msg.channel) @@ -183,59 +191,59 @@ def parseanswer(msg): res.append_message(countdown_format(context.data.index[msg.cmd].getDate("start"), context.data.index[msg.cmd]["msg_before"], context.data.index[msg.cmd]["msg_after"])) return res + RGXP_ask = re.compile(r"^.*((create|new)\s+(a|an|a\s*new|an\s*other)?\s*(events?|commande?)|(nouvel(le)?|ajoute|cr[ée]{1,3})\s+(un)?\s*([eé]v[ée]nements?|commande?)).*$", re.I) -@hook.ask() +@hook.ask(match=lambda msg: RGXP_ask.match(msg.text)) def parseask(msg): - if RGXP_ask.match(msg.text) is not None: - name = re.match("^.*!([^ \"'@!]+).*$", msg.text) - if name is None: - raise IMException("il faut que tu attribues une commande à l'événement.") - if name.group(1) in context.data.index: - raise IMException("un événement portant ce nom existe déjà.") + name = re.match("^.*!([^ \"'@!]+).*$", msg.text) + if name is None: + raise IMException("il faut que tu attribues une commande à l'événement.") + if name.group(1) in context.data.index: + raise IMException("un événement portant ce nom existe déjà.") - texts = re.match("^[^\"]*(avant|après|apres|before|after)?[^\"]*\"([^\"]+)\"[^\"]*((avant|après|apres|before|after)?.*\"([^\"]+)\".*)?$", msg.text, re.I) - if texts is not None and texts.group(3) is not None: - extDate = extractDate(msg.text) - if extDate is None or extDate == "": - raise IMException("la date de l'événement est invalide !") + texts = re.match("^[^\"]*(avant|après|apres|before|after)?[^\"]*\"([^\"]+)\"[^\"]*((avant|après|apres|before|after)?.*\"([^\"]+)\".*)?$", msg.text, re.I) + if texts is not None and texts.group(3) is not None: + extDate = extractDate(msg.text) + if extDate is None or extDate == "": + raise IMException("la date de l'événement est invalide !") - 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 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 or msg_after.find("%s") == -1: - raise IMException("Pour que l'événement soit valide, ajouter %s à" - " l'endroit où vous voulez que soit ajouté le" - " compte à rebours.") + if msg_before.find("%s") == -1 or msg_after.find("%s") == -1: + raise IMException("Pour que l'événement soit valide, ajouter %s à" + " l'endroit où vous voulez que soit ajouté le" + " compte à rebours.") - evt = ModuleState("event") - evt["server"] = msg.server - evt["channel"] = msg.channel - evt["proprio"] = msg.nick - evt["name"] = name.group(1) - evt["start"] = extDate - evt["msg_after"] = msg_after - evt["msg_before"] = msg_before - context.data.addChild(evt) - context.save() - return Response("Nouvel événement !%s ajouté avec succès." % name.group(1), - channel=msg.channel) + evt = ModuleState("event") + evt["server"] = msg.server + evt["channel"] = msg.channel + evt["proprio"] = msg.nick + evt["name"] = name.group(1) + evt["start"] = extDate + evt["msg_after"] = msg_after + evt["msg_before"] = msg_before + context.data.addChild(evt) + context.save() + return Response("Nouvel événement !%s ajouté avec succès." % name.group(1), + channel=msg.channel) - elif texts is not None and texts.group (2) is not None: - evt = ModuleState("event") - evt["server"] = msg.server - evt["channel"] = msg.channel - evt["proprio"] = msg.nick - evt["name"] = name.group(1) - evt["msg_before"] = texts.group (2) - context.data.addChild(evt) - context.save() - return Response("Nouvelle commande !%s ajoutée avec succès." % name.group(1), - channel=msg.channel) + elif texts is not None and texts.group(2) is not None: + evt = ModuleState("event") + evt["server"] = msg.server + evt["channel"] = msg.channel + evt["proprio"] = msg.nick + evt["name"] = name.group(1) + evt["msg_before"] = texts.group (2) + context.data.addChild(evt) + context.save() + return Response("Nouvelle commande !%s ajoutée avec succès." % name.group(1), + channel=msg.channel) - else: - raise IMException("Veuillez indiquez les messages d'attente et d'après événement entre guillemets.") + else: + raise IMException("Veuillez indiquez les messages d'attente et d'après événement entre guillemets.") diff --git a/nemubot/bot.py b/nemubot/bot.py index 44b2bac..f9569b7 100644 --- a/nemubot/bot.py +++ b/nemubot/bot.py @@ -72,9 +72,11 @@ class Bot(threading.Thread): import re def in_ping(msg): - if re.match("^ *(m[' ]?entends?[ -]+tu|h?ear me|do you copy|ping)", msg.message, re.I) is not None: - return msg.respond("pong") - self.treater.hm.add_hook(nemubot.hooks.Message(in_ping), "in", "DirectAsk") + return msg.respond("pong") + self.treater.hm.add_hook(nemubot.hooks.Message(in_ping, + match=lambda msg: re.match("^ *(m[' ]?entends?[ -]+tu|h?ear me|do you copy|ping)", + msg.message, re.I)), + "in", "DirectAsk") def in_echo(msg): from nemubot.message import Text