Response sender is not needed anymore, private channels are now better handled

This commit is contained in:
nemunaire 2014-09-18 07:57:06 +02:00
parent 5e202063d4
commit 772d68a34d
32 changed files with 161 additions and 182 deletions

5
bot.py
View File

@ -77,14 +77,13 @@ class Bot(threading.Thread):
self.hooks = HooksManager() self.hooks = HooksManager()
def in_ping(msg): def in_ping(msg):
if re.match("^ *(m[' ]?entends?[ -]+tu|h?ear me|do you copy|ping)", msg.text, re.I) is not None: if re.match("^ *(m[' ]?entends?[ -]+tu|h?ear me|do you copy|ping)", msg.text, re.I) is not None:
return response.Response(msg.sender, message="pong", channel=msg.receivers, nick=msg.nick) return response.Response(message="pong", channel=msg.receivers, nick=msg.nick)
self.hooks.add_hook(MessageHook(in_ping), "in", "PRIVMSG") self.hooks.add_hook(MessageHook(in_ping), "in", "PRIVMSG")
def _help_msg(msg): def _help_msg(msg):
"""Parse and response to help messages""" """Parse and response to help messages"""
cmd = msg.cmds cmd = msg.cmds
sndr = msg.sender res = response.Response()
res = response.Response(sndr)
if len(cmd) > 1: if len(cmd) > 1:
if cmd[1] in self.modules: if cmd[1] in self.modules:
if len(cmd) > 2: if len(cmd) > 2:

View File

@ -26,7 +26,7 @@ import sys
import bot import bot
from server.DCC import DCC from server.DCC import DCC
from message import Message from message import Message
import response from response import Response
import server import server
logger = logging.getLogger("nemubot.consumer") logger = logging.getLogger("nemubot.consumer")
@ -118,8 +118,13 @@ class MessageConsumer:
if h.match(message=msg, server=self.srv): if h.match(message=msg, server=self.srv):
res = h.run(msg) res = h.run(msg)
if isinstance(res, list): if isinstance(res, list):
for r in res:
if isinstance(r, Response):
r.set_sender(msg.sender)
self.responses += res self.responses += res
elif res is not None: elif res is not None:
if isinstance(res, Response):
res.set_sender(msg.sender)
self.responses.append(res) self.responses.append(res)
@ -174,9 +179,7 @@ class MessageConsumer:
self.post_treat(context.hooks) self.post_treat(context.hooks)
except: except:
logger.exception("Error occurred during the processing of the message: %s", self.msgs[0].raw) logger.exception("Error occurred during the processing of the message: %s", self.msgs[0].raw)
return
#return self.responses
for res in self.responses: for res in self.responses:
to_server = None to_server = None
if res.server is None: if res.server is None:
@ -188,7 +191,7 @@ class MessageConsumer:
if to_server is None: if to_server is None:
logger.error("The server defined in this response doesn't " logger.error("The server defined in this response doesn't "
"exist: %s", res.server) "exist: %s", res.server)
return False continue
# Sent the message only if treat_post authorize it # Sent the message only if treat_post authorize it
to_server.send_response(res) to_server.send_response(res)

View File

@ -26,4 +26,4 @@ class IRCException(Exception):
self.personnal = personnal self.personnal = personnal
def fill_response(self, msg): def fill_response(self, msg):
return Response(msg.sender, self.message, channel=msg.receivers, nick=(msg.nick if self.personnal else None)) return Response(self.message, channel=msg.receivers, nick=(msg.nick if self.personnal else None))

View File

@ -51,10 +51,10 @@ def get_variable(name, msg=None):
def cmd_set(msg): def cmd_set(msg):
if len (msg.cmds) > 2: if len (msg.cmds) > 2:
set_variable(msg.cmds[1], " ".join(msg.cmds[2:]), msg.nick) set_variable(msg.cmds[1], " ".join(msg.cmds[2:]), msg.nick)
res = Response(msg.sender, "Variable \$%s définie." % msg.cmds[1]) res = Response("Variable \$%s définie." % msg.cmds[1])
save() save()
return res return res
return Response(msg.sender, "!set prend au minimum deux arguments : le nom de la variable et sa valeur.") return Response("!set prend au minimum deux arguments : le nom de la variable et sa valeur.")
@hook("cmd_hook", "listalias") @hook("cmd_hook", "listalias")
def cmd_listalias(msg): def cmd_listalias(msg):
@ -66,9 +66,9 @@ def cmd_listalias(msg):
res.append("Alias créés par %s : %s" % (user, ", ".join(als))) res.append("Alias créés par %s : %s" % (user, ", ".join(als)))
else: else:
res.append("%s n'a pas encore créé d'alias" % user) res.append("%s n'a pas encore créé d'alias" % user)
return Response(msg.sender, " ; ".join(res), channel=msg.channel) return Response(" ; ".join(res), channel=msg.channel)
else: else:
return Response(msg.sender, "Alias connus : %s." % ", ".join(DATAS.getNode("aliases").index.keys()), channel=msg.channel) return Response("Alias connus : %s." % ", ".join(DATAS.getNode("aliases").index.keys()), channel=msg.channel)
@hook("cmd_hook", "listvars") @hook("cmd_hook", "listvars")
def cmd_listvars(msg): def cmd_listvars(msg):
@ -80,9 +80,9 @@ def cmd_listvars(msg):
res.append("Variables créées par %s : %s" % (user, ", ".join(als))) res.append("Variables créées par %s : %s" % (user, ", ".join(als)))
else: else:
res.append("%s n'a pas encore créé de variable" % user) res.append("%s n'a pas encore créé de variable" % user)
return Response(msg.sender, " ; ".join(res), channel=msg.channel) return Response(" ; ".join(res), channel=msg.channel)
else: else:
return Response(msg.sender, "Variables connues : %s." % ", ".join(DATAS.getNode("variables").index.keys()), channel=msg.channel) return Response("Variables connues : %s." % ", ".join(DATAS.getNode("variables").index.keys()), channel=msg.channel)
@hook("cmd_hook", "alias") @hook("cmd_hook", "alias")
def cmd_alias(msg): def cmd_alias(msg):
@ -92,15 +92,15 @@ def cmd_alias(msg):
if alias[0] == "!": if alias[0] == "!":
alias = alias[1:] alias = alias[1:]
if alias in DATAS.getNode("aliases").index: if alias in DATAS.getNode("aliases").index:
res.append(Response(msg.sender, "!%s correspond à %s" % (alias, res.append(Response("!%s correspond à %s" % (alias,
DATAS.getNode("aliases").index[alias]["origin"]), DATAS.getNode("aliases").index[alias]["origin"]),
channel=msg.channel)) channel=msg.channel))
else: else:
res.append(Response(msg.sender, "!%s n'est pas un alias" % alias, res.append(Response("!%s n'est pas un alias" % alias,
channel=msg.channel)) channel=msg.channel))
return res return res
else: else:
return Response(msg.sender, "!alias prend en argument l'alias à étendre.", return Response("!alias prend en argument l'alias à étendre.",
channel=msg.channel) channel=msg.channel)
@hook("cmd_hook", "unalias") @hook("cmd_hook", "unalias")
@ -113,14 +113,14 @@ def cmd_unalias(msg):
if alias in DATAS.getNode("aliases").index: if alias in DATAS.getNode("aliases").index:
if DATAS.getNode("aliases").index[alias]["creator"] == msg.nick or msg.is_owner: if DATAS.getNode("aliases").index[alias]["creator"] == msg.nick or msg.is_owner:
DATAS.getNode("aliases").delChild(DATAS.getNode("aliases").index[alias]) DATAS.getNode("aliases").delChild(DATAS.getNode("aliases").index[alias])
res.append(Response(msg.sender, "%s a bien été supprimé" % alias, channel=msg.channel)) res.append(Response("%s a bien été supprimé" % alias, channel=msg.channel))
else: else:
res.append(Response(msg.sender, "Vous n'êtes pas le createur de l'alias %s." % alias, channel=msg.channel)) res.append(Response("Vous n'êtes pas le createur de l'alias %s." % alias, channel=msg.channel))
else: else:
res.append(Response(msg.sender, "%s n'est pas un alias" % alias, channel=msg.channel)) res.append(Response("%s n'est pas un alias" % alias, channel=msg.channel))
return res return res
else: else:
return Response(msg.sender, "!unalias prend en argument l'alias à supprimer.", channel=msg.channel) return Response("!unalias prend en argument l'alias à supprimer.", channel=msg.channel)
def replace_variables(cnt, msg=None): def replace_variables(cnt, msg=None):
cnt = cnt.split(' ') cnt = cnt.split(' ')
@ -177,14 +177,14 @@ def parseask(msg):
if re.match(".*(set|cr[ée]{2}|nouvel(le)?) alias.*", msg.text) is not None: if re.match(".*(set|cr[ée]{2}|nouvel(le)?) alias.*", msg.text) is not None:
result = re.match(".*alias !?([^ ]+) (pour|=|:) (.+)$", msg.text) result = re.match(".*alias !?([^ ]+) (pour|=|:) (.+)$", msg.text)
if result.group(1) in DATAS.getNode("aliases").index or result.group(3).find("alias") >= 0: if result.group(1) in DATAS.getNode("aliases").index or result.group(3).find("alias") >= 0:
return Response(msg.sender, "Cet alias est déjà défini.") raise IRCException("cet alias est déjà défini.")
else: else:
alias = ModuleState("alias") alias = ModuleState("alias")
alias["alias"] = result.group(1) alias["alias"] = result.group(1)
alias["origin"] = result.group(3) alias["origin"] = result.group(3)
alias["creator"] = msg.nick alias["creator"] = msg.nick
DATAS.getNode("aliases").addChild(alias) DATAS.getNode("aliases").addChild(alias)
res = Response(msg.sender, "Nouvel alias %s défini avec succès." % result.group(1)) res = Response("Nouvel alias %s défini avec succès." % result.group(1))
save() save()
return res return res
return None return None

