Example #1
0
def parseask(msg):
    res = re.match(
        r"^(\S+)\s*('s|suis|est|is|was|were)?\s+(birthday|geburtstag|née? |nee? le|born on).*$",
        msg.message, re.I)
    if res is not None:
        try:
            extDate = extractDate(msg.message)
            if extDate is None or extDate.year > datetime.now().year:
                return Response("la date de naissance ne paraît pas valide...",
                                msg.channel, msg.frm)
            else:
                nick = res.group(1)
                if nick == "my" or nick == "I" or nick == "i" or nick == "je" or nick == "mon" or nick == "ma":
                    nick = msg.frm
                if nick.lower() in context.data.index:
                    context.data.index[nick.lower()]["born"] = extDate
                else:
                    ms = ModuleState("birthday")
                    ms.setAttribute("name", nick.lower())
                    ms.setAttribute("born", extDate)
                    context.data.addChild(ms)
                context.save()
                return Response(
                    "ok, c'est noté, %s est né le %s" %
                    (nick, extDate.strftime("%A %d %B %Y à %H:%M")),
                    msg.channel, msg.frm)
        except:
            raise IMException("la date de naissance ne paraît pas valide.")
Example #2
0
def parseask(msg):
    if msg.message.find("Free") >= 0 and (
            msg.message.find("API") >= 0 or msg.message.find("api") >= 0) and (
                msg.message.find("SMS") >= 0 or msg.message.find("sms") >= 0):
        resuser = apiuser_ask.search(msg.message)
        reskey = apikey_ask.search(msg.message)
        if resuser is not None and reskey is not None:
            apiuser = resuser.group("user")
            apikey = reskey.group("key")

            test = send_sms(
                "nemubot", apiuser, apikey,
                "Vous avez enregistré vos codes d'authentification dans nemubot, félicitation !"
            )
            if test is not None:
                return Response(
                    "je n'ai pas pu enregistrer tes identifiants : %s" % test,
                    msg.channel, msg.frm)

            if msg.frm in context.data.index:
                context.data.index[msg.frm]["user"] = apiuser
                context.data.index[msg.frm]["key"] = apikey
            else:
                ms = ModuleState("phone")
                ms.setAttribute("name", msg.frm)
                ms.setAttribute("user", apiuser)
                ms.setAttribute("key", apikey)
                ms.setAttribute("lastuse", 0)
                context.data.addChild(ms)
            context.save()
            return Response(
                "ok, c'est noté. Je t'ai envoyé un SMS pour tester ;)",
                msg.channel, msg.frm)
Example #3
0
def cmd_watch(msg):

    # Get current state
    node = None
    for n in context.data.getChilds():
        if n["server"] == msg.server and n["channel"] == msg.channel:
            node = n
            break

    if len(msg.args):
        if msg.args[0] == "stop" and node is not None:
            context.data.delChild(node)
            context.save()
            raise IMException(
                "This channel will not anymore receives world cup events.")
        elif msg.args[0] == "start" and node is None:
            start_watch(msg)
        else:
            raise IMException("Use only start or stop as first argument")
    else:
        if node is None:
            start_watch(msg)
        else:
            context.data.delChild(node)
            context.save()
            raise IMException(
                "This channel will not anymore receives world cup events.")
Example #4
0
def cmd_watch(msg):

    # Get current state
    node = None
    for n in context.data.getChilds():
        if n["server"] == msg.server and n["channel"] == msg.channel:
            node = n
            break

    if len(msg.args):
        if msg.args[0] == "stop" and node is not None:
            context.data.delChild(node)
            context.save()
            raise IMException("This channel will not anymore receives world cup events.")
        elif msg.args[0] == "start" and node is None:
            start_watch(msg)
        else:
            raise IMException("Use only start or stop as first argument")
    else:
        if node is None:
            start_watch(msg)
        else:
            context.data.delChild(node)
            context.save()
            raise IMException("This channel will not anymore receives world cup events.")
