From 6c5dc958d037907d98dd6edbc4e37f5ac39768ac Mon Sep 17 00:00:00 2001 From: jesopo Date: Mon, 10 Jun 2019 10:45:02 +0100 Subject: [PATCH] Add `.assure()` to ParsedLine, to make it immune from `.valid()` --- modules/commands/outs.py | 27 ++++++++++++++++++--------- src/IRCLine.py | 6 ++++++ src/IRCServer.py | 4 ++-- src/utils/irc/protocol.py | 2 +- 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/modules/commands/outs.py b/modules/commands/outs.py index 7df60436..7ed49cd6 100644 --- a/modules/commands/outs.py +++ b/modules/commands/outs.py @@ -14,6 +14,10 @@ class Out(object): self._text = "" self.written = False self._tags = tags + self._assured = False + + def assure(self): + self._assured = True def write(self, text): self._text += text @@ -27,20 +31,25 @@ class Out(object): prefix = utils.consts.RESET + "[%s] " % self.prefix() full_text = "%s%s" % (prefix, self._text) + line_factory = None if method == "PRIVMSG": - line = self.server.send_message(self._target_str, full_text, - tags=self._tags) + line_factory = utils.irc.protocol.privmsg elif method == "NOTICE": - line = self.server.send_notice(self._target_str, full_text, - tags=self._tags) + line_factory = utils.irc.protocol.notice else: raise ValueError("Unknown command method '%s'" % method) - line.truncate_marker = STR_MORE - if line.truncated(): - self._text = "%s%s" % (STR_CONTINUED, line.truncated()) - else: - self._text = "" + line = line_factory(self._target_str, full_text, tags=self._tags) + if self._assured: + line.assure() + sent_line = self.server.send(line) + + if sent_line: + line.truncate_marker = STR_MORE + if line.truncated(): + self._text = "%s%s" % (STR_CONTINUED, line.truncated()) + else: + self._text = "" def set_prefix(self, prefix): self.module_name = prefix diff --git a/src/IRCLine.py b/src/IRCLine.py index 9e1d85fb..c0263d20 100644 --- a/src/IRCLine.py +++ b/src/IRCLine.py @@ -47,6 +47,7 @@ class ParsedLine(object): self.source = source self.tags = {} if tags == None else tags self._valid = True + self._assured = False def __repr__(self): return "ParsedLine(%s)" % self.__str__() @@ -58,6 +59,11 @@ class ParsedLine(object): def invalidate(self): self._valid = False + def assured(self) -> bool: + return self._assured + def assure(self): + self._assured = True + def _tag_str(self, tags: typing.Dict[str, str]) -> str: tag_pieces = [] for tag, value in tags.items(): diff --git a/src/IRCServer.py b/src/IRCServer.py index a5c4c34c..debe8f76 100644 --- a/src/IRCServer.py +++ b/src/IRCServer.py @@ -268,7 +268,7 @@ class Server(IRCObject.Object): self.events.on("preprocess.send").call_unsafe(server=self, line=line_parsed, events=line_events) - if line_parsed.valid(): + if line_parsed.valid() or line_parsed.assured(): line = line_parsed.format() line_obj = IRCLine.SentLine(line_events, datetime.datetime.utcnow(), self.hostmask(), line_parsed) @@ -352,7 +352,7 @@ class Server(IRCObject.Object): def send_message(self, target: str, message: str, tags: dict={} ) -> IRCLine.SentLine: - return self.send(utils.irc.protocol.message(target, message, tags)) + return self.send(utils.irc.protocol.privmsg(target, message, tags)) def send_notice(self, target: str, message: str, tags: dict={} ) -> IRCLine.SentLine: diff --git a/src/utils/irc/protocol.py b/src/utils/irc/protocol.py index 0ccf684f..66b4028c 100644 --- a/src/utils/irc/protocol.py +++ b/src/utils/irc/protocol.py @@ -33,7 +33,7 @@ def part(channel_name: str, reason: str=None) -> IRCLine.ParsedLine: def quit(reason: str=None) -> IRCLine.ParsedLine: return IRCLine.ParsedLine("QUIT", [reason] if reason else []) -def message(target: str, message: str, tags: typing.Dict[str, str]={} +def privmsg(target: str, message: str, tags: typing.Dict[str, str]={} ) -> IRCLine.ParsedLine: return IRCLine.ParsedLine("PRIVMSG", [target, message], tags=tags) def notice(target: str, message: str, tags: typing.Dict[str, str]={}