Slash命令隐藏消息场景下wait_for_component组件监听失效问题
问题产生原因
- 调用
hidden=True参数发送的是Discord的临时(Ephemeral)消息,这类消息仅对目标用户可见,不会在Discord服务端持久化存储,也不会同步到库的消息缓存池中。 wait_for_component方法默认会校验触发事件的组件所属消息是否在库的缓存中、是否和传入的components绑定的消息匹配,临时消息因为不存在于缓存,校验不通过,因此直接返回None,导致监听失败。- 移除
hidden=True后发送的是普通公开消息,会正常进入消息缓存,校验通过,因此功能正常。
可行解决方案
方案1:通过自定义custom_id+校验规则监听(改造成本最低)
不需要修改发送逻辑的hidden参数,仅需要给按钮添加唯一标识的custom_id,同时给wait_for_component添加自定义校验函数,跳过消息绑定校验即可:
# 创建按钮时手动指定带用户标识的custom_id lis = [create_button(style=ButtonStyle.blue, label=f"{card}", custom_id=f"card_{ctx.author.id}_{idx}") for idx, card in enumerate(self._player_cards[ctx.guild.id][ctx.author])] action_row = spread_to_rows(*lis) await ctx.send(embed=embed, components=action_row, hidden = True ) # 自定义校验规则:仅允许目标用户触发前缀匹配的按钮 def check(inter: ComponentContext): return inter.author.id == ctx.author.id and inter.custom_id.startswith(f"card_{ctx.author.id}_") while True: button_ctx: ComponentContext = await wait_for_component(self.client, check=check) print(button_ctx.component)
方案2:升级Discord库到最新稳定版
目前Pycord、Nextcord等主流Discord二次开发库的最新版本已经适配了临时消息的组件监听逻辑,升级库版本后原有代码无需修改即可正常运行。
方案3:替换为私信发送私有内容
如果不需要在当前频道展示交互入口,可以改为直接给用户发送私信,私信消息属于普通持久化消息,原有监听逻辑完全不需要修改,同时也能保证内容仅用户可见。
内容的提问来源于stack exchange,提问作者nuda
相关产品推荐
相关产品推荐