Example #5
0
def parseask(msg):
    res = re.match(r"^(\S+)\s*('s|suis|est|is|was|were)?\s+(birthday|geburtstag|née? |nee? le|born on).*$", msg.message, re.I)
    if res is not None:
        try:
            extDate = extractDate(msg.message)
            if extDate is None or extDate.year > datetime.now().year:
                return Response("la date de naissance ne paraît pas valide...",
                                msg.channel,
                                msg.frm)
            else:
                nick = res.group(1)
                if nick == "my" or nick == "I" or nick == "i" or nick == "je" or nick == "mon" or nick == "ma":
                    nick = msg.frm
                if nick.lower() in context.data.index:
                    context.data.index[nick.lower()]["born"] = extDate
                else:
                    ms = ModuleState("birthday")
                    ms.setAttribute("name", nick.lower())
                    ms.setAttribute("born", extDate)
                    context.data.addChild(ms)
                context.save()
                return Response("ok, c'est noté, %s est né le %s"
                                % (nick, extDate.strftime("%A %d %B %Y à %H:%M")),
                                msg.channel,
                                msg.frm)
        except:
            raise IMException("la date de naissance ne paraît pas valide.")
Example #6
0
File: sms.py Project: nbr23/nemubot
def parseask(msg):
    if msg.message.find("Free") >= 0 and (
            msg.message.find("API") >= 0 or msg.message.find("api") >= 0) and (
                msg.message.find("SMS") >= 0 or msg.message.find("sms") >= 0):
        resuser = apiuser_ask.search(msg.message)
        reskey = apikey_ask.search(msg.message)
        if resuser is not None and reskey is not None:
            apiuser = resuser.group("user")
            apikey = reskey.group("key")

            test = send_sms("nemubot", apiuser, apikey,
                            "Vous avez enregistré vos codes d'authentification dans nemubot, félicitation !")
            if test is not None:
                return Response("je n'ai pas pu enregistrer tes identifiants : %s" % test, msg.channel, msg.frm)

            if msg.frm in context.data.index:
                context.data.index[msg.frm]["user"] = apiuser
                context.data.index[msg.frm]["key"] = apikey
            else:
                ms = ModuleState("phone")
                ms.setAttribute("name", msg.frm)
                ms.setAttribute("user", apiuser)
                ms.setAttribute("key", apikey)
                ms.setAttribute("lastuse", 0)
                context.data.addChild(ms)
            context.save()
            return Response("ok, c'est noté. Je t'ai envoyé un SMS pour tester ;)",
                            msg.channel, msg.frm)
Example #7
0
def fini(name, evt):
    context.send_response(
        evt._server,
        Response("%s arrivé à échéance." % name,
                 channel=evt._channel,
                 nick=evt.creator))
    evt._evt = None
    del context.data[name]
    context.save()
Example #8
0
def start_watch(msg):
    w = ModuleState("watch")
    w["server"] = msg.server
    w["channel"] = msg.channel
    w["proprio"] = msg.frm
    w["start"] = datetime.now(timezone.utc)
    context.data.addChild(w)
    context.save()
    raise IMException("This channel is now watching world cup events!")
Example #9
0
def start_watch(msg):
    w = ModuleState("watch")
    w["server"] = msg.server
    w["channel"] = msg.channel
    w["proprio"] = msg.frm
    w["start"] = datetime.now(timezone.utc)
    context.data.addChild(w)
    context.save()
    raise IMException("This channel is now watching world cup events!")
Example #10
0
def add_score(nick, t):
    if nick not in context.data.index:
        st = ModuleState("score")
        st["name"] = nick
        context.data.addChild(st)

    if context.data.index[nick].hasAttribute(t):
        context.data.index[nick][t] = context.data.index[nick].getInt(t) + 1
    else:
        context.data.index[nick][t] = 1
    context.save()
Example #11
0
def add_score(nick, t):
    if nick not in context.data.index:
        st = ModuleState("score")
        st["name"] = nick
        context.data.addChild(st)

    if context.data.index[nick].hasAttribute(t):
        context.data.index[nick][t] = context.data.index[nick].getInt(t) + 1
    else:
        context.data.index[nick][t] = 1
    context.save()
