Discord.py bot,在用户添加反应时分配角色

时间:2021-01-27 12:05:58

标签: python discord discord.py

我正在制作一个我从这个 youtube video 中看到的机器人 这是我写的代码

@client.event
async def on_raw_reaction_add(payload):
  message_id = payload.message_id
  if message_id == [message id]:
    guild_id = payload.guild_id
    guild = discord.utils.find(lambda g :g.id == guild_id, client.guilds)
    
    role = discord.utils.get(guild.roles, name=payload.emoji.name)

    if role is not None:
      member_user = discord.utils.find(lambda m : m.id == payload.member.id, guild.members)
      if member_user is not None:
        await member_user.add_roles(role)
        print("Done")
      else:
        print("Member not Found")
        print(member_user)
    else:
      print("Role not Found")

但是每次我做出反应时,控制台都会为我提供未找到会员和无用户 ID。 我在获取用户 ID 时做错了什么吗?还是问题出在其他地方?

第一次用 python 编码任何东西。提前致谢:)

2 个答案:

答案 0 :(得分:1)

如果您没有正确设置 guild.members,您将无法使用 Intents,而且鉴于您正在学习过时的 YouTube 教程,我认为您没有。

>

在创建 commands.Bot 实例时,传入意图并启用 members 意图:

intents = discord.Intents.default()
intents.members = True
client = commands.Bot(command_prefix=..., intents=intents)

之后,在您的机器人仪表板上启用它们。有关如何执行此操作的信息在文档中:https://discordpy.readthedocs.io/en/latest/intents.html#privileged-intents

答案 1 :(得分:0)

我们这样做是为了根据用户对欢迎消息的反应为用户分配角色。您可以尝试一下,看看它是否也适用于您的情况

    @bot.event
    async def on_raw_reaction_add(payload):
        guild = bot.get_guild(payload.guild_id)
        rolesDict = {role.name : role for role in guild.roles}
        member = guild.get_member(payload.user_id)
        user = bot.get_user(payload.user_id)
        if(payload.message_id == 769218692948295721):
            for roleName in ["Role1", "Role2", "Role3"]:
                await member.remove_roles(rolesDict.get(roleName))
                
            if(str(payload.emoji) == "\U0001F986"):
                role = rolesDict.get("Role1")
                await member.add_roles(role)
            elif(str(payload.emoji) == "?"):
                role = rolesDict.get("Role2")
                await member.add_roles(role)
            elif(str(payload.emoji) == "?"):
                role = rolesDict.get("Role3")
                await member.add_roles(role)