Как создать встраиваемое сообщение «реагировать на роль» с помощью discord.py

1

Я хочу создать встроенное сообщение, на которое реагирует смайлик, и когда пользователь нажимает на определенный смайлик, это дает ему роль. Я копался, чтобы найти помощь везде...

У меня есть встроенная часть сообщения, но я просто не знаю, как добавить реакцию эмодзи в код для вставки или настроить ее на предоставление пользователю роли при нажатии на смайлики.

@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

Теги:
python-3.x
discord
discord.py

1 ответ

1

Сначала помните, что вы ограничены 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)
  • 0
    Я действительно ценю это - но я просто теряюсь, когда мне дают только возможность: «Вы используете эти триггеры событий. Как будто я могу выяснить, какие события инициировать, но я терплю неудачу в части настройки этих событий. так расстроен этим ...
  • 0
    Человек ... спасибо за тонну. Я ненавижу задавать больше вопросов, но опять же, я просто новичок в этом, и я учусь на собственном опыте и методом проб и ошибок. Но где я буду вводить эмодзи, роль и идентификатор сообщения? Настраиваемая эмоция - «<: blyat: 491727892502282241>», роль - «testrole», а идентификатор сообщения - «532629344774914069». Я просто, кажется, помещаю их не в том месте.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню