正在寻找一些我在Python中遇到的问题的帮助,我正在为我的discord机器人编写一段代码,以检测某人何时具有Activity_type = discord.ActivityType.streaming并自动给他们一个角色,还可以检测它们何时不再流式传输并删除该角色。
我目前没有任何错误,只是一个很大的错误。由于某些原因,它对某些用户有效,但是当用户实际流式传输时,它便开始提供垃圾邮件并删除角色。这是一个功能突破性的错误,如果有人可以解释我要去哪里错了,那就会喜欢它。
@commands.Cog.listener()
async def on_member_update(self, before, after):
activity_type = None
streaming_role = after.guild.get_role(521744891748024330)
try:
activity_type = after.activity.type
except:
pass
if activity_type is None:
if streaming_role in after.roles:
print(f"{after.display_name} has stopped streaming")
await after.remove_roles(streaming_role)
else:
pass
else:
if activity_type is discord.ActivityType.streaming:
if streaming_role not in after.roles:
print(f"{after.display_name} has started streaming")
await after.add_roles(streaming_role)
else:
if streaming_role in after.roles:
print(f"{after.display_name} has stopped streaming")
await after.remove_roles(streaming_role)
答案 0 :(得分:2)
on_member_update
可以在任何用户更新上运行,无论它是否与活动相关。但是,您每次都要检查用户的活动。 (您可以看到触发此事件here的更改列表)
如果用户正在流式传输,他们的活动将是discord.ActivityType.streaming
。如果不是,则为None
或其他活动。
由于角色更改是更新,因此您的代码在更新用户角色时将触发on_member_update
函数。然后,您的代码将检查他们是否具有流活动,然后根据用户上是否已经存在/删除角色。
结果是,当用户正在流式传输时,机器人会将角色添加到用户,由于更新而得到通知,并看到活动为streaming
并且他们具有该角色。然后,该漫游器会删除该角色,然后再次触发on_member_update
,这会提示它重新添加该角色,依此类推。
要解决此问题:具有discord.ActivityType.streaming
的用户始终表示他们正在流式传输。如果用户具有此活动类型并具有角色,则意味着您的漫游器已经处理了开始流式传输的用户,因此无需删除该角色。更改您的代码以体现这一点:
async def on_member_update(self, before, after):
activity_type = None
streaming_role = after.guild.get_role(521744891748024330)
try:
activity_type = after.activity.type
except:
pass
if not (activity_type is discord.ActivityType.streaming):
# User is doing something other than streaming
if streaming_role in after.roles:
print(f"{after.display_name} has stopped streaming")
await after.remove_roles(streaming_role)
else:
if streaming_role not in after.roles:
# If they don't have the role, give it to them
# If they have it, we already know they're streaming so we don't need to do anything
print(f"{after.display_name} has started streaming")
await after.add_roles(streaming_role)