我想设置一个嵌入的消息,上面有表情符号,当用户单击某个表情符号时,它会赋予他们角色。我一直在四处寻找帮助...
我已经嵌入了消息部分,但是只是不知道如何在嵌入内容中添加表情符号反应,或者不设置如何在单击表情符号时授予用户角色。
@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
答案 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)