如何使用discord.py创建“角色响应”嵌入消息

时间:2019-01-08 16:40:28

标签: python python-3.x discord discord.py

我想设置一个嵌入的消息,上面有表情符号,当用户单击某个表情符号时,它会赋予他们角色。我一直在四处寻找帮助...

我已经嵌入了消息部分,但是只是不知道如何在嵌入内容中添加表情符号反应,或者不设置如何在单击表情符号时授予用户角色。

@client.event
async def on_message(message) :
      #ignore this portion
 if message.author == client.user:
  return
 elif message.content.startswith("~ping"):
  await client.send_message(message.channe,"Pong!")
      #read below this now
 elif message.content.startswith("~embed"):
  emb = (discord.Embed(title="role Update", description="Use the emotes to role", colour=0x3DF270))
  await client.send_message(message.channel, embed=emb)

 elif message.content.startswith("~embedroles"):
  channel = bot.get_channel('532629344774914069')
  role = discord.utils.get(user.server.roles, name="test")
  while True:
   reaction = await client.wait_for_reaction(emoji='\N{THUMBS UP SIGN}', message=message)
   await bot.add_roles(reaction.message.author, role)

我希望这是有道理的。这是我所指的示例... https://imgur.com/2QYCSAi

1 个答案:

答案 0 :(得分:2)

首先请记住,每条消息最多只能有20条反应。

要添加反应,您必须通过其Unicode版本或discord.Emoji对象。如faq中所述,您需要使用Client.add_reaction,它将消息和表情符号作为参数进行响应。

要获取discord.Message对象,只需将发送的消息分配给变量reacted_message = await client.send_message(channel, embed=embed)

您可以遍历一个元组,其中包含要添加的反应(带有简单的for循环),以使bot对消息做出反应。

建议您使用Client.wait_for_reaction事件,该事件将反馈discord.Reaction和以下内容,而不是使用on_reaction_add方法(当您只能在有限的时间内做出反应时有用)。 discord.User是谁的反应。

在这种情况下,您需要将通过discord.Reaction.message访问的得到反应的消息与您正在观看的消息进行比较。这就是为什么我们之前保存在变量中的消息应保存在可访问的位置,例如bot的属性(例如self.watched_messages),以便您可以首先检查消息是否为“已监视”。建议您不要直接使用消息对象,而建议您将其ID用作字典(self.watched_messages)中的键,该值是另一个字典:“赋予角色”的反应(其Unicode值,或者是海关的ID) )和要提供的roleID。

如果响应的消息ID在字典中,并且表情符号在键中messageID索引的列表中,则您可以使用Client.add_roles将角色添加到成员中。

由于只获得做出反应的discord.User,因此需要获得正确的discord.Member才能添加角色。您可以路过discord.Message.server

类似地(保持相同的嵌套字典),使用on_reaction_remove事件和Client.remove_roles来删除角色。

这是我所想到的伪代码

    # template of the nested dict:
    watched_messages = {
        messageID: {
            regularEmojiName: roleID,
            customEmojiID: roleID
        }
    }

    async def manage_reaction(self, reaction, user, added: bool):
        if not reaction.message.id in self.watched_messages:
            return

        messageID = reaction.message.id
        mapping = self.watched_messages[messageID]
        if not reaction.emoji in mapping:
            # reaction.emoji is str if normal emoji or ID if custom, but we use both as keys in mapping
            return

        member = discord.utils.get(reaction.message.server.members, id=user.id)
        role = discord.utils.get(reaction.message.server.roles, id=mapping[reaction.emoji])

        if added:
            await client.add_roles(member, role)
        else:
            await client.remove_roles(member, role)

    @client.event
    async def on_reaction_add(self, reaction, user):
        await self.manage_reactions(reaction, user, True)

    @client.event
    async def on_reaction_remove(self, reaction, user):
        await self.manage_reactions(reaction, user, False)