Disnake/DiscordPy中on_presence_update等事件重复触发的原因及解决方法
on_presence_update事件重复触发的原因与解决方法
原因分析
- 事件装饰器使用错误:你写的
@bot.event()带了括号,这会导致事件被重复注册。bot.event是装饰器函数,正确用法是不带括号直接使用@bot.event,带括号调用会生成额外的装饰器实例,最终让同一个事件被绑定多次,触发时就会执行多次。 - Discord网关重复推送(次要):少数情况下Discord网关可能重复发送状态更新数据包,但你提到其他事件也有重复触发问题,所以核心原因大概率是装饰器写法错误导致的重复注册。
解决方法
1. 修正装饰器写法
直接去掉bot.event后的括号,这是最直接的修复方式:
@bot.event async def on_presence_update(before, after): print('test')
2. 增加状态变更判断
即使事件注册正确,也可以在逻辑里加判断,只在状态确实变化时执行代码,过滤重复推送:
@bot.event async def on_presence_update(before, after): # 检查在线状态或用户活动是否真的发生变化 if before.status != after.status or before.activities != after.activities: print('状态已更新')
3. 类继承Bot的注意事项
如果是通过继承commands.Bot实现机器人,不要同时用装饰器和类内重写事件方法,避免重复绑定。类内事件的正确写法:
class MyBot(commands.Bot): async def on_presence_update(self, before, after): if before.status != after.status or before.activities != after.activities: print('状态已更新')
内容的提问来源于stack exchange,提问作者Xalwer
相关产品推荐
相关产品推荐

