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

Posted

技术标签:

【中文标题】对表情符号 discord.py 做出反应时添加角色【英文标题】:Add role when react to emoji discord.py 【发布时间】:2022-01-19 18:31:26 【问题描述】:

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

设置角色


@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)

【问题讨论】:

【参考方案1】:

ChID = '920320584032870424'(字符串)与整数 reaction.message.channel.id 进行比较。

  ChID = '920320584032870424'

改为使用

  ChID = 920320584032870424

这是一个整数。

【讨论】:

对我没用【参考方案2】:

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

您已经添加了反应,现在您需要等待用户做出反应。

为此,您可以使用 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 和表情符号名称。

【讨论】:

【参考方案3】:

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

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

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

另一个问题是您正在比较一个字符串 (ChID) 变量和一个整数 (reaction.message.channel.id),它们永远不会相等,因此 if reaction.message.channel.id != ChID 将始终返回 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 制作的机器人中使用它

更多信息:

discord.on_reaction_add discord.RawReactionActionEvent discord.Member.guild discord.Member.add_roles why-are-global-variables-evil

【讨论】:

以上是关于对表情符号 discord.py 做出反应时添加角色的主要内容,如果未能解决你的问题,请参考以下文章

如何在调用函数时使用 discord.py 添加反应?

Discord.py 机器人不响应自定义表情符号

如何让不和谐机器人使用 discord.py 向消息添加表情符号反应?

如何在没有 id 的 discord.py 中添加对消息的反应

向消息添加反应。 Discord.py 重写

机器人对表情符号做出反应