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.
3 Réponses :
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)
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
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!
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é!
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