Discord.py如何实现触发指令后删除10秒内的全部频道消息?
King Crimson 指令实现方案
原代码存在的逻辑问题
purge方法参数用法错误:discord.py 中after、before筛选参数仅支持传入消息对象或者时间对象,直接传入数字10无法触发正常的消息筛选逻辑- 变量作用域错误:此前尝试的消息列表、技能状态标记均定义在指令函数内部,每次触发指令都会被重新初始化,无法承接指令触发后频道内产生的新消息
- 状态标记未和业务逻辑绑定:设置的
kc_ability状态值没有配套的消息收集逻辑对接,仅靠状态值无法支撑后续的批量删除操作
落地实现思路
无需手动维护全量消息收集列表,通过时间锚点配合purge方法即可完成需求:
- 指令触发瞬间,直接取触发指令的消息本身作为时间区间的起点锚点
- 立即删除这条触发指令的消息,避免其被纳入后续删除范围
- 保持10秒的时间跳跃等待窗口
- 等待时长结束后,将之前记录的锚点消息传入
purge的after参数,即可自动删除锚点之后、当前时刻之前的所有频道消息,精准覆盖10秒窗口内产生的全部内容
修正后的可运行代码
@commands.cooldown(rate=1,per=25,type=commands.BucketType.user) async def king_crimson(ctx): kingcrimson = discord.utils.get(ctx.guild.roles, id=817441099173199923) if kingcrimson in ctx.author.roles: # 记录指令触发时的消息作为删除范围锚点 trigger_msg = ctx.message # 清理触发指令本身 await trigger_msg.delete() kc_embed = discord.Embed(title="King Crimson activated!", colour=discord.Colour(0xb90d0d)) await ctx.author.send(embed=kc_embed) # 等待10秒时间跳跃窗口 await asyncio.sleep(10) kc_embed2 = discord.Embed(title="Time has skipped!", colour=discord.Colour(0xb90d0d)) await ctx.author.send(embed=kc_embed2) # 以锚点为起点删除区间内所有消息 await ctx.channel.purge(after=trigger_msg)
注意事项
- 采用消息对象作为purge锚点的精度高于直接传时间对象,不会因系统时间差出现漏删、多删的问题
- 执行purge操作的bot账号需要拥有对应频道的管理消息权限,否则操作会触发权限报错
内容的提问来源于stack exchange,提问作者Vampante
相关产品推荐
相关产品推荐

