# HG changeset patch # User Charly COSTE # Date 1259447628 -3600 # Node ID 0ae0f8836a7acc63ea56e1b7182c4e3e1c265a7a # Parent 787e97d624049c4a5fa1e5842f74b96379c5e0d8 split long messages when sending on IRC Signed-off-by: Charly COSTE diff --git a/bot.py b/bot.py --- a/bot.py +++ b/bot.py @@ -665,7 +665,7 @@ class bot(Thread): self.error('===> Debug: no bridge found for "'+event.target().lower()+' at '+connection.server+'"', debug=True) return for bridge in bridges: - bridge.addParticipant('irc', nickname) + bridge.addParticipant('irc', nickname, irc_id=event.source()) return diff --git a/bridge.py b/bridge.py --- a/bridge.py +++ b/bridge.py @@ -133,7 +133,7 @@ class bridge: self.stop(message='failed to connect to the XMPP room') - def addParticipant(self, from_protocol, nickname, real_jid=None): + def addParticipant(self, from_protocol, nickname, real_jid=None, irc_id=None): """Add a participant to the bridge.""" if (from_protocol == 'irc' and nickname == self.irc_connection.get_nickname()) or (from_protocol == 'xmpp' and nickname == self.xmpp_room.nickname): self.bot.error('===> Debug: not adding self ('+self.bot.nickname+') to bridge "'+str(self)+'"', debug=True) @@ -142,6 +142,8 @@ class bridge: p = self.getParticipant(nickname) if p.protocol != from_protocol: if from_protocol == 'irc' and isinstance(p.irc_connection, ServerConnection) and p.irc_connection.really_connected == True or from_protocol == 'xmpp' and isinstance(p.xmpp_c, xmpp.client.Client) and isinstance(p.muc, xmpp.muc): + if irc_id: + p.irc_connection.irc_id = irc_id return self.bot.error('===> Debug: "'+nickname+'" is on both sides of bridge "'+str(self)+'"', debug=True) self.say('[Warning] The nickname "'+nickname+'" is used on both sides of the bridge, please avoid that if possible') diff --git a/irclib.py b/irclib.py --- a/irclib.py +++ b/irclib.py @@ -71,6 +71,7 @@ import time import types import threading import traceback +import math VERSION = 0, 4, 8 DEBUG = 0 @@ -456,6 +457,7 @@ class ServerConnection(Connection): self.nick_callbacks = [] + self.irc_id = None self.previous_buffer = "" self.handlers = {} self.real_server_name = "" @@ -852,15 +854,21 @@ class ServerConnection(Connection): def privmsg(self, target, text): """Send a PRIVMSG command.""" - # Should limit len(text) here! for l in text.split('\n'): - self.send_raw("PRIVMSG %s :%s" % (target, l)) + l_size = len(l.encode('utf-8')) + available_size = float(510-len('%s PRIVMSG %s :' % (self.irc_id, target))) # 510 is the size limit for IRC messages defined in RFC 2812 + e = 0 + for i in range(math.ceil(l_size/available_size)): + s = e + e = s+int(available_size) + while len(l[s:e].encode('utf-8')) >= available_size: + e -= 1 + self.send_raw("PRIVMSG %s :%s" % (target, l[s:e])) def privmsg_many(self, targets, text): """Send a PRIVMSG command to multiple targets.""" - # Should limit len(text) here! - for l in text.split('\n'): - self.send_raw("PRIVMSG %s :%s" % (",".join(targets), l)) + # Size of targets should be limited + self.privmsg(','.join(targets), text) def quit(self, message=""): """Send a QUIT command."""