Example #12
0
def parseask(msg):
    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 !")

        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.")

        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)

    else:
        raise IMException("Veuillez indiquez les messages d'attente et d'après événement entre guillemets.")
Example #13
0
def create_alias(alias, origin, channel=None, creator=None):
    """Create or erase an existing alias
    """

    anode = ModuleState("alias")
    anode["alias"] = alias
    anode["origin"] = origin
    if channel is not None:
        anode["creator"] = channel
    if creator is not None:
        anode["creator"] = creator
    context.data.getNode("aliases").addChild(anode)
    context.save()
Example #14
0
def create_alias(alias, origin, channel=None, creator=None):
    """Create or erase an existing alias
    """

    anode = ModuleState("alias")
    anode["alias"] = alias
    anode["origin"] = origin
    if channel is not None:
        anode["creator"] = channel
    if creator is not None:
        anode["creator"] = creator
    context.data.getNode("aliases").addChild(anode)
    context.save()
Example #15
0
def set_variable(name, value, creator):
    """Define or erase a variable.

    Arguments:
    name -- The variable identifier
    value -- Variable value
    creator -- User who has created this variable
    """

    var = ModuleState("variable")
    var["name"] = name
    var["value"] = value
    var["creator"] = creator
    context.data.getNode("variables").addChild(var)
    context.save()
Example #16
0
def end_countdown(msg):
    if len(msg.args) < 1:
        raise IMException("quel événement terminer ?")

    if msg.args[0] in context.data:
        if context.data[msg.args[0]].creator == msg.frm or (msg.cmd == "forceend" and msg.frm_owner):
            duration = countdown(msg.date - context.data[msg.args[0]].start)
            del context.data[msg.args[0]]
            context.save()
            return Response("%s a duré %s." % (msg.args[0], duration),
                            channel=msg.channel, nick=msg.frm)
        else:
            raise IMException("Vous ne pouvez pas terminer le compteur %s, créé par %s." % (msg.args[0], context.data[msg.args[0]].creator))
    else:
        return Response("%s n'est pas un compteur connu."% (msg.args[0]), channel=msg.channel, nick=msg.frm)
Example #17
0
def set_variable(name, value, creator):
    """Define or erase a variable.

    Arguments:
    name -- The variable identifier
    value -- Variable value
    creator -- User who has created this variable
    """

    var = ModuleState("variable")
    var["name"] = name
    var["value"] = value
    var["creator"] = creator
    context.data.getNode("variables").addChild(var)
    context.save()
Example #18
0
def end_countdown(msg):
    if len(msg.args) < 1:
        raise IMException("quel événement terminer ?")

    if msg.args[0] in context.data.index:
        if context.data.index[msg.args[0]]["proprio"] == msg.nick or (msg.cmd == "forceend" and msg.frm_owner):
            duration = countdown(msg.date - context.data.index[msg.args[0]].getDate("start"))
            context.del_event(context.data.index[msg.args[0]]["_id"])
            context.data.delChild(context.data.index[msg.args[0]])
            context.save()
            return Response("%s a duré %s." % (msg.args[0], duration),
                            channel=msg.channel, nick=msg.nick)
        else:
            raise IMException("Vous ne pouvez pas terminer le compteur %s, créé par %s." % (msg.args[0], context.data.index[msg.args[0]]["proprio"]))
    else:
        return Response("%s n'est pas un compteur connu."% (msg.args[0]), channel=msg.channel, nick=msg.nick)
Example #19
0
def parseask(msg):
    res = re.match(r"^(\S+)\s*('s|suis|est|is|was|were)\s+([a-zA-Z0-9_-]{3,8})$", msg.text, re.I)
    if res is not None:
        nick = res.group(1)
        login = res.group(3)
        if nick == "my" or nick == "I" or nick == "i" or nick == "je" or nick == "mon" or nick == "ma":
            nick = msg.nick
        if nick in context.data.getNode("aliases").index:
            context.data.getNode("aliases").index[nick]["to"] = login
        else:
            ms = ModuleState("alias")
            ms.setAttribute("from", nick)
            ms.setAttribute("to", login)
            context.data.getNode("aliases").addChild(ms)
        context.save()
        return Response("ok, c'est noté, %s est %s" % (nick, login), channel=msg.channel, nick=msg.nick)
