Better support for msgtags with PRIVMSGs; put functionality in to

modules/commands.py to reply to specific messages by use of msgids
This commit is contained in:
jesopo 2018-10-01 17:26:31 +01:00
parent 3201f198da
commit 976b6ae335
6 changed files with 43 additions and 18 deletions

View file

@ -9,15 +9,18 @@ OUT_CUTOFF = 400
REGEX_CUTOFF = re.compile("^.{1,%d}(?:\s|$)" % OUT_CUTOFF) REGEX_CUTOFF = re.compile("^.{1,%d}(?:\s|$)" % OUT_CUTOFF)
class Out(object): class Out(object):
def __init__(self, module_name, target): def __init__(self, module_name, target, msgid):
self.module_name = module_name self.module_name = module_name
self.target = target self.target = target
self._text = "" self._text = ""
self.written = False self.written = False
self._msgid = None
def write(self, text): def write(self, text):
self._text += text self._text += text
self.written = True self.written = True
return self return self
def send(self): def send(self):
if self.has_text(): if self.has_text():
text = self._text text = self._text
@ -29,10 +32,17 @@ class Out(object):
].decode("utf8").lstrip()) ].decode("utf8").lstrip())
else: else:
self._text = "" self._text = ""
self.target.send_message(text, prefix=Utils.FONT_RESET + "[%s] " %
self.prefix()) tags = {}
if self._msgid:
tags["reply"] = self._msgid
self.target.send_message(text,
prefix=Utils.FONT_RESET + "[%s] " % self.prefix(), tags=tags)
def set_prefix(self, prefix): def set_prefix(self, prefix):
self.module_name = prefix self.module_name = prefix
def has_text(self): def has_text(self):
return bool(self._text) return bool(self._text)
@ -93,8 +103,10 @@ class Module(ModuleManager.BaseModule):
module_name = "" module_name = ""
if hasattr(hook.function, "__self__"): if hasattr(hook.function, "__self__"):
module_name = hook.function.__self__._name module_name = hook.function.__self__._name
stdout, stderr = StdOut(module_name, target), StdErr(module_name,
target) msgid = event["tags"].get("msgid", None)
stdout = StdOut(module_name, target, msgid)
stderr = StdErr(module_name, target, msgid)
returns = self.events.on("preprocess.command").call_unsafe( returns = self.events.on("preprocess.command").call_unsafe(
hook=hook, user=event["user"], server=event["server"], hook=hook, user=event["user"], server=event["server"],

View file

@ -414,11 +414,12 @@ class Module(ModuleManager.BaseModule):
channel = event["server"].get_channel(event["args"][0]) channel = event["server"].get_channel(event["args"][0])
self.events.on("received.message.channel").call( self.events.on("received.message.channel").call(
user=user, channel=channel, **kwargs) user=user, channel=channel, **kwargs)
channel.buffer.add_line(user.nickname, message, action) channel.buffer.add_line(user.nickname, message, action,
event["tags"])
elif event["server"].is_own_nickname(target): elif event["server"].is_own_nickname(target):
self.events.on("received.message.private").call( self.events.on("received.message.private").call(
user=user, **kwargs) user=user, **kwargs)
user.buffer.add_line(user.nickname, message, action) user.buffer.add_line(user.nickname, message, action, event["tags"])
# we've received a notice # we've received a notice
@Utils.hook("raw.notice") @Utils.hook("raw.notice")

View file

@ -2,10 +2,11 @@ import re
from . import Utils from . import Utils
class BufferLine(object): class BufferLine(object):
def __init__(self, sender, message, action, from_self): def __init__(self, sender, message, action, tags, from_self):
self.sender = sender self.sender = sender
self.message = message self.message = message
self.action = action self.action = action
self.tags = tags
self.from_self = from_self self.from_self = from_self
class Buffer(object): class Buffer(object):
@ -15,9 +16,9 @@ class Buffer(object):
self.lines = [] self.lines = []
self.max_lines = 64 self.max_lines = 64
self._skip_next = False self._skip_next = False
def add_line(self, sender, message, action, from_self=False): def add_line(self, sender, message, action, tags, from_self=False):
if not self._skip_next: if not self._skip_next:
line = BufferLine(sender, message, action, from_self) line = BufferLine(sender, message, action, tags, from_self)
self.lines.insert(0, line) self.lines.insert(0, line)
if len(self.lines) > self.max_lines: if len(self.lines) > self.max_lines:
self.lines.pop() self.lines.pop()

View file

@ -105,8 +105,8 @@ class Channel(IRCObject.Object):
return self.bot.database.user_channel_settings.find_all_by_setting( return self.bot.database.user_channel_settings.find_all_by_setting(
self.id, setting, default) self.id, setting, default)
def send_message(self, text, prefix=None): def send_message(self, text, prefix=None, tags={}):
self.server.send_message(self.name, text, prefix=prefix) self.server.send_message(self.name, text, prefix=prefix, tags=tags)
def send_mode(self, mode=None, target=None): def send_mode(self, mode=None, target=None):
self.server.send_mode(self.name, mode, target) self.server.send_mode(self.name, mode, target)
def send_kick(self, target, reason=None): def send_kick(self, target, reason=None):

View file

@ -351,9 +351,19 @@ class Server(IRCObject.Object):
def send_quit(self, reason="Leaving"): def send_quit(self, reason="Leaving"):
self.send("QUIT :%s" % reason) self.send("QUIT :%s" % reason)
def send_message(self, target, message, prefix=None): def send_message(self, target, message, prefix=None, tags={}):
tag_str = ""
for tag, value in tags.items():
if tag_str:
tag_str += ","
tag_str += tag
if value:
tag_str += "=%s" % value
if tag_str:
tag_str = "@%s " % tag_str
full_message = message if not prefix else prefix+message full_message = message if not prefix else prefix+message
self.send("PRIVMSG %s :%s" % (target, full_message)) self.send("%sPRIVMSG %s :%s" % (tag_str, target, full_message))
action = full_message.startswith("\01ACTION " action = full_message.startswith("\01ACTION "
) and full_message.endswith("\01") ) and full_message.endswith("\01")
@ -364,13 +374,13 @@ class Server(IRCObject.Object):
full_message_split = full_message.split() full_message_split = full_message.split()
if self.has_channel(target): if self.has_channel(target):
channel = self.get_channel(target) channel = self.get_channel(target)
channel.buffer.add_line(None, message, action, True) channel.buffer.add_line(None, message, action, tags, True)
self.events.on("self.message.channel").call( self.events.on("self.message.channel").call(
message=full_message, message_split=full_message_split, message=full_message, message_split=full_message_split,
channel=channel, action=action, server=self) channel=channel, action=action, server=self)
else: else:
user = self.get_user(target) user = self.get_user(target)
user.buffer.add_line(None, message, action, True) user.buffer.add_line(None, message, action, tags, True)
self.events.on("self.message.private").call( self.events.on("self.message.private").call(
message=full_message, message_split=full_message_split, message=full_message, message_split=full_message_split,
user=user, action=action, server=self) user=user, action=action, server=self)

View file

@ -56,8 +56,9 @@ class User(IRCObject.Object):
return self.bot.database.user_channel_settings.find_by_setting( return self.bot.database.user_channel_settings.find_by_setting(
self.get_id(), setting, default) self.get_id(), setting, default)
def send_message(self, message, prefix=None): def send_message(self, message, prefix=None, tags={}):
self.server.send_message(self.nickname, message, prefix=prefix) self.server.send_message(self.nickname, message, prefix=prefix,
tags=tags)
def send_notice(self, message): def send_notice(self, message):
self.server.send_notice(self.nickname, message) self.server.send_notice(self.nickname, message)
def send_ctcp_response(self, command, args): def send_ctcp_response(self, command, args):