python - 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:如果其他地方已经回答了这个问题,我深表歉意。经过大约一个小时的激烈谷歌搜索后,我写了这篇文章。
解决方案
用户所在的每个公会都会触发 on member 更新。它会触发两次,因为您的机器人位于 2 个服务器中,并且它会检测每个服务器中用户的更新。它是同一个用户,但不是同一个成员。它不会在昵称或角色更改时触发两次,因为它们是特定于每个公会的。
您可以使用用户更新来避免这种情况: https ://discordpy.readthedocs.io/en/latest/api.html#discord.on_user_update
不幸的是,与 on_member_update 不同,on_user_update 不检查状态更新等。但是您可以使用它来检查公会中的昵称更改。
推荐阅读
- php - PHP - 无法移动文件
- owl - 有没有办法根据多个断言的 DataProperties 推断两个实例的等价性
- latex - 如何将两个不同数字的方程放在一行中?
- reactjs - JSDoc 在使用 webpack 开发服务器的 Lerna monorepo 项目中的本地包中不起作用,但在发布到包注册表时起作用
- apache - 为每个页面重写 url 中的 get 参数
- python - 有没有办法在浏览器中预览 pdf/image 文件?
- reactjs - 使用 props 覆盖 React 组件的基本样式
- linux - Cassandra-i 能够通过 sudo 命令连接但无法通过 cqlsh 连接
- vb.net - Vb.net,实例化一个类
- android - 如何修复:无法启动服务 Intent - RNPushNotificationRegistrationService