Example #20
0
def parseask(msg):
    res = gps_ask.match(msg.message)
    if res is not None:
        city_name = res.group("city").lower()
        gps_lat = res.group("lat").replace(",", ".")
        gps_long = res.group("long").replace(",", ".")

        if city_name in context.data.index:
            context.data.index[city_name]["lat"] = gps_lat
            context.data.index[city_name]["long"] = gps_long
        else:
            ms = ModuleState("city")
            ms.setAttribute("name", city_name)
            ms.setAttribute("lat", gps_lat)
            ms.setAttribute("long", gps_long)
            context.data.addChild(ms)
        context.save()
        return Response("ok, j'ai bien noté les coordonnées de %s" % res.group("city"),
                        msg.channel, msg.frm)
Example #21
0
def parseask(msg):
    res = gps_ask.match(msg.message)
    if res is not None:
        city_name = res.group("city").lower()
        gps_lat = res.group("lat").replace(",", ".")
        gps_long = res.group("long").replace(",", ".")

        if city_name in context.data.index:
            context.data.index[city_name]["lat"] = gps_lat
            context.data.index[city_name]["long"] = gps_long
        else:
            ms = ModuleState("city")
            ms.setAttribute("name", city_name)
            ms.setAttribute("lat", gps_lat)
            ms.setAttribute("long", gps_long)
            context.data.addChild(ms)
        context.save()
        return Response(
            "ok, j'ai bien noté les coordonnées de %s" % res.group("city"),
            msg.channel, msg.frm)
Example #22
0
def parseask(msg):
    res = re.match(
        r"^(\S+)\s*('s|suis|est|is|was|were)\s+([a-zA-Z0-9_-]{3,8})$",
        msg.message, re.I)
    if res is not None:
        nick = res.group(1)
        login = res.group(3)
        if nick == "my" or nick == "I" or nick == "i" or nick == "je" or nick == "mon" or nick == "ma":
            nick = msg.frm
        if nick in context.data.getNode("aliases").index:
            context.data.getNode("aliases").index[nick]["to"] = login
        else:
            ms = ModuleState("alias")
            ms.setAttribute("from", nick)
            ms.setAttribute("to", login)
            context.data.getNode("aliases").addChild(ms)
        context.save()
        return Response("ok, c'est noté, %s est %s" % (nick, login),
                        channel=msg.channel,
                        nick=msg.frm)
Example #23
0
def end_countdown(msg):
    if len(msg.args) < 1:
        raise IMException("quel événement terminer ?")

    if msg.args[0] in context.data:
        if context.data[msg.args[0]].creator == msg.frm or (
                msg.cmd == "forceend" and msg.frm_owner):
            duration = countdown(msg.date - context.data[msg.args[0]].start)
            del context.data[msg.args[0]]
            context.save()
            return Response("%s a duré %s." % (msg.args[0], duration),
                            channel=msg.channel,
                            nick=msg.frm)
        else:
            raise IMException(
                "Vous ne pouvez pas terminer le compteur %s, créé par %s." %
                (msg.args[0], context.data[msg.args[0]].creator))
    else:
        return Response("%s n'est pas un compteur connu." % (msg.args[0]),
                        channel=msg.channel,
                        nick=msg.frm)
