New message processing
This commit is contained in:
parent
981025610e
commit
dfde4c5f49
20 changed files with 519 additions and 325 deletions
|
|
@ -5,8 +5,10 @@
|
|||
import re
|
||||
import sys
|
||||
from datetime import datetime, timezone
|
||||
import shlex
|
||||
|
||||
from hooks import hook
|
||||
from message import TextMessage, Command
|
||||
|
||||
nemubotversion = 3.4
|
||||
|
||||
|
|
@ -34,10 +36,8 @@ def set_variable(name, value, creator):
|
|||
DATAS.getNode("variables").addChild(var)
|
||||
|
||||
def get_variable(name, msg=None):
|
||||
if name == "sender":
|
||||
return msg.sender
|
||||
elif name == "nick":
|
||||
return msg.nick
|
||||
if name == "sender" or name == "from" or name == "nick":
|
||||
return msg.frm
|
||||
elif name == "chan" or name == "channel":
|
||||
return msg.channel
|
||||
elif name == "date":
|
||||
|
|
@ -141,35 +141,25 @@ def replace_variables(cnt, msg=None):
|
|||
return " ".join(cnt)
|
||||
|
||||
|
||||
@hook("all_post")
|
||||
def treat_variables(res):
|
||||
for i in range(0, len(res.messages)):
|
||||
if isinstance(res.messages[i], list):
|
||||
res.messages[i] = replace_variables(", ".join(res.messages[i]), res)
|
||||
else:
|
||||
res.messages[i] = replace_variables(res.messages[i], res)
|
||||
return res
|
||||
|
||||
@hook("pre_PRIVMSG_cmd")
|
||||
@hook("pre_Command")
|
||||
def treat_alias(msg):
|
||||
if msg.cmds[0] in DATAS.getNode("aliases").index:
|
||||
oldcmd = msg.cmds[0]
|
||||
msg.text = msg.text.replace(msg.cmds[0],
|
||||
DATAS.getNode("aliases").index[msg.cmds[0]]["origin"], 1)
|
||||
|
||||
msg.qual = "def"
|
||||
msg.parse_content()
|
||||
if msg.cmd in DATAS.getNode("aliases").index:
|
||||
txt = DATAS.getNode("aliases").index[msg.cmd]["origin"]
|
||||
# TODO: for legacy compatibility
|
||||
if txt[0] == "!":
|
||||
txt = txt[1:]
|
||||
try:
|
||||
args = shlex.split(txt)
|
||||
except ValueError:
|
||||
args = txt.split(' ')
|
||||
nmsg = Command(args[0], args[1:] + msg.args, **msg.export_args())
|
||||
|
||||
# Avoid infinite recursion
|
||||
if oldcmd == msg.cmds[0]:
|
||||
return msg
|
||||
else:
|
||||
return treat_alias(msg)
|
||||
if msg.cmd != nmsg.cmd:
|
||||
return nmsg
|
||||
|
||||
return msg
|
||||
|
||||
else:
|
||||
msg.text = replace_variables(msg.text, msg)
|
||||
msg.parse_content()
|
||||
return msg
|
||||
|
||||
@hook("ask_default")
|
||||
def parseask(msg):
|
||||
|
|
|
|||
|
|
@ -71,8 +71,7 @@ def start_countdown(msg):
|
|||
strnd["server"] = msg.server
|
||||
strnd["channel"] = msg.channel
|
||||
strnd["proprio"] = msg.nick
|
||||
strnd["sender"] = msg.sender
|
||||
strnd["start"] = msg.tags["time"]
|
||||
strnd["start"] = msg.date
|
||||
strnd["name"] = msg.cmds[1]
|
||||
DATAS.addChild(strnd)
|
||||
|
||||
|
|
@ -84,7 +83,7 @@ def start_countdown(msg):
|
|||
result3 = re.match("(.*[^0-9])?([0-2]?[0-9]):([0-5]?[0-9])(:([0-5]?[0-9]))?", msg.cmds[2])
|
||||
if result2 is not None or result3 is not None:
|
||||
try:
|
||||
now = msg.tags["time"]
|
||||
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
|
||||
|
|
@ -109,7 +108,7 @@ def start_countdown(msg):
|
|||
raise IRCException("Mauvais format de date pour l'événement %s. Il n'a pas été créé." % msg.cmds[1])
|
||||
|
||||
elif result1 is not None and len(result1) > 0:
|
||||
strnd["end"] = msg.tags["time"]
|
||||
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))
|
||||
|
|
@ -131,11 +130,13 @@ def start_countdown(msg):
|
|||
save()
|
||||
if "end" in strnd:
|
||||
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"),
|
||||
strnd.getDate("end").strftime("%A %d %B %Y à %H:%M:%S")))
|
||||
(msg.cmds[1], 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.cmds[1],
|
||||
msg.tags["time"].strftime("%A %d %B %Y à %H:%M:%S")))
|
||||
msg.date.strftime("%A %d %B %Y à %H:%M:%S")),
|
||||
nick=msg.frm)
|
||||
|
||||
@hook("cmd_hook", "end")
|
||||
@hook("cmd_hook", "forceend")
|
||||
|
|
@ -145,7 +146,7 @@ def end_countdown(msg):
|
|||
|
||||
if msg.cmds[1] in DATAS.index:
|
||||
if DATAS.index[msg.cmds[1]]["proprio"] == msg.nick or (msg.cmds[0] == "forceend" and msg.is_owner):
|
||||
duration = countdown(msg.tags["time"] - DATAS.index[msg.cmds[1]].getDate("start"))
|
||||
duration = countdown(msg.date - DATAS.index[msg.cmds[1]].getDate("start"))
|
||||
del_event(DATAS.index[msg.cmds[1]]["id"])
|
||||
DATAS.delChild(DATAS.index[msg.cmds[1]])
|
||||
save()
|
||||
|
|
@ -182,9 +183,9 @@ def parseanswer(msg):
|
|||
|
||||
if DATAS.index[msg.cmds[0]].name == "strend":
|
||||
if DATAS.index[msg.cmds[0]].hasAttribute("end"):
|
||||
res.append_message("%s commencé il y a %s et se terminera dans %s." % (msg.cmds[0], countdown(msg.tags["time"] - DATAS.index[msg.cmds[0]].getDate("start")), countdown(DATAS.index[msg.cmds[0]].getDate("end") - msg.tags["time"])))
|
||||
res.append_message("%s commencé il y a %s et se terminera dans %s." % (msg.cmds[0], countdown(msg.date - DATAS.index[msg.cmds[0]].getDate("start")), countdown(DATAS.index[msg.cmds[0]].getDate("end") - msg.date)))
|
||||
else:
|
||||
res.append_message("%s commencé il y a %s." % (msg.cmds[0], countdown(msg.tags["time"] - DATAS.index[msg.cmds[0]].getDate("start"))))
|
||||
res.append_message("%s commencé il y a %s." % (msg.cmds[0], countdown(msg.date - DATAS.index[msg.cmds[0]].getDate("start"))))
|
||||
else:
|
||||
res.append_message(countdown_format(DATAS.index[msg.cmds[0]].getDate("start"), DATAS.index[msg.cmds[0]]["msg_before"], DATAS.index[msg.cmds[0]]["msg_after"]))
|
||||
return res
|
||||
|
|
@ -222,7 +223,6 @@ def parseask(msg):
|
|||
evt["server"] = msg.server
|
||||
evt["channel"] = msg.channel
|
||||
evt["proprio"] = msg.nick
|
||||
evt["sender"] = msg.sender
|
||||
evt["name"] = name.group(1)
|
||||
evt["start"] = extDate
|
||||
evt["msg_after"] = msg_after
|
||||
|
|
@ -237,12 +237,12 @@ def parseask(msg):
|
|||
evt["server"] = msg.server
|
||||
evt["channel"] = msg.channel
|
||||
evt["proprio"] = msg.nick
|
||||
evt["sender"] = msg.sender
|
||||
evt["name"] = name.group(1)
|
||||
evt["msg_before"] = texts.group (2)
|
||||
DATAS.addChild(evt)
|
||||
save()
|
||||
return Response("Nouvelle commande !%s ajoutée avec succès." % name.group(1))
|
||||
return Response("Nouvelle commande !%s ajoutée avec succès." % name.group(1),
|
||||
channel=msg.channel)
|
||||
|
||||
else:
|
||||
raise IRCException("Veuillez indiquez les messages d'attente et d'après événement entre guillemets.")
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ def search(site, term, ssl=False):
|
|||
web.striphtml(itm["snippet"].replace("<span class='searchmatch'>", "\x03\x02").replace("</span>", "\x03\x02")))
|
||||
|
||||
|
||||
@hook("in_PRIVMSG_cmd", "mediawiki")
|
||||
@hook("cmd_hook", "mediawiki")
|
||||
def cmd_mediawiki(msg):
|
||||
"""Read an article on a MediaWiki"""
|
||||
if len(msg.cmds) < 3:
|
||||
|
|
@ -118,7 +118,7 @@ def cmd_mediawiki(msg):
|
|||
channel=msg.receivers)
|
||||
|
||||
|
||||
@hook("in_PRIVMSG_cmd", "search_mediawiki")
|
||||
@hook("cmd_hook", "search_mediawiki")
|
||||
def cmd_srchmediawiki(msg):
|
||||
"""Search an article on a MediaWiki"""
|
||||
if len(msg.cmds) < 3:
|
||||
|
|
@ -132,7 +132,7 @@ def cmd_srchmediawiki(msg):
|
|||
return res
|
||||
|
||||
|
||||
@hook("in_PRIVMSG_cmd", "wikipedia")
|
||||
@hook("cmd_hook", "wikipedia")
|
||||
def cmd_wikipedia(msg):
|
||||
if len(msg.cmds) < 3:
|
||||
raise IRCException("indicate a lang and a term to search")
|
||||
|
|
|
|||
100
modules/more.py
100
modules/more.py
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
import logging
|
||||
|
||||
from message import TextMessage, DirectAsk
|
||||
from hooks import hook
|
||||
|
||||
nemubotversion = 3.4
|
||||
|
|
@ -29,8 +30,7 @@ logger = logging.getLogger("nemubot.response")
|
|||
class Response:
|
||||
def __init__(self, message=None, channel=None, nick=None, server=None,
|
||||
nomore="No more message", title=None, more="(suite) ",
|
||||
count=None, ctcp=False, shown_first_count=-1,
|
||||
line_treat=None):
|
||||
count=None, shown_first_count=-1, line_treat=None):
|
||||
self.nomore = nomore
|
||||
self.more = more
|
||||
self.line_treat = line_treat
|
||||
|
|
@ -38,12 +38,10 @@ class Response:
|
|||
self.server = server
|
||||
self.messages = list()
|
||||
self.alone = True
|
||||
self.is_ctcp = ctcp
|
||||
if message is not None:
|
||||
self.append_message(message, shown_first_count=shown_first_count)
|
||||
self.elt = 0 # Next element to display
|
||||
|
||||
self.sender = None
|
||||
self.channel = channel
|
||||
self.nick = nick
|
||||
self.count = count
|
||||
|
|
@ -59,14 +57,6 @@ class Response:
|
|||
else:
|
||||
return [ self.channel ]
|
||||
|
||||
def set_sender(self, sender):
|
||||
if sender is None or sender.find("!") < 0:
|
||||
if sender is not None:
|
||||
logger.warn("Bad sender provided in Response, it will be ignored.", stack_info=True)
|
||||
self.sender = None
|
||||
else:
|
||||
self.sender = sender
|
||||
|
||||
def append_message(self, message, title=None, shown_first_count=-1):
|
||||
if type(message) is str:
|
||||
message = message.split('\n')
|
||||
|
|
@ -120,13 +110,19 @@ class Response:
|
|||
if len(self.rawtitle) <= 0:
|
||||
self.rawtitle = None
|
||||
|
||||
def treat_ctcp(self, content):
|
||||
if self.is_ctcp:
|
||||
return "\x01" + content + "\x01"
|
||||
else:
|
||||
return content
|
||||
|
||||
def get_message(self):
|
||||
def accept(self, visitor):
|
||||
visitor.visit(self.next_response())
|
||||
|
||||
|
||||
def next_response(self, maxlen=440):
|
||||
if self.nick:
|
||||
return DirectAsk(self.nick, self.get_message(maxlen - len(self.nick) - 2), server=None, to=self.receivers)
|
||||
else:
|
||||
return TextMessage(self.get_message(maxlen), server=None, to=self.receivers)
|
||||
|
||||
|
||||
def get_message(self, maxlen):
|
||||
if self.alone and len(self.messages) > 1:
|
||||
self.alone = False
|
||||
|
||||
|
|
@ -134,7 +130,7 @@ class Response:
|
|||
if hasattr(self.nomore, '__call__'):
|
||||
res = self.nomore(self)
|
||||
if res is None:
|
||||
return self.treat_ctcp("No more message")
|
||||
return "No more message"
|
||||
elif isinstance(res, Response):
|
||||
self.__dict__ = res.__dict__
|
||||
elif isinstance(res, list):
|
||||
|
|
@ -145,62 +141,59 @@ class Response:
|
|||
raise Exception("Type returned by nomore (%s) is not handled here." % type(res))
|
||||
return self.get_message()
|
||||
else:
|
||||
return self.treat_ctcp(self.nomore)
|
||||
return self.nomore
|
||||
|
||||
if self.line_treat is not None and self.elt == 0:
|
||||
self.messages[0] = self.line_treat(self.messages[0]).replace("\n", " ").strip()
|
||||
|
||||
msg = ""
|
||||
if self.channel is not None and self.nick is not None:
|
||||
msg += self.nick + ": "
|
||||
|
||||
if self.title is not None:
|
||||
if self.elt > 0:
|
||||
msg += self.title + " " + self.more + ": "
|
||||
else:
|
||||
msg += self.title + ": "
|
||||
|
||||
if self.elt > 0:
|
||||
elif self.elt > 0:
|
||||
msg += "[…] "
|
||||
|
||||
elts = self.messages[0][self.elt:]
|
||||
if isinstance(elts, list):
|
||||
for e in elts:
|
||||
if len(msg) + len(e) > 430:
|
||||
if len(msg) + len(e) > maxlen - 3:
|
||||
msg += "[…]"
|
||||
self.alone = False
|
||||
return self.treat_ctcp(msg)
|
||||
return msg
|
||||
else:
|
||||
msg += e + ", "
|
||||
self.elt += 1
|
||||
self.pop()
|
||||
return self.treat_ctcp(msg[:len(msg)-2])
|
||||
return msg[:len(msg)-2]
|
||||
|
||||
else:
|
||||
if len(elts.encode()) <= 432:
|
||||
if len(elts.encode()) <= maxlen:
|
||||
self.pop()
|
||||
if self.count is not None:
|
||||
return self.treat_ctcp(msg + elts + (self.count % len(self.messages)))
|
||||
return msg + elts + (self.count % len(self.messages))
|
||||
else:
|
||||
return self.treat_ctcp(msg + elts)
|
||||
return msg + elts
|
||||
|
||||
else:
|
||||
words = elts.split(' ')
|
||||
|
||||
if len(words[0].encode()) > 432 - len(msg.encode()):
|
||||
self.elt += 432 - len(msg.encode())
|
||||
return self.treat_ctcp(msg + elts[:self.elt] + "[…]")
|
||||
if len(words[0].encode()) > maxlen - len(msg.encode()):
|
||||
self.elt += maxlen - len(msg.encode())
|
||||
return msg + elts[:self.elt] + "[…]"
|
||||
|
||||
for w in words:
|
||||
if len(msg.encode()) + len(w.encode()) > 431:
|
||||
if len(msg.encode()) + len(w.encode()) >= maxlen:
|
||||
msg += "[…]"
|
||||
self.alone = False
|
||||
return self.treat_ctcp(msg)
|
||||
return msg
|
||||
else:
|
||||
msg += w + " "
|
||||
self.elt += len(w) + 1
|
||||
self.pop()
|
||||
return self.treat_ctcp(msg)
|
||||
return msg
|
||||
|
||||
|
||||
SERVERS = dict()
|
||||
|
|
@ -209,18 +202,17 @@ SERVERS = dict()
|
|||
def parseresponse(res):
|
||||
# TODO: handle inter-bot communication NOMORE
|
||||
# TODO: check that the response is not the one already saved
|
||||
rstr = res.get_message()
|
||||
|
||||
if not res.alone:
|
||||
if isinstance(res, Response):
|
||||
if res.server not in SERVERS:
|
||||
SERVERS[res.server] = dict()
|
||||
for receiver in res.receivers:
|
||||
SERVERS[res.server][receiver] = res
|
||||
|
||||
ret = list()
|
||||
for channel in res.receivers:
|
||||
ret.append("%s %s :%s" % ("NOTICE" if res.is_ctcp else "PRIVMSG", channel, rstr))
|
||||
return ret
|
||||
if receiver in SERVERS[res.server]:
|
||||
nw, bk = SERVERS[res.server][receiver]
|
||||
else:
|
||||
nw, bk = None, None
|
||||
if nw != res:
|
||||
SERVERS[res.server][receiver] = (res, bk)
|
||||
return res
|
||||
|
||||
|
||||
@hook("cmd_hook", "more")
|
||||
|
|
@ -228,9 +220,13 @@ def cmd_more(msg):
|
|||
"""Display next chunck of the message"""
|
||||
res = list()
|
||||
if msg.server in SERVERS:
|
||||
for receiver in msg.receivers:
|
||||
for receiver in msg.to_response:
|
||||
if receiver in SERVERS[msg.server]:
|
||||
res.append(SERVERS[msg.server][receiver])
|
||||
nw, bk = SERVERS[msg.server][receiver]
|
||||
if nw is not None and not nw.alone:
|
||||
bk = nw
|
||||
SERVERS[msg.server][receiver] = None, bk
|
||||
res.append(bk)
|
||||
return res
|
||||
|
||||
|
||||
|
|
@ -239,8 +235,12 @@ def cmd_next(msg):
|
|||
"""Display the next information include in the message"""
|
||||
res = list()
|
||||
if msg.server in SERVERS:
|
||||
for receiver in msg.receivers:
|
||||
for receiver in msg.to_response:
|
||||
if receiver in SERVERS[msg.server]:
|
||||
SERVERS[msg.server][receiver].pop()
|
||||
res.append(SERVERS[msg.server][receiver])
|
||||
nw, bk = SERVERS[msg.server][receiver]
|
||||
if nw is not None and not nw.alone:
|
||||
bk = nw
|
||||
SERVERS[msg.server][receiver] = None, bk
|
||||
bk.pop()
|
||||
res.append(bk)
|
||||
return res
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ def del_site(msg):
|
|||
site = DATAS.index[url]
|
||||
for a in site.getNodes("alert"):
|
||||
if a["channel"] == msg.channel:
|
||||
if not (msg.sender == a["sender"] or msg.is_owner):
|
||||
if not (msg.frm == a["nick"] or msg.is_owner):
|
||||
raise IRCException("vous ne pouvez pas supprimer cette URL.")
|
||||
site.delChild(a)
|
||||
if not site.hasNode("alert"):
|
||||
|
|
@ -82,7 +82,7 @@ def add_site(msg, diffType="diff"):
|
|||
raise IRCException("je ne peux pas surveiller cette URL")
|
||||
|
||||
alert = ModuleState("alert")
|
||||
alert["sender"] = msg.sender
|
||||
alert["nick"] = msg.nick
|
||||
alert["server"] = msg.server
|
||||
alert["channel"] = msg.channel
|
||||
alert["message"] = "{url} a changé !"
|
||||
|
|
|
|||
|
|
@ -31,7 +31,6 @@ def start_watch(msg):
|
|||
w["server"] = msg.server
|
||||
w["channel"] = msg.channel
|
||||
w["proprio"] = msg.nick
|
||||
w["sender"] = msg.sender
|
||||
w["start"] = datetime.now(timezone.utc)
|
||||
DATAS.addChild(w)
|
||||
save()
|
||||
|
|
|
|||
|
|
@ -8,11 +8,10 @@ from urllib.parse import quote
|
|||
from urllib.request import urlopen
|
||||
|
||||
from hooks import hook
|
||||
from message import TextMessage
|
||||
|
||||
nemubotversion = 3.4
|
||||
|
||||
from more import Response
|
||||
|
||||
def help_full():
|
||||
return "!ycc [<url>]: with an argument, reduce the given <url> thanks to ycc.fr; without argument, reduce the last URL said on the current channel."
|
||||
|
||||
|
|
@ -22,24 +21,28 @@ def gen_response(res, msg, srv):
|
|||
if res is None:
|
||||
raise IRCException("la situation est embarassante, il semblerait que YCC soit down :(")
|
||||
elif isinstance(res, str):
|
||||
return Response("URL pour %s : %s" % (srv, res), msg.channel)
|
||||
return TextMessage("URL pour %s : %s" % (srv, res), server=None, to=msg.to_response)
|
||||
else:
|
||||
raise IRCException("mauvaise URL : %s" % srv)
|
||||
|
||||
@hook("cmd_hook", "ycc")
|
||||
def cmd_ycc(msg):
|
||||
minify = list()
|
||||
|
||||
if len(msg.cmds) == 1:
|
||||
global LAST_URLS
|
||||
if msg.channel in LAST_URLS and len(LAST_URLS[msg.channel]) > 0:
|
||||
msg.cmds.append(LAST_URLS[msg.channel].pop())
|
||||
minify.append(LAST_URLS[msg.channel].pop())
|
||||
else:
|
||||
raise IRCException("je n'ai pas d'autre URL à réduire.")
|
||||
|
||||
if len(msg.cmds) > 5:
|
||||
raise IRCException("je ne peux pas réduire autant d'URL d'un seul coup.")
|
||||
else:
|
||||
minify += msg.cmds[1:]
|
||||
|
||||
res = list()
|
||||
for url in msg.cmds[1:]:
|
||||
for url in minify:
|
||||
o = urlparse(url, "http")
|
||||
if o.scheme != "":
|
||||
snd_url = "http://ycc.fr/redirection/create/" + quote(url, "/:%@&=?")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue