Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 3 commits into from
Nov 19, 2023
Merged
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
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
Loading