Example #24
0
def start_countdown(msg):
    """!start /something/: launch a timer"""
    if len(msg.args) < 1:
        raise IMException("indique le nom d'un événement à chronométrer")
    if msg.args[0] in context.data:
        raise IMException("%s existe déjà." % msg.args[0])

    evt = Event(server=msg.server, channel=msg.channel, creator=msg.frm, start_time=msg.date)

    if len(msg.args) > 1:
        result1 = re.findall("([0-9]+)([smhdjwyaSMHDJWYA])?", msg.args[1])
        result2 = re.match("(.*[^0-9])?([0-3]?[0-9])/([0-1]?[0-9])/((19|20)?[01239][0-9])", msg.args[1])
        result3 = re.match("(.*[^0-9])?([0-2]?[0-9]):([0-5]?[0-9])(:([0-5]?[0-9]))?", msg.args[1])
        if result2 is not None or result3 is not None:
            try:
                now = msg.date
                if result3 is None or result3.group(5) is None: sec = 0
                else: sec = int(result3.group(5))
                if result3 is None or result3.group(3) is None: minu = 0
                else: minu = int(result3.group(3))
                if result3 is None or result3.group(2) is None: hou = 0
                else: hou = int(result3.group(2))
                if result2 is None or result2.group(4) is None: yea = now.year
                else: yea = int(result2.group(4))
                if result2 is not None and result3 is not None:
                    evt.end = datetime(yea, int(result2.group(3)), int(result2.group(2)), hou, minu, sec, timezone.utc)
                elif result2 is not None:
                    evt.end = datetime(int(result2.group(4)), int(result2.group(3)), int(result2.group(2)), 0, 0, 0, timezone.utc)
                elif result3 is not None:
                  if hou * 3600 + minu * 60 + sec > now.hour * 3600 + now.minute * 60 + now.second:
                    evt.end = datetime(now.year, now.month, now.day, hou, minu, sec, timezone.utc)
                  else:
                    evt.end = datetime(now.year, now.month, now.day + 1, hou, minu, sec, timezone.utc)
            except:
                raise IMException("Mauvais format de date pour l'événement %s. Il n'a pas été créé." % msg.args[0])

        elif result1 is not None and len(result1) > 0:
            evt.end = msg.date
            for (t, g) in result1:
                if g is None or g == "" or g == "m" or g == "M":
                    evt.end += timedelta(minutes=int(t))
                elif g == "h" or g == "H":
                    evt.end += timedelta(hours=int(t))
                elif g == "d" or g == "D" or g == "j" or g == "J":
                    evt.end += timedelta(days=int(t))
                elif g == "w" or g == "W":
                    evt.end += timedelta(days=int(t)*7)
                elif g == "y" or g == "Y" or g == "a" or g == "A":
                    evt.end += timedelta(days=int(t)*365)
                else:
                    evt.end += timedelta(seconds=int(t))

        else:
            raise IMException("Mauvais format de date pour l'événement %s. Il n'a pas été créé." % msg.args[0])

    context.data[msg.args[0]] = evt
    context.save()

    if evt.end is not None:
        context.add_event(ModuleEvent(partial(fini, msg.args[0], evt),
                                      offset=evt.end - datetime.now(timezone.utc),
                                      interval=0))
        return Response("%s commencé le %s et se terminera le %s." %
                        (msg.args[0], msg.date.strftime("%A %d %B %Y à %H:%M:%S"),
                         evt.end.strftime("%A %d %B %Y à %H:%M:%S")),
                        channel=msg.channel)
    else:
        return Response("%s commencé le %s"% (msg.args[0],
                            msg.date.strftime("%A %d %B %Y à %H:%M:%S")),
                        channel=msg.channel)
