Я хочу создать встроенное сообщение, на которое реагирует смайлик, и когда пользователь нажимает на определенный смайлик, это дает ему роль. Я копался, чтобы найти помощь везде...
У меня есть встроенная часть сообщения, но я просто не знаю, как добавить реакцию эмодзи в код для вставки или настроить ее на предоставление пользователю роли при нажатии на смайлики.
@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
Сначала помните, что вы ограничены 20 реакциями на сообщение.
Чтобы добавить реакцию, вам нужно пройти через ее версию Unicode или объект discord.Emoji
. Как сказано в faq, вам нужно использовать Client.add_reaction
, которая принимает сообщение и смайлики для реакции в качестве аргументов.
Чтобы получить объект discord.Message
, просто назначьте отправленное сообщение переменной: reacted_message = await client.send_message(channel, embed=embed)
.
Вы можете перебирать кортеж, содержащий реакции для добавления (с простым циклом for), чтобы бот реагировал на сообщение.
Вместо того, чтобы использовать метод Client.wait_for_reaction
, который полезен, когда вы можете реагировать только в течение ограниченного времени, я предлагаю вам использовать событие on_reaction_add
, которое отправит отзыв discord.Reaction
и discord.User
который отреагировал.
В этом случае вам нужно сравнить сообщение, получившее реакцию, доступное через discord.Reaction.message
с сообщением, которое вы просматриваете. Вот почему сообщение, которое мы хранили в переменной ранее, должно быть сохранено где-нибудь доступным, например, как атрибут вашего бота (скажем, self.watched_messages
), так что вы можете сначала проверить, является ли сообщение "просматриваемым". Вместо того, чтобы использовать объект сообщения напрямую, я предлагаю вам использовать его идентификатор в качестве ключа в dict (self.watched_messages
), значение которого является другим диктовкой: "дающие роль" реакции (их значение Unicode или ID в случае таможни) и roleID, чтобы дать.
Если идентифицированный идентификатор сообщения указан в dict, и если эмодзи находится в списке, проиндексированном идентификатором messageID в ключе, то вы используете Client.add_roles
для добавления роли к члену.
Поскольку вы получаете только discord.User
который отреагировал, пользователь должен получить правильный discord.Member
к 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)