Skip to content

Commit

Permalink
Fix rate limit issue on raw reaction add/remove events. (modmail-dev#…
Browse files Browse the repository at this point in the history
…3306)

* Fix rate limit issue on raw reaction add/remove events.

* Pasd message object to `find_linked_messages` since it is already fetched.

---------

Co-authored-by: Taku <45324516+Taaku18@users.noreply.github.com>
  • Loading branch information
2 people authored and raidensakura committed Apr 10, 2024
1 parent fcc14a2 commit dfe504a
Showing 1 changed file with 25 additions and 15 deletions.
40 changes: 25 additions & 15 deletions bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -1222,33 +1222,44 @@ async def handle_reaction_events(self, payload):
return

channel = self.get_channel(payload.channel_id)
if not channel: # dm channel not in internal cache
_thread = await self.threads.find(recipient=user)
if not _thread:
thread = None
# dm channel not in internal cache
if not channel:
thread = await self.threads.find(recipient=user)
if not thread:
return
channel = await thread.recipient.create_dm()
if channel.id != payload.channel_id:
return

from_dm = isinstance(channel, discord.DMChannel)
from_txt = isinstance(channel, discord.TextChannel)
if not from_dm and not from_txt:
return

if not thread:
params = {"recipient": user} if from_dm else {"channel": channel}
thread = await self.threads.find(**params)
if not thread:
return
channel = await _thread.recipient.create_dm()

# thread must exist before doing this API call
try:
message = await channel.fetch_message(payload.message_id)
except (discord.NotFound, discord.Forbidden):
return

reaction = payload.emoji

close_emoji = await self.convert_emoji(self.config["close_emoji"])

if isinstance(channel, discord.DMChannel):
thread = await self.threads.find(recipient=user)
if not thread:
return
if from_dm:
if (
payload.event_type == "REACTION_ADD"
and message.embeds
and str(reaction) == str(close_emoji)
and self.config.get("recipient_thread_close")
):
ts = message.embeds[0].timestamp
if thread and ts == thread.channel.created_at:
if ts == thread.channel.created_at:
# the reacted message is the corresponding thread creation embed
# closing thread
return await thread.close(closer=user)
Expand All @@ -1268,11 +1279,10 @@ async def handle_reaction_events(self, payload):
logger.warning("Failed to find linked message for reactions: %s", e)
return
else:
thread = await self.threads.find(channel=channel)
if not thread:
return
try:
_, *linked_messages = await thread.find_linked_messages(message.id, either_direction=True)
_, *linked_messages = await thread.find_linked_messages(
message1=message, either_direction=True
)
except ValueError as e:
logger.warning("Failed to find linked message for reactions: %s", e)
return
Expand Down

0 comments on commit dfe504a

Please sign in to comment.