Add .assure() to ParsedLine, to make it immune from .valid()

This commit is contained in:
jesopo 2019-06-10 10:45:02 +01:00
parent 0fc03fd592
commit 6c5dc958d0
4 changed files with 27 additions and 12 deletions

View file

@ -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

View file

@ -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():

View file

@ -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:

View file

@ -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]={}