Discord.py通过on_raw_reaction_add触发删除Bot指定消息问题求助
问题根源
你在on_raw_reaction_add监听事件中获取的message是用户添加反应的embed对战消息,而你要删除的<@&857916481747943434> A vos golds !是同频道下的另一条独立消息,二者是完全不同的两个消息对象,你用embed消息的content去匹配ping通知的内容,永远不会成立,所以删除逻辑无法触发。
解决方案
我们通过建立embed对战消息和ping通知消息的关联映射,就可以在触发反应时精准找到要删除的ping消息,修改步骤如下:
步骤1:给Cog添加关联存储字典
在Casino类的初始化方法中新增字典,用于存储embed消息ID和对应ping消息的映射:
class Casino(commands.Cog): def __init__(self, bot): self.bot = bot # key为embed对战消息的ID,value为对应的ping通知消息对象 self.casino_ping_map = {}
步骤2:修改casino命令,存储关联
将casino命令末尾发送ping消息的代码修改为:
# 保存返回的ping消息对象 ping_msg = await ctx.send("<@&857916481747943434> A vos golds !") # 建立embed消息和ping消息的关联 self.casino_ping_map[message.id] = ping_msg
步骤3:两处添加删除逻辑
分别在取消对战和对战结算完成的位置添加删除ping消息的逻辑:
- 在
deny反应的处理逻辑中,修改embed为「Défi annulé」后新增:
# 删除对应ping通知 if message.id in self.casino_ping_map: await self.casino_ping_map[message.id].delete() del self.casino_ping_map[message.id]
- 替换你原来写的错误删除逻辑,把原有代码:
if (message != None) and (message.content == "<@&857916481747943434> A vos golds !"): await message.delete()
替换为:
# 对战完成后删除对应ping通知 if message.id in self.casino_ping_map: await self.casino_ping_map[message.id].delete() del self.casino_ping_map[message.id]
补充说明
如果你的机器人需要支持重启后仍能处理历史对战的ping消息删除,可以将关联映射存储到本地JSON文件或者轻量数据库中,普通场景下内存字典即可满足需求。
内容的提问来源于stack exchange,提问作者Sylàn
相关产品推荐
相关产品推荐

