You need to enable JavaScript to run this app. Discord.py通过on_raw_reaction_add触发删除Bot指定消息问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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消息的逻辑:

  1. 在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]
  1. 替换你原来写的错误删除逻辑,把原有代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 05:54:04