0
votes

réécriture discord.py | Autoriser une seule instance d'une commande

En utilisant mon bot, j'ai découvert que plusieurs personnes peuvent utiliser la même commande simultanément. Je voudrais seulement que la commande soit exécutée une par une, en raison de sa nature.

Existe-t-il un moyen de s'assurer qu'il n'y a qu'une seule instance de la commande en cours d'exécution? S'il y en a, dites-moi s'il vous plaît. J'ai besoin de ce type fixe rapidement, donc toute aide est appréciée.


0 commentaires

3 Réponses :


1
votes

Vous pouvez avoir un temps de recharge pour tous les utilisateurs avec un délai d'attente important, puis réinitialiser le temps de recharge à la fin de la commande:

from discord.ext.commands import cooldown

@bot.command()
@cooldown(1, 1000)  # 1000 second cooldown
async def comm(ctx):
    ...
    comm.reset_cooldown(ctx)


2 commentaires

C'est probablement une petite question, mais j'ai eu l'erreur No module named 'commands après l'importation. Qu'est-ce que j'ai fait de mal avec le from commands import cooldown ?


Oups, le module que j'utilisais avait déjà des commandes importées. Cela devrait être discord.ext.commands



0
votes

L'utilisation d'une variable globale est également une option.

global set_active
set_active = 0
...
...
@bot.command("turn_on")
async def "Your command name"(ctx):
    global set_active
    #start command
    if set_active == 1:
        await ctx.send("This is already active")
    else/elif:
        ......
    #end command
    set_active = 1

@bot.command("turn_off")
async def "Your command name"(ctx):
    global set_active
    #start command
    ......
    #end command
    set_active = 0

J'espère que cela est clair. C'est la première fois que j'aide quelqu'un. J'ai aussi ça dans mon bot. Faites-moi savoir si je peux vous aider davantage!


2 commentaires

Utiliser le même nom pour toutes vos commandes n'est pas génial, car vous ne pouvez pas accéder aux objets Command plus tard dans votre code (pour des choses comme la définition de groupes ou des gestionnaires d'erreurs spécifiques aux commandes)


@PatrickHaugh Je ne voulais pas utiliser le même nom pour toutes les commandes. Juste un espace réservé pour une commande. Je modifierai ma réponse en conséquence. Merci d'avoir remarqué!



0
votes

Utilisez le décorateur @ commands.max_concurrecy (number, per =, wait = False) sur votre commande.

Exemple:

@poll.error
async def poll_handler(self, ctx, error):
    if isinstance(error, commands.MaxConcurrencyReached):
         (Whatever you want to do here)

Lorsque vous utilisez le décorateur max_concurrency, si vous avez wait = False, il renverra l'erreur MaxConcurrencyReached lorsque les instances dépassent le nombre spécifié. Exemple de gestion des erreurs, la même commande ci-dessus est illustrée ci-dessous

Exemple:

@commands.command()
@commands.max_concurrency(1, per=commands.BucketType.default, wait=False)
async def poll(self, ctx, *question):
    **Code**

Si wait = True, la commande attendra dans une file d'attente jusqu'à ce qu'elle puisse être exécutée.

N'oubliez pas d'avoir également cette ligne dans votre bot à from discord.ext import commands


0 commentaires