diff --git a/src/bobbit/protocol/irc.py b/src/bobbit/protocol/irc.py index dfb5375..9069dd2 100644 --- a/src/bobbit/protocol/irc.py +++ b/src/bobbit/protocol/irc.py @@ -25,7 +25,11 @@ NICK_RE = re.compile(r':(?P.*?)!\S+\s+?NICK\s+(?P[^\s]+)') REGISTERED_RE = re.compile(r':NickServ!.*NOTICE.*:.*(identified|logged in|accepted).*') -MESSAGE_LENGTH_MAX = 512 - len(CRNL) +# NOTE: IRC message length limit is 512 bytes, but that includes the sender's hostmask +# since the hostmask can change during a session, the simplest way to ensure messages are under 512 bytes +# is to set a conservative maximum like 400 +# so few bobbit messages are that long that it shouldn't cost too many extra messages being sent +MESSAGE_LENGTH_MAX = 400 # IRC Client @@ -149,9 +153,10 @@ async def send_message(self, message): if isinstance(message, Message): message = self.format_message(message) - if len(message) > MESSAGE_LENGTH_MAX: + # NOTE: use str.encode() to determine length of message/command since IRC only cares about number of bytes + if len(message.encode()) > MESSAGE_LENGTH_MAX: command, message = message.split(' :', 1) - messages = [f'{command} :{m}' for m in textwrap.wrap(message, MESSAGE_LENGTH_MAX - len(command) - 2)] + messages = [f'{command} :{m}' for m in textwrap.wrap(message, MESSAGE_LENGTH_MAX - len(command.encode()) - 2)] else: messages = [message]