[PYTHON] Transmettez des arguments à Task dans discord.py

supposition

Mise en garde

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.

Chose que tu veux faire

Je veux passer un argument à Task

Pourquoi je veux faire

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.

Méthode

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?

Passez l'argument Task à start ()

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 ().

Mise en garde

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

Transmettez des arguments à Task dans discord.py
Comment passer des arguments à un script Python dans SPSS Modeler Batch
[Python / Tkinter] Comment passer des arguments à la commande
Introduction à discord.py (2)
Comment recevoir des arguments de ligne de commande en Python
Comprenons comment passer des arguments (édition Python)
Comment transmettre les paramètres au pipeline d'articles dans Scrapy
nest cog dans discord.py
Exécuter la fonction Python à partir de Powershell (comment passer des arguments)
Messages mis à jour dans discord.py
Ne passez pas self à ProcessPoolExecutor en classe
Comment passer le paramètre backend de matplotlib avec une variable d'environnement
Définir une tâche pour définir l'environnement de fabric dans YAML
[ECS] [Fargate] Script pour obtenir l'ID de tâche dans le conteneur d'exécution TASK
Pour vider stdout en Python
Connectez-vous au site Web en Python
Recevoir des arguments d'exécution dans Python 2.7
Comment développer en Python
Introduction à discord.py (3) Utilisation de la voix
Passer du texte à Django genericview
Publier sur Slack en Python
Choses à surveiller lors de l'utilisation d'arguments par défaut en Python
Comment passer des arguments en utilisant une instance avec la commande systemctl de systemd
Je veux réussir le test G dans un mois Jour 1
Précautions lors de l'attribution de valeurs par défaut aux arguments dans les définitions de fonctions Python