web-dev-qa-db-fra.com

Discord bot reading réactions

J'ai besoin d'implémenter une partie de la fonctionnalité et l'une des fonctionnalités implémente une fonctionnalité de type sondages. Impossible d'utiliser les robots publics de discorde en raison de certaines politiques, nous devons donc implémenter quelque chose par moi-même. J'ai fait des recherches hier et j'ai pu créer un bot de base en utilisant python3 et commands api depuis discord.ext. Maintenant, ce que je dois comprendre, c'est:

  1. Lire les réactions ajoutées par un utilisateur à un message?
  2. Créez un message avec des réactions (comme des bots qui créent des sondages de réaction?)
  3. Épingler un message?
  4. Je crois que de ctx je peux obtenir usertags (admin etc). Y a-t-il une meilleure façon de le faire?

Je n'ai rien trouvé d'utile sur Page de référence des commandes ou je regarde probablement une mauvaise documentation. Toute aide serait appréciée.

merci


Mise à jour : Merci les gars. maintenant je suis coincé sur la façon d'ajouter des emoji, voici mon code

poll_emojis = {0: ':zero:', 1: ':one:', 2: ':two:', 3: ':three:', 4: ':four:'}

@client.event
async def on_message(message):
    if message.author == client.user:
        return

    if message.content.startswith('$create_poll'):

        poll_content = message.content.split('"')
        poll_text = poll_content[1]
        poll_options = []
        poll_option_text = ''
        count = 0
        for poll_option in poll_content[2:]:
            if poll_option.strip() != '':
                poll_options.append(poll_option)
                poll_option_text += '{0}: {1}\t'.format(poll_emojis[count], poll_option)
                count += 1

        posted_message = await message.channel.send('**{0}**\n{1}'.format(poll_text, poll_option_text))

        count = 0
        for poll_option in poll_options:
            await posted_message.add_reaction(Emoji(poll_emojis[count]))
            count += 1
7
Em Ae

En passant, étant donné que vous démarrez ce projet et que vous utilisez déjà la documentation de réécriture, assurez-vous d'utiliser la version de réécriture. Il y a quelques questions ici sur la façon de s'en assurer et comment l'obtenir si vous ne l'êtes pas, mais c'est mieux documenté et plus facile à utiliser. Mes réponses ci-dessous supposent que vous utilisez discord.py-rewrite

  1. Message.reactions est une liste de Reaction s. Vous pouvez obtenir une cartographie des réactions à leurs comptes avec

    {react.emoji: react.count for react in message.reactions}
    
  2. Vous pouvez réagir au message immédiatement après l'avoir posté:

    @bot.command()
    async def poll(ctx, *, text):
        message = await ctx.send(text)
        for emoji in ('????', '????'):
            await message.add_reaction(emoji)
    
  3. Vous pouvez utiliser Message.pin : await message.pin()

Je ne suis pas sûr de ce que vous entendez par "usertags". Vous voulez dire des rôles?

Modifier 1:

J'écrirais votre commande comme

@bot.command()
async def create_poll(ctx, text, *emojis: discord.Emoji):
    msg = await ctx.send(text)
    for emoji in emojis:
        await msg.add_reaction(emoji)

Notez que cela ne fonctionnera que pour les emoji personnalisés, ceux que vous avez ajoutés à votre propre serveur (En effet, discord.py Traite différemment les emoji unicode et les emoji personnalisés.) Cela accepterait des commandes comme

!create_poll "Vote in the Primary!" :obamaemoji: :hillaryemoji:

en supposant que ces deux emoji se trouvaient sur le serveur sur lequel vous envoyez la commande.

Modifier 2:

Avec le nouveau convertisseur commands.Greedy , je réécrirais la commande ci-dessus comme suit:

@bot.command()
async def create_poll(ctx, emojis: Greedy[Emoji], *, text):
    msg = await ctx.send(text)
    for emoji in emojis:
        await msg.add_reaction(emoji)

L'invocation serait donc un peu plus naturelle, sans les guillemets:

!create_poll :obamaemoji: :hillaryemoji: Vote in the Primary!
5
Patrick Haugh