Example #25
0
def start_countdown(msg):
    """!start /something/: launch a timer"""
    if len(msg.args) < 1:
        raise IMException("indique le nom d'un événement à chronométrer")
    if msg.args[0] in context.data:
        raise IMException("%s existe déjà." % msg.args[0])

    evt = Event(server=msg.server,
                channel=msg.channel,
                creator=msg.frm,
                start_time=msg.date)

    if len(msg.args) > 1:
        result1 = re.findall("([0-9]+)([smhdjwyaSMHDJWYA])?", msg.args[1])
        result2 = re.match(
            "(.*[^0-9])?([0-3]?[0-9])/([0-1]?[0-9])/((19|20)?[01239][0-9])",
            msg.args[1])
        result3 = re.match(
            "(.*[^0-9])?([0-2]?[0-9]):([0-5]?[0-9])(:([0-5]?[0-9]))?",
            msg.args[1])
        if result2 is not None or result3 is not None:
            try:
                now = msg.date
                if result3 is None or result3.group(5) is None: sec = 0
                else: sec = int(result3.group(5))
                if result3 is None or result3.group(3) is None: minu = 0
                else: minu = int(result3.group(3))
                if result3 is None or result3.group(2) is None: hou = 0
                else: hou = int(result3.group(2))
                if result2 is None or result2.group(4) is None: yea = now.year
                else: yea = int(result2.group(4))
                if result2 is not None and result3 is not None:
                    evt.end = datetime(yea, int(result2.group(3)),
                                       int(result2.group(2)), hou, minu, sec,
                                       timezone.utc)
                elif result2 is not None:
                    evt.end = datetime(int(result2.group(4)),
                                       int(result2.group(3)),
                                       int(result2.group(2)), 0, 0, 0,
                                       timezone.utc)
                elif result3 is not None:
                    if hou * 3600 + minu * 60 + sec > now.hour * 3600 + now.minute * 60 + now.second:
                        evt.end = datetime(now.year, now.month, now.day, hou,
                                           minu, sec, timezone.utc)
                    else:
                        evt.end = datetime(now.year, now.month, now.day + 1,
                                           hou, minu, sec, timezone.utc)
            except:
                raise IMException(
                    "Mauvais format de date pour l'événement %s. Il n'a pas été créé."
                    % msg.args[0])

        elif result1 is not None and len(result1) > 0:
            evt.end = msg.date
            for (t, g) in result1:
                if g is None or g == "" or g == "m" or g == "M":
                    evt.end += timedelta(minutes=int(t))
                elif g == "h" or g == "H":
                    evt.end += timedelta(hours=int(t))
                elif g == "d" or g == "D" or g == "j" or g == "J":
                    evt.end += timedelta(days=int(t))
                elif g == "w" or g == "W":
                    evt.end += timedelta(days=int(t) * 7)
                elif g == "y" or g == "Y" or g == "a" or g == "A":
                    evt.end += timedelta(days=int(t) * 365)
                else:
                    evt.end += timedelta(seconds=int(t))

        else:
            raise IMException(
                "Mauvais format de date pour l'événement %s. Il n'a pas été créé."
                % msg.args[0])

    context.data[msg.args[0]] = evt
    context.save()

    if evt.end is not None:
        context.add_event(
            ModuleEvent(partial(fini, msg.args[0], evt),
                        offset=evt.end - datetime.now(timezone.utc),
                        interval=0))
        return Response(
            "%s commencé le %s et se terminera le %s." %
            (msg.args[0], msg.date.strftime("%A %d %B %Y à %H:%M:%S"),
             evt.end.strftime("%A %d %B %Y à %H:%M:%S")),
            channel=msg.channel)
    else:
        return Response(
            "%s commencé le %s" %
            (msg.args[0], msg.date.strftime("%A %d %B %Y à %H:%M:%S")),
            channel=msg.channel)
Example #26
0
def parseask(msg):
    name = re.match("^.*!([^ \"'@!]+).*$", msg.message)
    if name is None:
        raise IMException(
            "il faut que tu attribues une commande à l'événement.")
    if name.group(1) in context.data:
        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.message, re.I)
    if texts is not None and texts.group(3) is not None:
        extDate = extractDate(msg.message)
        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 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.frm
        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.frm
        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."
        )
