对表情符号做出反应时添加角色 discord.py

Add role when react to emoji discord.py

我正在尝试在用户对此表情符号做出反应时添加一个角色,但我无法获得

设置角色


@bot.command()
async def roles(ctx):
    global IDMessage
    reaction   = await ctx.reply("Select your Game" + '\n' + '\n' + "- Valorant ‍♀️" '\n' + "- World of Warcraft ⚔" + '\n' + "- League of Legends ‍♀️" + '\n' + "- Cs:Go ")
    

    await reaction.add_reaction('‍♀️')
    await reaction.add_reaction('⚔')
    await reaction.add_reaction('‍♀️')
    await reaction.add_reaction('')
    
    IDMessage = reaction.message_id

这部分代码对我不起作用

添加反应角色

@bot.event
async def on_reaction_add(reaction, user):
  ChID = '920320584032870424'
  if reaction.message.channel.id != ChID:
    return
  if reaction.emoji == "‍♀️":
    Valorant = discord.utils.get(user.server.roles, name="Valorant")
    await bot.add_roles(user, Valorant)

ChID = '920320584032870424'(字符串)正在与整数 reaction.message.channel.id.

进行比较
  ChID = '920320584032870424'

改为使用

  ChID = 920320584032870424

这是一个整数。

我遇到了同样的问题,我就是这样解决的。

您正在添加反应,现在您需要等待用户反应。

为此,您可以使用 discord.py 的 wait_for 函数。

检查函数:

def check(reaction):
    if str(reaction.emoji) == “EMOJIHERE”:
        return “emoji name”
    elif str(reaction.emoji) == “SECONDEMOJI”:
        return “emoji name”
    elif str(reaction.emoji) == “THIRDEMOJI”:
        return “emoji name”
    elif str(reaction.emoji) == “FOURTHEMOJI”:
        return “emoji name”
    else:
        return “error”


代码:


async def roles(ctx):
    global IDMessage
    reaction   = await ctx.reply("Select your Game" + '\n' + '\n' + "- Valorant ‍♀️" '\n' + "- World of Warcraft ⚔" + '\n' + "- League of Legends ‍♀️" + '\n' + "- Cs:Go ")
    

    await reaction.add_reaction('‍♀️')
    await reaction.add_reaction('⚔')
    await reaction.add_reaction('‍♀️')
    await reaction.add_reaction('')
    
    confirm = await bot.wait_for(“reaction_add”, check=check)
    if confirm == "emoji name 1":
        doSomething()
    elif confirm == "emoji name 2":
        doSomething()
    elif confirm == "emoji name 3":
        doSomething()
    elif confirm == "emoji name 4":
        doSomething()
    else:
        print("Error")
        await ctx.send("An error occurred.")


用适当的值替换 EMOJIHERE 和表情符号名称。

这里有一些问题。使用 on_raw_reaction_add 而不是 on_reaction_add。大多数机器人使用后者而不是前者。 为什么你会问?因为,on_reaction_add 仅适用于 bot 缓存中的消息。

因此,在您的机器人可以读取消息后发送的每条消息都存储在字典或列表中(这就是缓存)。默认情况下,缓存限制为 1000 条消息。

因此,如果您重新启动了您的机器人,消息将永远不会在缓存中,因此事件不会触发。

另一个问题是您正在比较一个字符串 (ChID) 变量和一个整数 (reaction.message.channel.id),它们永远不会相等,所以 if reaction.message.channel.id != ChID 总是 return True 因此不会做任何事情(因为你 return 那个条件是 True)。

第三个问题是bot.add_roles不存在。 add_rolesdiscord.Member 对象的方法。

第四题是,Member.server不是东西,Member.guild

所以你更新后的代码将是这样的:

@bot.event
async def on_raw_reaction_add(payload: discord.RawReactionActionEvent):
  ChID = 920320584032870424
  if payload.channel.id != ChID:
    return
  if str(payload.emoji) == "‍♀️":
    valorant = discord.utils.get(payload.member.guild.roles, name="Valorant")
    await payload.member.add_roles(valorant)

还有我个人建议不要使用global 在极少数情况下,您实际上需要此关键字

但是您不太可能在使用 discord.py lib

制作的机器人中使用它

更多相关信息: