aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar jesopo2019-02-10 20:49:59 +0000
committerGravatar jesopo2019-02-10 20:49:59 +0000
commitbb4ec082dd4df99d60e9ea6af8f688db443ec8d0 (patch)
treecc3b2c60f5c59e6a15ee3df28283a5a6285879cd
parentParse sent data in IRCServer._send, not IRCServer.send (diff)
signature
Let IRCLine.Line handle truncating command output
-rw-r--r--modules/commands/outs.py29
-rw-r--r--src/IRCLine.py26
-rw-r--r--src/IRCServer.py2
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