diff --git a/ircbot/ircbot.py b/ircbot/ircbot.py index 1b19285..b33a62c 100644 --- a/ircbot/ircbot.py +++ b/ircbot/ircbot.py @@ -128,6 +128,8 @@ def __init__( self.plugins = {} self.extra_channels = set() # plugins can add stuff here + self.sendmsg_lock = threading.Lock() + # Register plugins before joining the server. self.register_plugins() @@ -249,28 +251,33 @@ def on_invite(self, connection, event): return ircbot.plugin.channels.on_invite(self, connection, event) def bump_topic(self): - for channel, topic in self.topics.items(): - def plusone(m): - return '{}: {}'.format(m.group(1), int(m.group(2)) + 1) + with self.sendmsg_lock: + for channel, topic in self.topics.items(): + def plusone(m): + return '{}: {}'.format(m.group(1), int(m.group(2)) + 1) - new_topic = re.sub(r'(days since.*?): (\d+)', plusone, topic) - if topic != new_topic: - self.connection.topic(channel, new_topic=new_topic) + new_topic = re.sub(r'(days since.*?): (\d+)', plusone, topic) + if topic != new_topic: + self.connection.topic(channel, new_topic=new_topic) def say(self, channel, message): - # Find the length of the full message - msg_len = len('PRIVMSG {} :{}\r\n'.format(channel, message).encode('utf-8')) - - # The message must be split up if over the length limit - if msg_len > MAX_CLIENT_MSG: - # Split up the full message into chunks to send - msg_range = range(0, len(message), MAX_CLIENT_MSG) - messages = [message[i:i + MAX_CLIENT_MSG] for i in msg_range] - - for msg in messages: - self.connection.privmsg(channel, msg) - else: - self.connection.privmsg(channel, message) + with self.sendmsg_lock: + # Find the length of the full message + msg_len = len('PRIVMSG {} :{}\r\n'.format( + channel, + message, + ).encode('utf-8')) + + # The message must be split up if over the length limit + if msg_len > MAX_CLIENT_MSG: + # Split up the full message into chunks to send + msg_range = range(0, len(message), MAX_CLIENT_MSG) + messages = [message[i:i + MAX_CLIENT_MSG] for i in msg_range] + + for msg in messages: + self.connection.privmsg(channel, msg) + else: + self.connection.privmsg(channel, message) def timer(bot): diff --git a/ircbot/plugin/channels.py b/ircbot/plugin/channels.py index 3b2ce96..1fac3c1 100644 --- a/ircbot/plugin/channels.py +++ b/ircbot/plugin/channels.py @@ -22,7 +22,8 @@ def join_channel(bot, channel): 'INSERT IGNORE INTO channels (channel) VALUES (%s)', (channel,), ) - bot.connection.join(channel) + with bot.sendmsg_lock: + bot.connection.join(channel) def on_invite(bot, conn, event):