diff options
| author | 2019-02-10 20:49:59 +0000 | |
|---|---|---|
| committer | 2019-02-10 20:49:59 +0000 | |
| commit | bb4ec082dd4df99d60e9ea6af8f688db443ec8d0 (patch) | |
| tree | cc3b2c60f5c59e6a15ee3df28283a5a6285879cd | |
| parent | Parse sent data in IRCServer._send, not IRCServer.send (diff) | |
| signature | ||
Let IRCLine.Line handle truncating command output
| -rw-r--r-- | modules/commands/outs.py | 29 | ||||
| -rw-r--r-- | src/IRCLine.py | 26 | ||||
| -rw-r--r-- | src/IRCServer.py | 2 |
3 files changed, 34 insertions, 23 deletions
diff --git a/modules/commands/outs.py b/modules/commands/outs.py index 8e90f5e8..342c7f36 100644 --- a/modules/commands/outs.py +++ b/modules/commands/outs.py @@ -1,10 +1,7 @@ import re from src import utils -OUT_CUTOFF = 400 -REGEX_CUTOFF = re.compile(r"^.{1,%d}(?:\s|$)" % OUT_CUTOFF) - -STR_MORE = "%s (more...)" % utils.consts.RESET +STR_MORE = " (more...)" STR_CONTINUED = "(...continued) " class Out(object): @@ -25,17 +22,6 @@ class Out(object): def send(self, method): if self.has_text(): - text = self._text - text_encoded = text.encode("utf8") - if len(text_encoded) > OUT_CUTOFF: - text = "%s%s" % (text_encoded[:OUT_CUTOFF].decode("utf8" - ).rstrip(), STR_MORE) - self._text = "%s%s" % (STR_CONTINUED, text_encoded[OUT_CUTOFF: - ].decode("utf8").lstrip()) - else: - self._text = "" - - tags = {} if self._msgid: tags["+draft/reply"] = self._msgid @@ -45,11 +31,18 @@ class Out(object): prefix = utils.consts.RESET + "[%s] " % self.prefix() target_str = "%s%s" % (self._statusmsg, self.target.name) - full_text = "%s%s" % (prefix, text) + full_text = "%s%s" % (prefix, self._text) if method == "PRIVMSG": - self.server.send_message(target_str, full_text, tags=tags) + line = self.server.send_message(target_str, full_text, + tags=tags) elif method == "NOTICE": - self.server.send_notice(target_str, full_text, tags=tags) + line = self.server.send_notice(target_str, full_text, tags=tags) + else: + raise ValuError("Unknown command methd '%s'" % method) + + if line.truncated(): + line.end_replace(STR_MORE) + self._text = "%s%s" % (STR_CONTINUED, line.truncated()) def set_prefix(self, prefix): self.module_name = prefix diff --git a/src/IRCLine.py b/src/IRCLine.py index e5a58707..6aba7ed6 100644 --- a/src/IRCLine.py +++ b/src/IRCLine.py @@ -4,11 +4,14 @@ from src import IRCObject, utils LINE_CUTOFF = 450 class Line(IRCObject.Object): - def __init__(self, send_time: datetime.datetime, line: str): + def __init__(self, server: "IRCServer.Server", send_time: datetime.datetime, + line: str): + self.server = server self._line = line self.send_time = send_time - data, truncated = utils.encode_truncate(line, "utf8", LINE_CUTOFF) + data, truncated = utils.encode_truncate(line, "utf8", + self._char_limit()) self._data = data self._truncated = truncated @@ -20,11 +23,26 @@ class Line(IRCObject.Object): def __str__(self) -> str: return self._data + def _char_limit(self): + return LINE_CUTOFF-len(":%s " % self.server.hostmask()) + + def data(self) -> bytes: + return b"%s\r\n" % self._data + def decoded_data(self) -> bytes: + return self._data.decode("utf8") + def truncated(self) -> str: + return self._truncated + def on_send(self, func: typing.Callable[[], None]): self._on_send.append(func) def sent(self): for func in self._on_send[:]: func() - def data(self) -> bytes: - return b"%s\r\n" % self._data + def end_replace(self, s: str): + s_encoded = s.encode("utf8") + s_len = len(s_encoded) + + removed = self._data[-s_len:].decode("utf8") + self._truncated = removed+self._truncated + self._data = self._data[:-s_len]+s_encoded diff --git a/src/IRCServer.py b/src/IRCServer.py index ba2db432..a13eb9f2 100644 --- a/src/IRCServer.py +++ b/src/IRCServer.py @@ -316,7 +316,7 @@ class Server(IRCObject.Object): break line_stripped = line.split("\n", 1)[0].strip("\r") - line_obj = IRCLine.Line(datetime.datetime.utcnow(), line_stripped) + line_obj = IRCLine.Line(self, datetime.datetime.utcnow(), line_stripped) self.queued_lines.append(line_obj) return line_obj |