Example #27
0
def start_countdown(msg):
    """!start /something/: launch a timer"""
    if len(msg.args) < 1:
        raise IMException("indique le nom d'un événement à chronométrer")
    if msg.args[0] in context.data.index:
        raise IMException("%s existe déjà." % msg.args[0])

    strnd = ModuleState("strend")
    strnd["server"] = msg.server
    strnd["channel"] = msg.channel
    strnd["proprio"] = msg.nick
    strnd["start"] = msg.date
    strnd["name"] = msg.args[0]
    context.data.addChild(strnd)

    evt = ModuleEvent(call=fini, call_data=dict(strend=strnd))

    if len(msg.args) > 1:
        result1 = re.findall("([0-9]+)([smhdjwyaSMHDJWYA])?", msg.args[1])
        result2 = re.match("(.*[^0-9])?([0-3]?[0-9])/([0-1]?[0-9])/((19|20)?[01239][0-9])", msg.args[1])
        result3 = re.match("(.*[^0-9])?([0-2]?[0-9]):([0-5]?[0-9])(:([0-5]?[0-9]))?", msg.args[1])
        if result2 is not None or result3 is not None:
            try:
                now = msg.date
                if result3 is None or result3.group(5) is None: sec = 0
                else: sec = int(result3.group(5))
                if result3 is None or result3.group(3) is None: minu = 0
                else: minu = int(result3.group(3))
                if result3 is None or result3.group(2) is None: hou = 0
                else: hou = int(result3.group(2))
                if result2 is None or result2.group(4) is None: yea = now.year
                else: yea = int(result2.group(4))
                if result2 is not None and result3 is not None:
                    strnd["end"] = datetime(yea, int(result2.group(3)), int(result2.group(2)), hou, minu, sec, timezone.utc)
                elif result2 is not None:
                    strnd["end"] = datetime(int(result2.group(4)), int(result2.group(3)), int(result2.group(2)), 0, 0, 0, timezone.utc)
                elif result3 is not None:
                  if hou * 3600 + minu * 60 + sec > now.hour * 3600 + now.minute * 60 + now.second:
                    strnd["end"] = datetime(now.year, now.month, now.day, hou, minu, sec, timezone.utc)
                  else:
                    strnd["end"] = datetime(now.year, now.month, now.day + 1, hou, minu, sec, timezone.utc)
                evt._end = strnd.getDate("end")
                strnd["_id"] = context.add_event(evt)
            except:
                context.data.delChild(strnd)
                raise IMException("Mauvais format de date pour l'événement %s. Il n'a pas été créé." % msg.args[0])

        elif result1 is not None and len(result1) > 0:
            strnd["end"] = msg.date
            for (t, g) in result1:
                if g is None or g == "" or g == "m" or g == "M":
                    strnd["end"] += timedelta(minutes=int(t))
                elif g == "h" or g == "H":
                    strnd["end"] += timedelta(hours=int(t))
                elif g == "d" or g == "D" or g == "j" or g == "J":
                    strnd["end"] += timedelta(days=int(t))
                elif g == "w" or g == "W":
                    strnd["end"] += timedelta(days=int(t)*7)
                elif g == "y" or g == "Y" or g == "a" or g == "A":
                    strnd["end"] += timedelta(days=int(t)*365)
                else:
                    strnd["end"] += timedelta(seconds=int(t))
            evt._end = strnd.getDate("end")
            eid = context.add_event(evt)
            if eid is not None:
                strnd["_id"] = eid

    context.save()
    if "end" in strnd:
        return Response("%s commencé le %s et se terminera le %s." %
                        (msg.args[0], msg.date.strftime("%A %d %B %Y à %H:%M:%S"),
                         strnd.getDate("end").strftime("%A %d %B %Y à %H:%M:%S")),
                        nick=msg.frm)
    else:
        return Response("%s commencé le %s"% (msg.args[0],
                            msg.date.strftime("%A %d %B %Y à %H:%M:%S")),
                        nick=msg.frm)
Example #28
0
def fini(d, strend):
    context.send_response(strend["server"], Response("%s arrivé à échéance." % strend["name"], channel=strend["channel"], nick=strend["proprio"]))
    context.data.delChild(context.data.index[strend["name"]])
    context.save()
Example #29
0
def fini(name, evt):
    context.send_response(evt._server, Response("%s arrivé à échéance." % name, channel=evt._channel, nick=evt.creator))
    evt._evt = None
    del context.data[name]
    context.save()