web-dev-qa-db-fra.com

Je veux faire une commande d'aide multi-pages à l'aide de Discord.py

J'utilise Discord.py pour faire un bot et il y a plus de commandes que de pouvoir installer une page pour ma commande d'aide personnalisée. Je souhaite que le bot ajoutez 2 réactions, retour et en avant, puis l'utilisateur qui a envoyé le message d'aide peut en choisir un et aller sur différentes pages de la commande d'aide. Je veux que le bot puisse éditer le message pour afficher la deuxième page, et s'ils remontent, puis modifier la première page d'origine. Quelqu'un pourrait-il aider avec cela? Ceci est similaire aux définitions Owobot, où vous pouvez faire défiler les définitions.

5
Oblique

Cette méthode utiliserait Client.wait_For() et peut être facilement adapté si vous en avez d'autres idées.

Exemple

@bot.command()
async def pages(ctx):
    contents = ["This is page 1!", "This is page 2!", "This is page 3!", "This is page 4!"]
    pages = 4
    cur_page = 1
    message = await ctx.send(f"Page {cur_page}/{pages}:\n{contents[cur_page-1]}")
    # getting the message object for editing and reacting

    await message.add_reaction("◀️")
    await message.add_reaction("▶️")

    def check(reaction, user):
        return user == ctx.author and str(reaction.emoji) in ["◀️", "▶️"]
        # This makes sure nobody except the command sender can interact with the "menu"

    while True:
        try:
            reaction, user = await bot.wait_for("reaction_add", timeout=60, check=check)
            # waiting for a reaction to be added - times out after x seconds, 60 in this
            # example

            if str(reaction.emoji) == "▶️" and cur_page != pages:
                cur_page += 1
                await message.edit(content=f"Page {cur_page}/{pages}:\n{contents[cur_page-1]}")
                await message.remove_reaction(reaction, user)

            Elif str(reaction.emoji) == "◀️" and cur_page > 1:
                cur_page -= 1
                await message.edit(content=f"Page {cur_page}/{pages}:\n{contents[cur_page-1]}")
                await message.remove_reaction(reaction, user)

            else:
                await message.remove_reaction(reaction, user)
                # removes reactions if the user tries to go forward on the last page or
                # backwards on the first page
        except asyncio.TimeoutError:
            await message.delete()
            break
            # ending the loop if user doesn't react after x seconds

Si votre éditeur ne prend pas en charge le coller dans les Emojis directement, vous pouvez utiliser un site Web tel que celui-ci pour trouver à la place des unicodes des emojis. Dans ce cas, la flèche Awaws était \u25c0 Et la flèche vers l'arrière était \u25b6.

Outre cela, vous devriez être prêt à partir! Le message se supprimera après 60 secondes d'inactivité dans ce message (c'est-à-dire personne ne réagissant avec les flèches), mais changez simplement le numéro si vous voulez une période plus longue avant la suppression.

Alternativement, vous pouvez ajouter dans un troisième emoji, tel qu'une croix, qui supprime le message à la demande.


Références:

2
Diggy.

Si vous utilisez client.command() au lieu de bot.command() Remplacez les deux variables bot à client.

0
Cyll