首页 > 解决方案 > discord py bot 触发两次 on_member_update 函数

问题描述

我正在用 Python 编写一个不和谐的机器人,但遇到了一个我目前无法修复的相当愚蠢的错误。该机器人应该通过允许用户注册基于昵称的字符来补充在线笔和纸 rpgs,这些字符可以滚动检查等。

如果玩家上线,机器人应该检查该玩家是否在其所有者键下的角色数据库中。如果是这种情况,机器人应该为用户分配一个特定的角色,这允许进一步的命令。出于持久性原因,在服务器(也就是我的机器)上为每个注册角色创建一个文件,并且一个用户可以拥有多个角色(因为我同时与同一个人玩多个活动)。您可以看到这是一长串根据在线、离线、昵称等自动分配和撤销角色的第一步。

我只为此编写了代码的基础,但遇到了一个令我困惑且似乎无法解决的问题。

我的代码:

# on_member_update the bot recognizes if someone comes online and their name shows up in the character database
# if so the bot should assign them the role "Spieler" on the server. Right now prints to console for testing.
@bot.event
async def on_member_update(before,after):
    if before.status == discord.Status.offline and str(after) in characters:
        print("Rollenwechsel!")
    else:
        print("Studenten verteilen Flugblätter. Nichts geschieht.")

如果我在我的电脑或笔记本电脑上运行它,它会在状态更改时触发两次,在昵称或角色等更改时触发一次。

如何停止双重触发?额外的问题:为什么要这样做?

提前致谢。

ps:如果需要,请询问更多代码。pps:我对编码很陌生。记在脑子里。ppps:如果其他地方已经回答了这个问题,我深表歉意。经过大约一个小时的激烈谷歌搜索后,我写了这篇文章。

标签: pythondiscord.py

解决方案


用户所在的每个公会都会触发 on member 更新。它会触发两次,因为您的机器人位于 2 个服务器中,并且它会检测每个服务器中用户的更新。它是同一个用户,但不是同一个成员。它不会在昵称或角色更改时触发两次,因为它们是特定于每个公会的。

您可以使用用户更新来避免这种情况: https ://discordpy.readthedocs.io/en/latest/api.html#discord.on_user_update

不幸的是,与 on_member_update 不同,on_user_update 不检查状态更新等。但是您可以使用它来检查公会中的昵称更改。


推荐阅读