Skip to content
This repository was archived by the owner on Oct 2, 2024. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 26 additions & 19 deletions ircbot/ircbot.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand Down Expand Up @@ -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):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: would just make this a lambda

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
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we only really need to acquire the lock here. you aren't using the connection when getting the message length

if msg_len > MAX_CLIENT_MSG:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can't we just simplify this logic and remove the if statement? with python slices , if we are less than MAX_CLIENT_MSG we will just have an array of size 1.

Then we can simplify the logic further and only acquire the lock before the loop

# 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):
Expand Down
3 changes: 2 additions & 1 deletion ircbot/plugin/channels.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down