Le code de cet article est à des fins d'illustration uniquement et n'est pas destiné à une utilisation en production. Veuillez le réécrire en fonction de votre application.
Je veux passer un argument à Task
Fondamentalement, je pense que les tâches qui sont exécutées régulièrement sont souvent lancées au démarrage du bot. Cependant, vous souhaitez parfois contrôler la synchronisation de démarrage et le canal de destination avec des commandes. Par exemple, ** "Je veux que vous mentionniez le rapport horaire sur le canal spécifié toutes les 5 minutes pendant 30 minutes à partir de maintenant" **.
Cependant, il n'y a actuellement aucun exemple dans le document discord.py où Task (https://discordpy.readthedocs.io/ja/latest/ext/tasks/index.html) prend un argument.
Tout d'abord, ajoutez un argument à la tâche que vous souhaitez exécuter régulièrement.
Par exemple, considérons le cas où une mention est envoyée à la personne qui a envoyé la commande dans le canal dans lequel la commande est entrée.
Dans ce cas, si vous recevez Context
comme argument lorsque vous entrez la commande, il semble que vous puissiez identifier le canal et l'expéditeur.
from discord.ext import tasks, commands
class MyCog(commands.Cog):
def __init__(self):
pass
def cog_unload(self):
self.reminder.cancel()
@tasks.loop(minutes=5.0, count=6)
async def reminder(self, ctx, content):
await ctx.send("<@{0}> {1}".format(ctx.author.id, content))
Si vous définissez un rappel comme celui-ci, vous serez rappelé simplement en le démarrant.
Alors, comment passez-vous cet argument ctx
?
Comme le dit le titre. Vous pouvez le passer à start ()
qui est utilisé lorsque la tâche démarre. Les «* args» et «** kawrgs» passés à «start ()» sont passés tels quels en tant qu'arguments de la tâche correspondante.
Ainsi, par exemple, vous pouvez définir la commande de suppression suivante.
from discord.ext import tasks, commands
class MyCog(commands.Cog):
def __init__(self):
pass
def cog_unload(self):
self.reminder.cancel()
@tasks.loop(minutes=5.0, count=6)
async def reminder(self, ctx, content):
await ctx.send("<@{0}> {1}".format(ctx.author.id, content))
@commands.command()
async def set_reminder(self, ctx, content):
self.reminder.start(ctx, content) #Important ici
await ctx.send("J'ai mis un rappel")
Maintenant, si vous envoyez la commande set_reminder
au chat, le contenu pré-spécifié sera mentionné toutes les 5 minutes.
Le point est self.reminder.start (ctx, content)
, et c'est OK tant que l'argument passé à start ()
est passé à l'argument de Task démarré par ce start ()
.
Comme je l'ai écrit au début, ce code lui-même n'est pas destiné à la production. Je suis curieux de savoir ce qui se passe si une autre personne frappe à nouveau set_reminder dans les 30 minutes après avoir entré set_reminder.
Veuillez noter qu'il ne s'agit que d'un pseudo code pour expliquer le passage d'arguments à Task. (Mais faites-moi savoir s'il y a des erreurs fatales telles que des erreurs grammaticales)
Recommended Posts