View File

@ -50,7 +50,7 @@ def cmd_anniv(msg):
if (tyd.day == datetime.today().day and if (tyd.day == datetime.today().day and
tyd.month == datetime.today().month): tyd.month == datetime.today().month):
return Response(msg.sender, countdown_format( return Response(countdown_format(
DATAS.index[name].getDate("born"), "", DATAS.index[name].getDate("born"), "",
"C'est aujourd'hui l'anniversaire de %s !" "C'est aujourd'hui l'anniversaire de %s !"
" Il a %s. Joyeux anniversaire :)" % (name, "%s")), " Il a %s. Joyeux anniversaire :)" % (name, "%s")),
@ -59,12 +59,12 @@ def cmd_anniv(msg):
if tyd < datetime.today(): if tyd < datetime.today():
tyd = datetime(date.today().year + 1, tyd.month, tyd.day) tyd = datetime(date.today().year + 1, tyd.month, tyd.day)
return Response(msg.sender, countdown_format(tyd, return Response(countdown_format(tyd,
"Il reste %s avant l'anniversaire de %s !" % ("%s", "Il reste %s avant l'anniversaire de %s !" % ("%s",
name), ""), name), ""),
msg.channel) msg.channel)
else: else:
return Response(msg.sender, "désolé, je ne connais pas la date d'anniversaire" return Response("désolé, je ne connais pas la date d'anniversaire"
" de %s. Quand est-il né ?" % name, " de %s. Quand est-il né ?" % name,
msg.channel, msg.nick) msg.channel, msg.nick)
@ -75,12 +75,12 @@ def cmd_age(msg):
name = matches[0] name = matches[0]
d = DATAS.index[name].getDate("born") d = DATAS.index[name].getDate("born")
return Response(msg.sender, countdown_format(d, return Response(countdown_format(d,
"%s va naître dans %s." % (name, "%s"), "%s va naître dans %s." % (name, "%s"),
"%s a %s." % (name, "%s")), "%s a %s." % (name, "%s")),
msg.channel) msg.channel)
else: else:
return Response(msg.sender, "désolé, je ne connais pas l'âge de %s." return Response("désolé, je ne connais pas l'âge de %s."
" Quand est-il né ?" % name, msg.channel, msg.nick) " Quand est-il né ?" % name, msg.channel, msg.nick)
return True return True
@ -91,8 +91,7 @@ def parseask(msg):
try: try:
extDate = extractDate(msg.text) extDate = extractDate(msg.text)
if extDate is None or extDate.year > datetime.now().year: if extDate is None or extDate.year > datetime.now().year:
return Response(msg.sender, return Response("la date de naissance ne paraît pas valide...",
"la date de naissance ne paraît pas valide...",
msg.channel, msg.channel,
msg.nick) msg.nick)
else: else:
@ -107,8 +106,7 @@ def parseask(msg):
ms.setAttribute("born", extDate) ms.setAttribute("born", extDate)
DATAS.addChild(ms) DATAS.addChild(ms)
save() save()
return Response(msg.sender, return Response("ok, c'est noté, %s est né le %s"
"ok, c'est noté, %s est né le %s"
% (nick, extDate.strftime("%A %d %B %Y à %H:%M")), % (nick, extDate.strftime("%A %d %B %Y à %H:%M")),
msg.channel, msg.channel,
msg.nick) msg.nick)

View File

@ -19,18 +19,17 @@ def load(context):
def bonneannee(): def bonneannee():
txt = "Bonne année %d !" % datetime.today().year txt = "Bonne année %d !" % datetime.today().year
print (txt) print (txt)
send_response("localhost:2771", Response(None, txt, "#epitagueule")) send_response("localhost:2771", Response(txt, "#epitagueule"))
send_response("localhost:2771", Response(None, txt, "#yaka")) send_response("localhost:2771", Response(txt, "#yaka"))
send_response("localhost:2771", Response(None, txt, "#epita2014")) send_response("localhost:2771", Response(txt, "#epita2014"))
send_response("localhost:2771", Response(None, txt, "#ykar")) send_response("localhost:2771", Response(txt, "#ykar"))
send_response("localhost:2771", Response(None, txt, "#42sh")) send_response("localhost:2771", Response(txt, "#42sh"))
send_response("localhost:2771", Response(None, txt, "#nemubot")) send_response("localhost:2771", Response(txt, "#nemubot"))
@hook("cmd_hook", "newyear") @hook("cmd_hook", "newyear")
@hook("cmd_hook", str(yrn), yrn) @hook("cmd_hook", str(yrn), yrn)
def cmd_newyear(msg, yr): def cmd_newyear(msg, yr):
return Response(msg.sender, return Response(countdown_format(datetime(yr, 1, 1, 0, 0, 1),
countdown_format(datetime(yr, 1, 1, 0, 0, 1),
"Il reste %s avant la nouvelle année.", "Il reste %s avant la nouvelle année.",
"Nous faisons déjà la fête depuis %s !"), "Nous faisons déjà la fête depuis %s !"),
channel=msg.channel) channel=msg.channel)
@ -42,8 +41,7 @@ def cmd_timetoyear(msg, cur):
if yr == cur: if yr == cur:
return None return None
return Response(msg.sender, return Response(countdown_format(datetime(yr, 1, 1, 0, 0, 1),
countdown_format(datetime(yr, 1, 1, 0, 0, 1),
"Il reste %s avant %d." % ("%s", yr), "Il reste %s avant %d." % ("%s", yr),
"Le premier janvier %d est passé depuis %s !" % (yr, "%s")), "Le premier janvier %d est passé depuis %s !" % (yr, "%s")),
channel=msg.channel) channel=msg.channel)

View File

@ -48,7 +48,7 @@ def cmd_book(msg):
book = get_book(" ".join(msg.cmds[1:])) book = get_book(" ".join(msg.cmds[1:]))
if book is None: if book is None:
raise IRCException("unable to find book named like this") raise IRCException("unable to find book named like this")
res = Response(msg.sender, channel=msg.channel) res = Response(channel=msg.channel)
res.append_message("%s, writed by %s: %s" % (book.getNode("title").getContent(), res.append_message("%s, writed by %s: %s" % (book.getNode("title").getContent(),
book.getNode("authors").getNode("author").getNode("name").getContent(), book.getNode("authors").getNode("author").getNode("name").getContent(),
web.striphtml(book.getNode("description").getContent()) web.striphtml(book.getNode("description").getContent())
@ -61,7 +61,7 @@ def cmd_books(msg):
raise IRCException("please give me a title to search") raise IRCException("please give me a title to search")
title = " ".join(msg.cmds[1:]) title = " ".join(msg.cmds[1:])
res = Response(msg.sender, channel=msg.channel, res = Response(channel=msg.channel,
title="%s" % (title), count=" (%d more books)") title="%s" % (title), count=" (%d more books)")
books = search_books(title) books = search_books(title)
@ -75,4 +75,4 @@ def cmd_author(msg):
raise IRCException("please give me an author to search") raise IRCException("please give me an author to search")
ath = search_author(" ".join(msg.cmds[1:])) ath = search_author(" ".join(msg.cmds[1:]))
return Response(msg.sender, [b.getNode("title").getContent() for b in ath.getNode("books").getNodes("book")], channel=msg.channel, title=ath.getNode("name").getContent()) return Response([b.getNode("title").getContent() for b in ath.getNode("books").getNodes("book")], channel=msg.channel, title=ath.getNode("name").getContent())

View File

@ -47,7 +47,7 @@ def cmd_conjug(msg):
conjug = get_conjug(verb, tens) conjug = get_conjug(verb, tens)
if len(conjug) > 0: if len(conjug) > 0:
return Response(msg.sender, conjug, channel=msg.channel, return Response(conjug, channel=msg.channel,
title="Conjugaison de %s" % verb) title="Conjugaison de %s" % verb)
else: else:
raise IRCException("aucune conjugaison de '%s' n'a été trouvé" % verb) raise IRCException("aucune conjugaison de '%s' n'a été trouvé" % verb)

View File

@ -26,13 +26,12 @@ def reload():
@hook("cmd_hook", "define") @hook("cmd_hook", "define")
def define(msg): def define(msg):
if len(msg.cmds) <= 1: if len(msg.cmds) <= 1:
return Response(msg.sender, return Response("Indicate a term to define",
"Indicate a term to define",
msg.channel, nick=msg.nick) msg.channel, nick=msg.nick)
s = DDGSearch.DDGSearch(' '.join(msg.cmds[1:])) s = DDGSearch.DDGSearch(' '.join(msg.cmds[1:]))
res = Response(msg.sender, channel=msg.channel) res = Response(channel=msg.channel)
res.append_message(s.definition) res.append_message(s.definition)
@ -41,13 +40,12 @@ def define(msg):
@hook("cmd_hook", "search") @hook("cmd_hook", "search")
def search(msg): def search(msg):
if len(msg.cmds) <= 1: if len(msg.cmds) <= 1:
return Response(msg.sender, return Response("Indicate a term to search",
"Indicate a term to search",
msg.channel, nick=msg.nick) msg.channel, nick=msg.nick)
s = DDGSearch.DDGSearch(' '.join(msg.cmds[1:])) s = DDGSearch.DDGSearch(' '.join(msg.cmds[1:]))
res = Response(msg.sender, channel=msg.channel, nomore="No more results", res = Response(channel=msg.channel, nomore="No more results",
count=" (%d more results)") count=" (%d more results)")
res.append_message(s.redirect) res.append_message(s.redirect)
@ -64,13 +62,12 @@ def search(msg):
@hook("cmd_hook", "urbandictionnary") @hook("cmd_hook", "urbandictionnary")
def udsearch(msg): def udsearch(msg):
if len(msg.cmds) <= 1: if len(msg.cmds) <= 1:
return Response(msg.sender, return Response("Indicate a term to search",
"Indicate a term to search",
msg.channel, nick=msg.nick) msg.channel, nick=msg.nick)
s = UrbanDictionnary.UrbanDictionnary(' '.join(msg.cmds[1:])) s = UrbanDictionnary.UrbanDictionnary(' '.join(msg.cmds[1:]))
res = Response(msg.sender, channel=msg.channel, nomore="No more results", res = Response(channel=msg.channel, nomore="No more results",
count=" (%d more definitions)") count=" (%d more definitions)")
for d in s.definitions: for d in s.definitions:
@ -82,18 +79,17 @@ def udsearch(msg):
@hook("cmd_hook", "calculate") @hook("cmd_hook", "calculate")
def calculate(msg): def calculate(msg):
if len(msg.cmds) <= 1: if len(msg.cmds) <= 1:
return Response(msg.sender, return Response("Indicate a calcul to compute",
"Indicate a calcul to compute",
msg.channel, nick=msg.nick) msg.channel, nick=msg.nick)
s = WFASearch.WFASearch(' '.join(msg.cmds[1:])) s = WFASearch.WFASearch(' '.join(msg.cmds[1:]))
if s.success: if s.success:
res = Response(msg.sender, channel=msg.channel, nomore="No more results") res = Response(channel=msg.channel, nomore="No more results")
for result in s.nextRes: for result in s.nextRes:
res.append_message(result) res.append_message(result)
if (len(res.messages) > 0): if (len(res.messages) > 0):
res.messages.pop(0) res.messages.pop(0)
return res return res
else: else:
return Response(msg.sender, s.error, msg.channel) return Response(s.error, msg.channel)

View File

@ -36,7 +36,7 @@ def load(context):
def fini(d, strend): def fini(d, strend):
send_response(strend["server"], Response(strend["sender"], "%s arrivé à échéance." % strend["name"], channel=strend["channel"], nick=strend["proprio"])) send_response(strend["server"], Response("%s arrivé à échéance." % strend["name"], channel=strend["channel"], nick=strend["proprio"]))
DATAS.delChild(DATAS.index[strend["name"]]) DATAS.delChild(DATAS.index[strend["name"]])
save() save()
@ -44,8 +44,7 @@ def fini(d, strend):
def cmd_gouter(msg): def cmd_gouter(msg):
ndate = datetime.today() ndate = datetime.today()
ndate = datetime(ndate.year, ndate.month, ndate.day, 16, 42) ndate = datetime(ndate.year, ndate.month, ndate.day, 16, 42)
return Response(msg.sender, return Response(countdown_format(ndate,
countdown_format(ndate,
"Le goûter aura lieu dans %s, préparez vos biscuits !", "Le goûter aura lieu dans %s, préparez vos biscuits !",
"Nous avons %s de retard pour le goûter :("), "Nous avons %s de retard pour le goûter :("),
channel=msg.channel) channel=msg.channel)
@ -54,8 +53,7 @@ def cmd_gouter(msg):
def cmd_we(msg): def cmd_we(msg):
ndate = datetime.today() + timedelta(5 - datetime.today().weekday()) ndate = datetime.today() + timedelta(5 - datetime.today().weekday())
ndate = datetime(ndate.year, ndate.month, ndate.day, 0, 0, 1) ndate = datetime(ndate.year, ndate.month, ndate.day, 0, 0, 1)
return Response(msg.sender, return Response(countdown_format(ndate,
countdown_format(ndate,
"Il reste %s avant le week-end, courage ;)", "Il reste %s avant le week-end, courage ;)",
"Youhou, on est en week-end depuis %s."), "Youhou, on est en week-end depuis %s."),
channel=msg.channel) channel=msg.channel)
@ -129,11 +127,11 @@ def start_countdown(msg):
save() save()
if "end" in strnd: if "end" in strnd:
return Response(msg.sender, "%s commencé le %s et se terminera le %s." % return Response("%s commencé le %s et se terminera le %s." %
(msg.cmds[1], msg.tags["time"].strftime("%A %d %B %Y à %H:%M:%S"), (msg.cmds[1], msg.tags["time"].strftime("%A %d %B %Y à %H:%M:%S"),
strnd.getDate("end").strftime("%A %d %B %Y à %H:%M:%S"))) strnd.getDate("end").strftime("%A %d %B %Y à %H:%M:%S")))
else: else:
return Response(msg.sender, "%s commencé le %s"% (msg.cmds[1], return Response("%s commencé le %s"% (msg.cmds[1],
msg.tags["time"].strftime("%A %d %B %Y à %H:%M:%S"))) msg.tags["time"].strftime("%A %d %B %Y à %H:%M:%S")))
@hook("cmd_hook", "end") @hook("cmd_hook", "end")
@ -148,12 +146,12 @@ def end_countdown(msg):
del_event(DATAS.index[msg.cmds[1]]["id"]) del_event(DATAS.index[msg.cmds[1]]["id"])
DATAS.delChild(DATAS.index[msg.cmds[1]]) DATAS.delChild(DATAS.index[msg.cmds[1]])
save() save()
return Response(msg.sender, "%s a duré %s." % (msg.cmds[1], duration), return Response("%s a duré %s." % (msg.cmds[1], duration),
channel=msg.channel, nick=msg.nick) channel=msg.channel, nick=msg.nick)
else: else:
raise IRCException("Vous ne pouvez pas terminer le compteur %s, créé par %s." % (msg.cmds[1], DATAS.index[msg.cmds[1]]["proprio"])) raise IRCException("Vous ne pouvez pas terminer le compteur %s, créé par %s." % (msg.cmds[1], DATAS.index[msg.cmds[1]]["proprio"]))
else: else:
return Response(msg.sender, "%s n'est pas un compteur connu."% (msg.cmds[1]), channel=msg.channel, nick=msg.nick) return Response("%s n'est pas un compteur connu."% (msg.cmds[1]), channel=msg.channel, nick=msg.nick)
@hook("cmd_hook", "eventslist") @hook("cmd_hook", "eventslist")
def liste(msg): def liste(msg):
@ -166,14 +164,14 @@ def liste(msg):
res.append("Compteurs créés par %s : %s" % (user, ", ".join(cmptr))) res.append("Compteurs créés par %s : %s" % (user, ", ".join(cmptr)))
else: else:
res.append("%s n'a pas créé de compteur" % user) res.append("%s n'a pas créé de compteur" % user)
return Response(msg.sender, " ; ".join(res), channel=msg.channel) return Response(" ; ".join(res), channel=msg.channel)
else: else:
return Response(msg.sender, "Compteurs connus : %s." % ", ".join(DATAS.index.keys()), channel=msg.channel) return Response("Compteurs connus : %s." % ", ".join(DATAS.index.keys()), channel=msg.channel)
@hook("cmd_default") @hook("cmd_default")
def parseanswer(msg): def parseanswer(msg):
if msg.cmds[0] in DATAS.index: if msg.cmds[0] in DATAS.index:
res = Response(msg.sender, channel=msg.channel) res = Response(channel=msg.channel)
# Avoid message starting by ! which can be interpreted as command by other bots # Avoid message starting by ! which can be interpreted as command by other bots
if msg.cmds[0][0] == "!": if msg.cmds[0][0] == "!":
@ -228,8 +226,7 @@ def parseask(msg):
evt["msg_before"] = msg_before evt["msg_before"] = msg_before
DATAS.addChild(evt) DATAS.addChild(evt)
save() save()
return Response(msg.sender, return Response("Nouvel événement !%s ajouté avec succès." % name.group(1),
"Nouvel événement !%s ajouté avec succès." % name.group(1),
channel=msg.channel) channel=msg.channel)
elif texts is not None and texts.group (2) is not None: elif texts is not None and texts.group (2) is not None:
@ -242,7 +239,7 @@ def parseask(msg):
evt["msg_before"] = texts.group (2) evt["msg_before"] = texts.group (2)
DATAS.addChild(evt) DATAS.addChild(evt)
save() save()
return Response(msg.sender, "Nouvelle commande !%s ajoutée avec succès." % name.group(1)) return Response("Nouvelle commande !%s ajoutée avec succès." % name.group(1))
else: else:
raise IRCException("Veuillez indiquez les messages d'attente et d'après événement entre guillemets.") raise IRCException("Veuillez indiquez les messages d'attente et d'après événement entre guillemets.")

View File

@ -72,7 +72,7 @@ def cmd_github(msg):
repos = info_repos(" ".join(msg.cmds[1:])) repos = info_repos(" ".join(msg.cmds[1:]))
res = Response(msg.sender, channel=msg.channel, nomore="No more repository", count=" (%d more repo)") res = Response(channel=msg.channel, nomore="No more repository", count=" (%d more repo)")
for repo in repos["items"]: for repo in repos["items"]:
homepage = "" homepage = ""
@ -87,7 +87,7 @@ def cmd_github(msg):
if len(msg.cmds) < 2: if len(msg.cmds) < 2:
raise IRCException("indicate a user name to search") raise IRCException("indicate a user name to search")
res = Response(msg.sender, channel=msg.channel, nomore="No more user") res = Response(channel=msg.channel, nomore="No more user")
user = info_user(" ".join(msg.cmds[1:])) user = info_user(" ".join(msg.cmds[1:]))
@ -126,7 +126,7 @@ def cmd_github(msg):
repo = " ".join(msg.cmds[1:]) repo = " ".join(msg.cmds[1:])
count = " (%d more issues)" if issue is None else None count = " (%d more issues)" if issue is None else None
res = Response(msg.sender, channel=msg.channel, nomore="No more issue", count=count) res = Response(channel=msg.channel, nomore="No more issue", count=count)
issues = info_issue(repo, issue) issues = info_issue(repo, issue)
@ -159,7 +159,7 @@ def cmd_github(msg):
repo = " ".join(msg.cmds[1:]) repo = " ".join(msg.cmds[1:])
count = " (%d more commits)" if commit is None else None count = " (%d more commits)" if commit is None else None
res = Response(msg.sender, channel=msg.channel, nomore="No more commit", count=count) res = Response(channel=msg.channel, nomore="No more commit", count=count)
commits = info_commit(repo, commit) commits = info_commit(repo, commit)

View File

@ -84,7 +84,7 @@ def cmd_imdb(msg):
else: else:
data = get_movie(title=title) data = get_movie(title=title)
res = Response(msg.sender, channel=msg.channel, res = Response(channel=msg.channel,
title="%s (%s)" % (data['Title'], data['Year']), title="%s (%s)" % (data['Title'], data['Year']),
nomore="No more information, more at http://www.imdb.com/title/%s" % data['imdbID']) nomore="No more information, more at http://www.imdb.com/title/%s" % data['imdbID'])
@ -105,4 +105,4 @@ def cmd_search(msg):
for m in data['Search']: for m in data['Search']:
movies.append("\x02%s\x0F (%s of %s)" % (m['Title'], m['Type'], m['Year'])) movies.append("\x02%s\x0F (%s of %s)" % (m['Title'], m['Type'], m['Year']))
return Response(msg.sender, movies, title="Titles found", channel=msg.channel) return Response(movies, title="Titles found", channel=msg.channel)

View File

@ -32,7 +32,7 @@ def cmd_man(msg):
args.append(msg.cmds[1]) args.append(msg.cmds[1])
os.unsetenv("LANG") os.unsetenv("LANG")
res = Response(msg.sender, channel=msg.channel) res = Response(channel=msg.channel)
with subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) as proc: with subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) as proc:
for line in proc.stdout.read().split(b"\n"): for line in proc.stdout.read().split(b"\n"):
(line, n) = RGXP_s.subn(b'', line) (line, n) = RGXP_s.subn(b'', line)
@ -50,7 +50,7 @@ def cmd_man(msg):
def cmd_whatis(msg): def cmd_whatis(msg):
args = ["whatis", " ".join(msg.cmds[1:])] args = ["whatis", " ".join(msg.cmds[1:])]
res = Response(msg.sender, channel=msg.channel) res = Response(channel=msg.channel)
with subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) as proc: with subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) as proc:
for line in proc.stdout.read().split(b"\n"): for line in proc.stdout.read().split(b"\n"):
(line, n) = RGXP_s.subn(b'', line) (line, n) = RGXP_s.subn(b'', line)

View File

@ -43,7 +43,7 @@ def cmd_geocode(msg):
raise IRCException("indicate a name") raise IRCException("indicate a name")
locname = ' '.join(msg.cmds[1:]) locname = ' '.join(msg.cmds[1:])
res = Response(msg.sender, channel=msg.channel, nick=msg.nick, nomore="No more geocode", count=" (%s more geocode)") res = Response(channel=msg.channel, nick=msg.nick, nomore="No more geocode", count=" (%s more geocode)")
for loc in geocode(locname): for loc in geocode(locname):
res.append_message("%s is at %s,%s (%s precision)" % (where(loc), loc["latLng"]["lat"], loc["latLng"]["lng"], loc["geocodeQuality"].lower())) res.append_message("%s is at %s,%s (%s precision)" % (where(loc), loc["latLng"]["lat"], loc["latLng"]["lng"], loc["geocodeQuality"].lower()))
return res return res

View File

@ -76,8 +76,7 @@ def cmd_mediawiki(msg):
if len(msg.cmds) < 3: if len(msg.cmds) < 3:
raise IRCException("indicate a domain and a term to search") raise IRCException("indicate a domain and a term to search")
return Response(msg.sender, return Response(get_page(msg.cmds[1], " ".join(msg.cmds[2:])),
get_page(msg.cmds[1], " ".join(msg.cmds[2:])),
channel=msg.receivers) channel=msg.receivers)
@ -86,7 +85,7 @@ def cmd_wikipedia(msg):
if len(msg.cmds) < 3: if len(msg.cmds) < 3:
raise IRCException("indicate a lang and a term to search") raise IRCException("indicate a lang and a term to search")
return Response(msg.sender, return Response(irc_format(parse_wikitext(get_page(msg.cmds[1] + ".wikipedia.org", " ".join(msg.cmds[2:])))),
get_page(msg.cmds[1] + ".wikipedia.org", " ".join(msg.cmds[2:])), # get_page(msg.cmds[1] + ".wikipedia.org", " ".join(msg.cmds[2:])),
channel=msg.receivers, # line_treat=lambda line: irc_format(parse_wikitext(site, line, ssl)),
line_treat=lambda line: irc_format(parse_wikitext(site, line, ssl))) channel=msg.receivers)

View File

@ -32,7 +32,7 @@ def cmd_w3m(msg):
if len(msg.cmds) > 1: if len(msg.cmds) > 1:
args = ["w3m", "-T", "text/html", "-dump"] args = ["w3m", "-T", "text/html", "-dump"]
args.append(msg.cmds[1]) args.append(msg.cmds[1])
res = Response(msg.sender, channel=msg.channel) res = Response(channel=msg.channel)
with subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) as proc: with subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) as proc:
for line in proc.stdout.read().split(b"\n"): for line in proc.stdout.read().split(b"\n"):
res.append_message(line.decode()) res.append_message(line.decode())
@ -48,7 +48,7 @@ def cmd_curl(msg):
try: try:
req = web.getURLContent(" ".join(msg.cmds[1:])) req = web.getURLContent(" ".join(msg.cmds[1:]))
if req is not None: if req is not None:
res = Response(msg.sender, channel=msg.channel) res = Response(channel=msg.channel)
for m in req.split("\n"): for m in req.split("\n"):
res.append_message(m) res.append_message(m)
return res return res
@ -88,7 +88,7 @@ def cmd_curly(msg):
finally: finally:
conn.close() conn.close()
return Response(msg.sender, "Entêtes de la page %s : HTTP/%s, statut : %d %s ; headers : %s" % (url, res.version, res.status, res.reason, ", ".join(["\x03\x02" + h + "\x03\x02: " + v for h, v in res.getheaders()])), channel=msg.channel) return Response("Entêtes de la page %s : HTTP/%s, statut : %d %s ; headers : %s" % (url, res.version, res.status, res.reason, ", ".join(["\x03\x02" + h + "\x03\x02: " + v for h, v in res.getheaders()])), channel=msg.channel)
@hook("cmd_hook", "traceurl") @hook("cmd_hook", "traceurl")
def cmd_traceurl(msg): def cmd_traceurl(msg):
@ -96,7 +96,7 @@ def cmd_traceurl(msg):
res = list() res = list()
for url in msg.cmds[1:]: for url in msg.cmds[1:]:
trace = traceURL(url) trace = traceURL(url)
res.append(Response(msg.sender, trace, channel=msg.channel, title="TraceURL")) res.append(Response(trace, channel=msg.channel, title="TraceURL"))
return res return res
else: else:
raise IRCException("Indiquer a URL to trace!") raise IRCException("Indiquer a URL to trace!")
@ -170,7 +170,7 @@ def cmd_whois(msg):
whois = js["WhoisRecord"] whois = js["WhoisRecord"]
res = Response(msg.sender, channel=msg.channel, nomore="No more whois information") res = Response(channel=msg.channel, nomore="No more whois information")
res.append_message("%s: %s%s%s%s\x03\x02registered by\x03\x02 %s, \x03\x02administrated by\x03\x02 %s, \x03\x02managed by\x03\x02 %s" % (whois["domainName"], res.append_message("%s: %s%s%s%s\x03\x02registered by\x03\x02 %s, \x03\x02administrated by\x03\x02 %s, \x03\x02managed by\x03\x02 %s" % (whois["domainName"],
whois["status"] + " " if "status" in whois else "", whois["status"] + " " if "status" in whois else "",
@ -196,14 +196,14 @@ def cmd_isup(msg):
raw = urllib.request.urlopen(req, timeout=10) raw = urllib.request.urlopen(req, timeout=10)
isup = json.loads(raw.read().decode()) isup = json.loads(raw.read().decode())
if "status_code" in isup and isup["status_code"] == 1: if "status_code" in isup and isup["status_code"] == 1:
res.append(Response(msg.sender, "%s est accessible (temps de reponse : %ss)" % (isup["domain"], isup["response_time"]), channel=msg.channel)) res.append(Response("%s est accessible (temps de reponse : %ss)" % (isup["domain"], isup["response_time"]), channel=msg.channel))
else: else:
res.append(Response(msg.sender, "%s n'est pas accessible :(" % (isup["domain"]), channel=msg.channel)) res.append(Response("%s n'est pas accessible :(" % (isup["domain"]), channel=msg.channel))
else: else:
res.append(Response(msg.sender, "%s n'est pas une URL valide" % url, channel=msg.channel)) res.append(Response("%s n'est pas une URL valide" % url, channel=msg.channel))
return res return res
else: else:
return Response(msg.sender, "Indiquer une URL à vérifier !", channel=msg.channel) return Response("Indiquer une URL à vérifier !", channel=msg.channel)
def traceURL(url, timeout=5, stack=None): def traceURL(url, timeout=5, stack=None):
"""Follow redirections and return the redirections stack""" """Follow redirections and return the redirections stack"""
@ -277,7 +277,7 @@ def cmd_w3c(msg):
validator = json.loads(raw.read().decode()) validator = json.loads(raw.read().decode())
res = Response(msg.sender, channel=msg.channel, nomore="No more error") res = Response(channel=msg.channel, nomore="No more error")
res.append_message("%s: status: %s, %s warning(s), %s error(s)" % (validator["url"], headers["X-W3C-Validator-Status"], headers["X-W3C-Validator-Warnings"], headers["X-W3C-Validator-Errors"])) res.append_message("%s: status: %s, %s warning(s), %s error(s)" % (validator["url"], headers["X-W3C-Validator-Status"], headers["X-W3C-Validator-Warnings"], headers["X-W3C-Validator-Errors"]))

View File

@ -24,17 +24,16 @@ def extractInformation(msg, transport, line, station=None):
times = ratp.getNextStopsAtStation(transport, line, station) times = ratp.getNextStopsAtStation(transport, line, station)
if len(times) > 0: if len(times) > 0:
(time, direction, stationname) = times[0] (time, direction, stationname) = times[0]
return Response(msg.sender, message=["\x03\x02"+time+"\x03\x02 direction "+direction for time, direction, stationname in times], title="Prochains passages du %s ligne %s à l'arrêt %s" % return Response(message=["\x03\x02"+time+"\x03\x02 direction "+direction for time, direction, stationname in times], title="Prochains passages du %s ligne %s à l'arrêt %s" %
(transport, line, stationname), channel=msg.channel) (transport, line, stationname), channel=msg.channel)
else: else:
return Response(msg.sender, "La station `%s' ne semble pas exister sur le %s ligne %s." raise IRCException("La station `%s' ne semble pas exister sur le %s ligne %s."
% (station, transport, line), msg.channel) % (station, transport, line))
else: else:
stations = ratp.getAllStations(transport, line) stations = ratp.getAllStations(transport, line)
if len(stations) > 0: if len(stations) == 0:
return Response(msg.sender, [s for s in stations], title="Stations", channel=msg.channel) raise IRCException("aucune station trouvée.")
else: return Response([s for s in stations], title="Stations", channel=msg.channel)
return Response(msg.sender, "Aucune station trouvée.", msg.channel)
def ask_ratp(msg): def ask_ratp(msg):
"""Hook entry from !ratp""" """Hook entry from !ratp"""
@ -44,5 +43,5 @@ def ask_ratp(msg):
elif len(msg.cmds) == 3: elif len(msg.cmds) == 3:
return extractInformation(msg, msg.cmds[1], msg.cmds[2]) return extractInformation(msg, msg.cmds[1], msg.cmds[2])
else: else:
return Response(msg.sender, "Mauvais usage, merci de spécifier un type de transport et une ligne, ou de consulter l'aide du module.", msg.channel, msg.nick) raise IRCException("Mauvais usage, merci de spécifier un type de transport et une ligne, ou de consulter l'aide du module.")
return False return False

View File

@ -42,15 +42,15 @@ def cmd_subreddit(msg):
sbr = json.loads(raw.read().decode()) sbr = json.loads(raw.read().decode())
if "title" in sbr["data"]: if "title" in sbr["data"]:
res = Response(msg.sender, channel=msg.channel, nomore="No more information") res = Response(channel=msg.channel, nomore="No more information")
res.append_message(("[NSFW] " if sbr["data"]["over18"] else "") + sbr["data"]["url"] + " " + sbr["data"]["title"] + ": " + sbr["data"]["public_description" if sbr["data"]["public_description"] != "" else "description"].replace("\n", " ") + " %s subscriber(s)" % sbr["data"]["subscribers"]) res.append_message(("[NSFW] " if sbr["data"]["over18"] else "") + sbr["data"]["url"] + " " + sbr["data"]["title"] + ": " + sbr["data"]["public_description" if sbr["data"]["public_description"] != "" else "description"].replace("\n", " ") + " %s subscriber(s)" % sbr["data"]["subscribers"])
if sbr["data"]["public_description"] != "": if sbr["data"]["public_description"] != "":
res.append_message(sbr["data"]["description"].replace("\n", " ")) res.append_message(sbr["data"]["description"].replace("\n", " "))
all_res.append(res) all_res.append(res)
else: else:
all_res.append(Response(msg.sender, "/%s/%s doesn't exist" % (where, sub.group(2)), channel=msg.channel)) all_res.append(Response("/%s/%s doesn't exist" % (where, sub.group(2)), channel=msg.channel))
else: else:
all_res.append(Response(msg.sender, "%s is not a valid subreddit" % osub, channel=msg.channel, nick=msg.nick)) all_res.append(Response("%s is not a valid subreddit" % osub, channel=msg.channel, nick=msg.nick))
return all_res return all_res

View File

@ -11,6 +11,6 @@ nemubotversion = 3.4
@hook("cmd_hook", "choice") @hook("cmd_hook", "choice")
def cmd_choice(msg): def cmd_choice(msg):
if len(msg.cmds) > 1: if len(msg.cmds) > 1:
return Response(msg.sender, random.choice(msg.cmds[1:]), channel=msg.channel, nick=msg.nick) return Response(random.choice(msg.cmds[1:]), channel=msg.channel, nick=msg.nick)
else: else:
raise IRCException("indicate some terms to pick!") raise IRCException("indicate some terms to pick!")

View File

@ -23,7 +23,7 @@ def cmd_tcode(msg):
url = "http://www.tcodesearch.com/tcodes/search?q=%s" % urllib.parse.quote(msg.cmds[1]) url = "http://www.tcodesearch.com/tcodes/search?q=%s" % urllib.parse.quote(msg.cmds[1])
page = web.getURLContent(url) page = web.getURLContent(url)
res = Response(msg.sender, channel=msg.channel, res = Response(channel=msg.channel,
nomore="No more transaction code", count=" (%d more tcodes)") nomore="No more transaction code", count=" (%d more tcodes)")
if page is not None: if page is not None:

View File

@ -30,8 +30,7 @@ def cmd_sleep(msg):
for i in range(0,6): for i in range(0,6):
f.append(f[i] - timedelta(hours=1,minutes=30)) f.append(f[i] - timedelta(hours=1,minutes=30))
g.append(f[i+1].strftime("%H:%M")) g.append(f[i+1].strftime("%H:%M"))
return Response(msg.sender, return Response("You should try to fall asleep at one of the following"
"You should try to fall asleep at one of the following"
" times: %s" % ', '.join(g), channel=msg.channel) " times: %s" % ', '.join(g), channel=msg.channel)
# Just get awake times # Just get awake times
@ -41,7 +40,6 @@ def cmd_sleep(msg):
for i in range(0,6): for i in range(0,6):
f.append(f[i] + timedelta(hours=1,minutes=30)) f.append(f[i] + timedelta(hours=1,minutes=30))
g.append(f[i+1].strftime("%H:%M")) g.append(f[i+1].strftime("%H:%M"))
return Response(msg.sender, return Response("If you head to bed right now, you should try to wake"
"If you head to bed right now, you should try to wake"
" up at one of the following times: %s" % " up at one of the following times: %s" %
', '.join(g), channel=msg.channel) ', '.join(g), channel=msg.channel)

View File

@ -69,9 +69,9 @@ def cmd_sms(msg):
fails.append( "%s: %s" % (u, test) ) fails.append( "%s: %s" % (u, test) )
if len(fails) > 0: if len(fails) > 0:
return Response(msg.sender, "quelque chose ne s'est pas bien passé durant l'envoi du SMS : " + ", ".join(fails), msg.channel, msg.nick) return Response("quelque chose ne s'est pas bien passé durant l'envoi du SMS : " + ", ".join(fails), msg.channel, msg.nick)
else: else:
return Response(msg.sender, "le SMS a bien été envoyé", msg.channel, msg.nick) return Response("le SMS a bien été envoyé", msg.channel, msg.nick)
apiuser_ask = re.compile(r"(utilisateur|user|numéro|numero|compte|abonne|abone|abonné|account)\s+(est|is)\s+(?P<user>[0-9]{7,})", re.IGNORECASE) apiuser_ask = re.compile(r"(utilisateur|user|numéro|numero|compte|abonne|abone|abonné|account)\s+(est|is)\s+(?P<user>[0-9]{7,})", re.IGNORECASE)
apikey_ask = re.compile(r"(clef|key|password|mot de passe?)\s+(?:est|is)?\s+(?P<key>[a-zA-Z0-9]{10,})", re.IGNORECASE) apikey_ask = re.compile(r"(clef|key|password|mot de passe?)\s+(?:est|is)?\s+(?P<key>[a-zA-Z0-9]{10,})", re.IGNORECASE)
@ -90,7 +90,7 @@ def parseask(msg):
test = send_sms("nemubot", apiuser, apikey, test = send_sms("nemubot", apiuser, apikey,
"Vous avez enregistré vos codes d'authentification dans nemubot, félicitation !") "Vous avez enregistré vos codes d'authentification dans nemubot, félicitation !")
if test is not None: if test is not None:
return Response(msg.sender, "je n'ai pas pu enregistrer tes identifiants : %s" % test, msg.channel, msg.nick) return Response("je n'ai pas pu enregistrer tes identifiants : %s" % test, msg.channel, msg.nick)
if msg.nick in DATAS.index: if msg.nick in DATAS.index:
DATAS.index[msg.nick]["user"] = apiuser DATAS.index[msg.nick]["user"] = apiuser
@ -103,5 +103,5 @@ def parseask(msg):
ms.setAttribute("lastuse", 0) ms.setAttribute("lastuse", 0)
DATAS.addChild(ms) DATAS.addChild(ms)
save() save()
return Response(msg.sender, "ok, c'est noté. Je t'ai envoyé un SMS pour tester ;)", return Response("ok, c'est noté. Je t'ai envoyé un SMS pour tester ;)",
msg.channel, msg.nick) msg.channel, msg.nick)

View File

@ -33,7 +33,7 @@ def cmd_spell(msg):
try: try:
r = check_spell(word, lang) r = check_spell(word, lang)
except AspellError: except AspellError:
return Response(msg.sender, "Je n'ai pas le dictionnaire `%s' :(" % lang, msg.channel, msg.nick) return Response("Je n'ai pas le dictionnaire `%s' :(" % lang, msg.channel, msg.nick)
if r == True: if r == True:
add_score(msg.nick, "correct") add_score(msg.nick, "correct")
strRes.append("l'orthographe de `%s' est correcte" % word) strRes.append("l'orthographe de `%s' est correcte" % word)
@ -43,7 +43,7 @@ def cmd_spell(msg):
else: else:
add_score(msg.nick, "bad") add_score(msg.nick, "bad")
strRes.append("aucune suggestion pour `%s'" % word) strRes.append("aucune suggestion pour `%s'" % word)
return Response(msg.sender, strRes, channel=msg.channel, nick=msg.nick) return Response(strRes, channel=msg.channel, nick=msg.nick)
def add_score(nick, t): def add_score(nick, t):
global DATAS global DATAS
@ -66,13 +66,13 @@ def cmd_score(msg):
if len(msg.cmds) > 1: if len(msg.cmds) > 1:
for cmd in msg.cmds[1:]: for cmd in msg.cmds[1:]:
if cmd in DATAS.index: if cmd in DATAS.index:
res.append(Response(msg.sender, "%s: %s" % (cmd, " ; ".join(["%s: %d" % (a, DATAS.index[cmd].getInt(a)) for a in DATAS.index[cmd].attributes.keys() if a != "name"])), channel=msg.channel)) res.append(Response("%s: %s" % (cmd, " ; ".join(["%s: %d" % (a, DATAS.index[cmd].getInt(a)) for a in DATAS.index[cmd].attributes.keys() if a != "name"])), channel=msg.channel))
else: else:
unknown.append(cmd) unknown.append(cmd)
else: else:
return Response(msg.sender, "De qui veux-tu voir les scores ?", channel=msg.channel, nick=msg.nick) return Response("De qui veux-tu voir les scores ?", channel=msg.channel, nick=msg.nick)
if len(unknown) > 0: if len(unknown) > 0:
res.append(Response(msg.sender, "%s inconnus" % ", ".join(unknown), channel=msg.channel)) res.append(Response("%s inconnus" % ", ".join(unknown), channel=msg.channel))
return res return res

View File

@ -35,7 +35,7 @@ def go(what, msg):
if what == "synonymes": if what == "synonymes":
if len(synos) > 0: if len(synos) > 0:
res = Response(msg.sender, best, channel=msg.channel, res = Response(best, channel=msg.channel,
title="Synonymes de %s" % word) title="Synonymes de %s" % word)
res.append_message(synos) res.append_message(synos)
return res return res
@ -44,7 +44,7 @@ def go(what, msg):
elif what == "antonymes": elif what == "antonymes":
if len(anton) > 0: if len(anton) > 0:
res = Response(msg.sender, anton, channel=msg.channel, res = Response(anton, channel=msg.channel,
title="Antonymes de %s" % word) title="Antonymes de %s" % word)
return res return res
else: else:

View File

@ -68,7 +68,7 @@ def cmd_translate(msg):
raise IRCException(wres["Note"]) raise IRCException(wres["Note"])
else: else:
res = Response(msg.sender, channel=msg.channel, res = Response(channel=msg.channel,
count=" (%d more meanings)", count=" (%d more meanings)",
nomore="No more translation") nomore="No more translation")
for k in sorted(wres.keys()): for k in sorted(wres.keys()):

View File

@ -55,8 +55,7 @@ def print_station_status(msg, station):
"""Send message with information about the given station""" """Send message with information about the given station"""
(available, free) = station_status(station) (available, free) = station_status(station)
if available is not None and free is not None: if available is not None and free is not None:
return Response(msg.sender, return Response("à la station %s : %d vélib et %d points d'attache"
"à la station %s : %d vélib et %d points d'attache"
" disponibles." % (station, available, free), " disponibles." % (station, available, free),
channel=msg.channel, nick=msg.nick) channel=msg.channel, nick=msg.nick)
raise IRCException("station %s inconnue." % station) raise IRCException("station %s inconnue." % station)

View File

@ -70,8 +70,7 @@ def del_site(msg):
del_event(site["_evt_id"]) del_event(site["_evt_id"])
DATAS.delChild(site) DATAS.delChild(site)
save() save()
return Response(msg.sender, return Response("je ne surveille désormais plus cette URL.",
"je ne surveille désormais plus cette URL.",
channel=msg.channel, nick=msg.nick) channel=msg.channel, nick=msg.nick)
raise IRCException("je ne surveillais pas cette URL !") raise IRCException("je ne surveillais pas cette URL !")
@ -107,12 +106,12 @@ def add_site(msg, diffType="diff"):
DATAS.index[url].addChild(alert) DATAS.index[url].addChild(alert)
save() save()
return Response(msg.sender, channel=msg.channel, nick=msg.nick, return Response(channel=msg.channel, nick=msg.nick,
message="ce site est maintenant sous ma surveillance.") message="ce site est maintenant sous ma surveillance.")
def format_response(site, link='%s', title='%s', categ='%s', content='%s'): def format_response(site, link='%s', title='%s', categ='%s', content='%s'):
for a in site.getNodes("alert"): for a in site.getNodes("alert"):
send_response(a["server"], Response(a["sender"], a["message"].format(url=site["url"], link=link, title=title, categ=categ, content=content), send_response(a["server"], Response(a["message"].format(url=site["url"], link=link, title=title, categ=categ, content=content),
channel=a["channel"], server=a["server"])) channel=a["channel"], server=a["server"]))
def alert_change(content, site): def alert_change(content, site):

View File

@ -144,13 +144,13 @@ def cmd_coordinates(msg):
raise IRCException("%s n'est pas une ville connue" % msg.cmds[1]) raise IRCException("%s n'est pas une ville connue" % msg.cmds[1])
coords = DATAS.index[j] coords = DATAS.index[j]
return Response(msg.sender, "Les coordonnées de %s sont %s,%s" % (msg.cmds[1], coords["lat"], coords["long"]), channel=msg.channel) return Response("Les coordonnées de %s sont %s,%s" % (msg.cmds[1], coords["lat"], coords["long"]), channel=msg.channel)
def cmd_alert(msg): def cmd_alert(msg):
loc, coords, specific = treat_coord(msg) loc, coords, specific = treat_coord(msg)
wth = get_json_weather(coords) wth = get_json_weather(coords)
res = Response(msg.sender, channel=msg.channel, nomore="No more weather alert", count=" (%d more alerts)") res = Response(channel=msg.channel, nomore="No more weather alert", count=" (%d more alerts)")
if "alerts" in wth: if "alerts" in wth:
for alert in wth["alerts"]: for alert in wth["alerts"]:
@ -162,7 +162,7 @@ def cmd_weather(msg):
loc, coords, specific = treat_coord(msg) loc, coords, specific = treat_coord(msg)
wth = get_json_weather(coords) wth = get_json_weather(coords)
res = Response(msg.sender, channel=msg.channel, nomore="No more weather information") res = Response(channel=msg.channel, nomore="No more weather information")
if "alerts" in wth: if "alerts" in wth:
alert_msgs = list() alert_msgs = list()
@ -228,6 +228,5 @@ def parseask(msg):
ms.setAttribute("long", gps_long) ms.setAttribute("long", gps_long)
DATAS.addChild(ms) DATAS.addChild(ms)
save() save()
return Response(msg.sender, return Response("ok, j'ai bien noté les coordonnées de %s" % res.group("city"),
"ok, j'ai bien noté les coordonnées de %s" % res.group("city"),
msg.channel, msg.nick) msg.channel, msg.nick)

View File

@ -79,7 +79,7 @@ def current_match_new_action(match_str, osef):
msg += " ; à la " + txt_event(events[0]) msg += " ; à la " + txt_event(events[0])
for n in DATAS.getChilds(): for n in DATAS.getChilds():
send_response(n["server"], Response(n["sender"], msg, channel=n["channel"])) send_response(n["server"], Response(msg, channel=n["channel"]))
def is_int(s): def is_int(s):
try: try:
@ -179,7 +179,7 @@ def get_matches(url):
@hook("cmd_hook", "worldcup") @hook("cmd_hook", "worldcup")
def cmd_worldcup(msg): def cmd_worldcup(msg):
res = Response(msg.sender, channel=msg.channel, nomore="No more match to display", count=" (%d more matches)") res = Response(channel=msg.channel, nomore="No more match to display", count=" (%d more matches)")
nb = len(msg.cmds) nb = len(msg.cmds)
url = None url = None

View File

@ -20,7 +20,7 @@ def gen_response(res, msg, srv):
if res is None: if res is None:
raise IRCException("la situation est embarassante, il semblerait que YCC soit down :(") raise IRCException("la situation est embarassante, il semblerait que YCC soit down :(")
elif isinstance(res, str): elif isinstance(res, str):
return Response(msg.sender, "URL pour %s : %s" % (srv, res), msg.channel) return Response("URL pour %s : %s" % (srv, res), msg.channel)
else: else:
raise IRCException("mauvaise URL : %s" % srv) raise IRCException("mauvaise URL : %s" % srv)

View File

@ -23,9 +23,9 @@ import sys
logger = logging.getLogger("nemubot.response") logger = logging.getLogger("nemubot.response")
class Response: class Response:
def __init__(self, sender, message=None, channel=None, nick=None, server=None, def __init__(self, message=None, channel=None, nick=None, server=None,
nomore="No more message", title=None, more="(suite) ", count=None, nomore="No more message", title=None, more="(suite) ",
ctcp=False, shown_first_count=-1): count=None, ctcp=False, shown_first_count=-1):
self.nomore = nomore self.nomore = nomore
self.more = more self.more = more
self.rawtitle = title self.rawtitle = title
@ -37,29 +37,22 @@ class Response:
self.append_message(message, shown_first_count=shown_first_count) self.append_message(message, shown_first_count=shown_first_count)
self.elt = 0 # Next element to display self.elt = 0 # Next element to display
self.sender = None
self.channel = channel self.channel = channel
self.nick = nick self.nick = nick
self.set_sender(sender)
self.count = count self.count = count
@property @property
def receivers(self): def receivers(self):
if type(self.channel) is list: if self.channel is None:
if self.nick is not None:
return [ self.nick ]
return [ self.sender.split("!")[0] ]
elif isinstance(self.channel, list):
return self.channel return self.channel
else: else:
return [ self.channel ] return [ self.channel ]
@property
def content(self):
#FIXME: error when messages in self.messages are list!
try:
if self.title is not None:
return self.title + ", ".join(self.messages)
else:
return ", ".join(self.messages)
except:
return ""
def set_sender(self, sender): def set_sender(self, sender):
if sender is None or sender.find("!") < 0: if sender is None or sender.find("!") < 0:
if sender is not None: if sender is not None:

View File

@ -56,8 +56,7 @@ class IRCServer(SocketServer):
def _ctcp_clientinfo(msg): def _ctcp_clientinfo(msg):
"""Response to CLIENTINFO CTCP message""" """Response to CLIENTINFO CTCP message"""
return _ctcp_response(msg.sender, return _ctcp_response(" ".join(self.ctcp_capabilities.keys()))
" ".join(self.ctcp_capabilities.keys()))
def _ctcp_dcc(msg): def _ctcp_dcc(msg):
"""Response to DCC CTCP message""" """Response to DCC CTCP message"""
@ -66,7 +65,7 @@ class IRCServer(SocketServer):
port = int(msg.cmds[4]) port = int(msg.cmds[4])
conn = DCC(srv, msg.sender) conn = DCC(srv, msg.sender)
except: except:
return _ctcp_response(msg.sender, "ERRMSG invalid parameters provided as DCC CTCP request") return _ctcp_response("ERRMSG invalid parameters provided as DCC CTCP request")
self.logger.info("Receive DCC connection request from %s to %s:%d", conn.sender, ip, port) self.logger.info("Receive DCC connection request from %s to %s:%d", conn.sender, ip, port)
@ -75,25 +74,25 @@ class IRCServer(SocketServer):
conn.send_dcc("Hello %s!" % conn.nick) conn.send_dcc("Hello %s!" % conn.nick)
else: else:
self.logger.error("DCC: unable to connect to %s:%d", ip, port) self.logger.error("DCC: unable to connect to %s:%d", ip, port)
return _ctcp_response(msg.sender, "ERRMSG unable to connect to %s:%d" % (ip, port)) return _ctcp_response("ERRMSG unable to connect to %s:%d" % (ip, port))
self.ctcp_capabilities["ACTION"] = lambda msg: print ("ACTION receive: %s" % msg.text) self.ctcp_capabilities["ACTION"] = lambda msg: print ("ACTION receive: %s" % msg.text)
self.ctcp_capabilities["CLIENTINFO"] = _ctcp_clientinfo self.ctcp_capabilities["CLIENTINFO"] = _ctcp_clientinfo
#self.ctcp_capabilities["DCC"] = _ctcp_dcc #self.ctcp_capabilities["DCC"] = _ctcp_dcc
self.ctcp_capabilities["FINGER"] = lambda msg: _ctcp_response( self.ctcp_capabilities["FINGER"] = lambda msg: _ctcp_response(
msg.sender, "VERSION nemubot v%s" % bot.__version__) "VERSION nemubot v%s" % bot.__version__)
self.ctcp_capabilities["NEMUBOT"] = lambda msg: _ctcp_response( self.ctcp_capabilities["NEMUBOT"] = lambda msg: _ctcp_response(
msg.sender, "NEMUBOT %s" % bot.__version__) "NEMUBOT %s" % bot.__version__)
self.ctcp_capabilities["PING"] = lambda msg: _ctcp_response( self.ctcp_capabilities["PING"] = lambda msg: _ctcp_response(
msg.sender, "PING %s" % " ".join(msg.cmds[1:])) "PING %s" % " ".join(msg.cmds[1:]))
self.ctcp_capabilities["SOURCE"] = lambda msg: _ctcp_response( self.ctcp_capabilities["SOURCE"] = lambda msg: _ctcp_response(
msg.sender, "SOURCE https://github.com/nemunaire/nemubot") "SOURCE https://github.com/nemunaire/nemubot")
self.ctcp_capabilities["TIME"] = lambda msg: _ctcp_response( self.ctcp_capabilities["TIME"] = lambda msg: _ctcp_response(
msg.sender, "TIME %s" % (datetime.now())) "TIME %s" % (datetime.now()))
self.ctcp_capabilities["USERINFO"] = lambda msg: _ctcp_response( self.ctcp_capabilities["USERINFO"] = lambda msg: _ctcp_response(
msg.sender, "USERINFO %s" % self.realname) "USERINFO %s" % self.realname)
self.ctcp_capabilities["VERSION"] = lambda msg: _ctcp_response( self.ctcp_capabilities["VERSION"] = lambda msg: _ctcp_response(
msg.sender, "VERSION nemubot v%s" % bot.__version__) "VERSION nemubot v%s" % bot.__version__)
self.logger.debug("CTCP capabilities setup: %s", ", ".join(self.ctcp_capabilities)) self.logger.debug("CTCP capabilities setup: %s", ", ".join(self.ctcp_capabilities))
@ -187,15 +186,11 @@ class IRCServer(SocketServer):
return False return False
def send_response(self, res): def send_response(self, res):
if type(res.channel) != list: for channel in res.receivers:
res.channel = [ res.channel ]
for channel in res.channel:
if channel is not None and channel != self.nick: if channel is not None and channel != self.nick:
self.write("%s %s :%s" % ("PRIVMSG", channel, res.get_message()))
else:
channel = res.sender.split("!")[0]
self.write("%s %s :%s" % ("NOTICE" if res.is_ctcp else "PRIVMSG", channel, res.get_message())) self.write("%s %s :%s" % ("NOTICE" if res.is_ctcp else "PRIVMSG", channel, res.get_message()))
else:
raise Exception("Trying to send a message to an undefined channel: %s" % channel)
def _close(self): def _close(self):
if self.socket is not None: self.write("QUIT") if self.socket is not None: self.write("QUIT")
@ -212,12 +207,19 @@ class IRCServer(SocketServer):
mes = msg.to_message() mes = msg.to_message()
mes.raw = msg.raw mes.raw = msg.raw
if mes.cmd == "PRIVMSG" and mes.is_ctcp: if hasattr(mes, "receivers"):
# Private message: prepare response
for i in range(len(mes.receivers)):
if mes.receivers[i] == self.nick:
mes.receivers[i] = mes.nick
if (mes.cmd == "PRIVMSG" or mes.cmd == "NOTICE") and mes.is_ctcp:
if mes.cmds[0] in self.ctcp_capabilities: if mes.cmds[0] in self.ctcp_capabilities:
res = self.ctcp_capabilities[mes.cmds[0]](mes) res = self.ctcp_capabilities[mes.cmds[0]](mes)
else: else:
res = _ctcp_response(mes.sender, "ERRMSG Unknown or unimplemented CTCP request") res = _ctcp_response("ERRMSG Unknown or unimplemented CTCP request")
if res is not None: if res is not None:
res.set_sender(mes.sender)
self.send_response(res) self.send_response(res)
else: else:
@ -226,8 +228,8 @@ class IRCServer(SocketServer):
from response import Response from response import Response
def _ctcp_response(sndr, msg): def _ctcp_response(msg):
return Response(sndr, msg, ctcp=True) return Response(msg, ctcp=True)
mgx = re.compile(b'''^(?:@(?P<tags>[^ ]+)\ )? mgx = re.compile(b'''^(?:@(?P<tags>[^ ]+)\ )?