Skip to content

Commit d0f03a4

Browse files
committed
discord: Use on_raw_reaction_add to avoid missing events for messages that aren't cached
1 parent 6f4c819 commit d0f03a4

3 files changed

Lines changed: 41 additions & 15 deletions

File tree

chat_bridge/discord.py

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from pypeul import Tags
77

8-
from discord import Client, Intents, TextChannel, MessageType
8+
from discord import Client, Intents, TextChannel, MessageType, NotFound
99

1010
import asyncio
1111
import logging
@@ -42,11 +42,36 @@ async def on_raw_message_edit(self, payload):
4242
evt = events.DiscordMessageEdit(payload.message, self.user)
4343
events.dispatcher.dispatch("discord", evt)
4444

45-
async def on_reaction_add(self, reaction, user):
46-
if reaction.message.channel.id != self.cfg.channel:
45+
async def on_raw_reaction_add(self, payload):
46+
if payload.channel_id != self.cfg.channel:
4747
return
4848

49-
evt = events.DiscordReactionAdd(reaction, user, self.user)
49+
channel = self.get_channel(payload.channel_id)
50+
if not channel:
51+
logging.error(
52+
"Channel %s not found in on_raw_reaction_add", payload.channel_id
53+
)
54+
return
55+
56+
try:
57+
message = await channel.fetch_message(payload.message_id)
58+
except NotFound:
59+
logging.error(
60+
"Message %s not found in on_raw_reaction_add", payload.message_id
61+
)
62+
return
63+
64+
user = payload.member
65+
if not user:
66+
try:
67+
user = await self.fetch_user(payload.user_id)
68+
except NotFound:
69+
logging.error(
70+
"User %s not found in on_raw_reaction_add", payload.user_id
71+
)
72+
return
73+
74+
evt = events.DiscordReactionAdd(message, payload.emoji, user, self.user)
5075
events.dispatcher.dispatch("discord", evt)
5176

5277
def format_irc_message(self, msg):

chat_bridge/events.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ def DiscordMessageEdit(msg: discord.Message, bot_user: discord.User):
9191

9292
@event("discord_reaction_add")
9393
def DiscordReactionAdd(
94-
reaction: discord.Reaction, user: discord.User, bot_user: discord.User
94+
message: discord.Message,
95+
emoji: discord.PartialEmoji,
96+
user: discord.User,
97+
bot_user: discord.User,
9598
):
96-
return {"reaction": reaction, "user": user, "bot_user": bot_user}
99+
return {"message": message, "emoji": emoji, "user": user, "bot_user": bot_user}

chat_bridge/ircclient.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -188,18 +188,16 @@ def emoji_replacement_callback(match):
188188
for sticker in msg.stickers:
189189
self.message(self.cfg.channel, 'Sticker - "%s"' % sticker.name)
190190

191-
def relay_discord_reaction_add(self, reaction, user, bot_user):
192-
if isinstance(reaction.emoji, str):
193-
emoji = reaction.emoji
191+
def relay_discord_reaction_add(self, message, emoji, user, bot_user):
192+
if emoji.is_custom_emoji():
193+
emoji_text = "custom emoji %s" % emoji.name
194194
else:
195-
emoji = "custom emoji %s" % reaction.emoji.name
195+
emoji_text = emoji.name
196196

197197
text = "%s reacted with %s to a message by %s" % (
198198
Tags.Bold(self.sanitize_name(user.name)),
199-
emoji,
200-
Tags.Bold(
201-
self.extract_sender_from_discord_message(reaction.message, bot_user)
202-
),
199+
emoji_text,
200+
Tags.Bold(self.extract_sender_from_discord_message(message, bot_user)),
203201
)
204202
self.message(self.cfg.channel, text)
205203

@@ -243,7 +241,7 @@ def run(self):
243241
self.bot.relay_discord_message(evt.msg, evt.bot_user, edited=True)
244242
elif evt.type == events.DiscordReactionAdd.TYPE:
245243
self.bot.relay_discord_reaction_add(
246-
evt.reaction, evt.user, evt.bot_user
244+
evt.message, evt.emoji, evt.user, evt.bot_user
247245
)
248246
else:
249247
logging.error("Got unknown event for irc: %r" % evt.type)

0 commit comments

Comments
 (0)