检测guild.member当前是否正在流式传输,并根据流式传输状态授予或删除角色

时间:2020-06-26 16:42:27

标签: python bots discord

正在寻找一些我在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)

1 个答案:

答案 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)