当用户添加反应 Discord.py 时赋予角色

Posted

技术标签:

【中文标题】当用户添加反应 Discord.py 时赋予角色【英文标题】:give role when a user add reaction Discord.py 【发布时间】:2019-02-12 02:49:28 【问题描述】:

我正在为我的不和谐频道开发一个机器人,我正在学习 python,我想在用户添加反应时发挥作用,我想出的代码是这样的

@client.event
async def on_reaction_add(reaction, user):
    ChID = '487165969903517696'
    if reaction.message != ChID:
        return;
    if user.reaction.emoji == "????":
        CSGO = discord.utils.get(user.server.roles, name="CSGO_P")
        await client.add_roles(user, CSGO)

但它不起作用我基本上想要的是我在具有此频道 ID 的频道中发送了一条消息:487165969903517696,然后我的机器人发送了一条带有“role=emoji”内容的嵌入消息。像 CSGO=:runner: 然后将这些反应表情符号添加到它的消息中(嵌入)现在我想说如果用户点击其中一个表情符号,机器人必须给他/她一个类似 CSGO_P 的角色

顺便说一句,我最初想出了一个 on_message 事件,它工作正常,但我认为如果他们添加反应而不是输入例如 !CSGO 并且我刚刚开始使用 python(2 天前)

【问题讨论】:

【参考方案1】:

@tristo @patrick-haugh 谢谢你们!它工作得很好......我混合了你的两个想法并做了这个,它工作得很好!

@client.event
async def on_ready():
    Channel = client.get_channel('YOUR_CHANNEL_ID')
    Text= "YOUR_MESSAGE_HERE"
    Moji = await client.send_message(Channel, Text)
    await client.add_reaction(Moji, emoji='?')
@client.event
async def on_reaction_add(reaction, user):
    Channel = client.get_channel('YOUR_CHANNEL_ID')
    if reaction.message.channel.id != Channel
    return
    if reaction.emoji == "?":
      Role = discord.utils.get(user.server.roles, name="YOUR_ROLE_NAME_HERE")
      await client.add_roles(user, Role)

非常感谢大家!

【讨论】:

【参考方案2】:

on_reaction_add 事件有点受限,因为它仅由存储在Client.messages dequeue 中的消息触发。这是一个缓存(默认大小为 5000),可阻止您的机器人响应旧消息的活动。如果您重新启动机器人,无法保证它仍会“观看”该消息。

您可以做的一件事是在您的机器人登录时发送一条消息,并将角色添加给对该消息作出反应的用户

@bot.event
async def on_ready():
    channel = bot.get_channel('487165969903517696')
    role = discord.utils.get(user.server.roles, name="CSGO_P")
    message = await bot.send_message(channel, "React to me!")
    while True:
        reaction = await bot.wait_for_reaction(emoji="?", message=message)
        await bot.add_roles(reaction.message.author, role)

【讨论】:

【参考方案3】:

您返回后有一个;。 此外,您使用 user.reaction.emoji 而不仅仅是 reaction.emoji 这个

@client.event
async def on_reaction_add(reaction, user):
  ChID = '487165969903517696'
  if reaction.message.channel.id != ChID:
    return
  if reaction.emoji == "?":
    CSGO = discord.utils.get(user.server.roles, name="CSGO_P")
    await client.add_roles(user, CSGO)

应该没问题

【讨论】:

为什么在 int 值中使用 ""?

以上是关于当用户添加反应 Discord.py 时赋予角色的主要内容,如果未能解决你的问题,请参考以下文章

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

.verify 命令未赋予角色(discord.py 1.7.3)

如何使用 discord.py 机器人,在他们加入 VC 时赋予用户角色并在他们离开时将其删除

Discord.py 反应角色和 DMing 反应堆

从用户中删除角色,然后将它们添加回 Discord.py(使用 Repl.it)

当用户是角色 discord.py 时,头像命令给出错误