[Dernière version] Faites parler le bot à intervalles réguliers avec discord.py

Aperçu

Je vais vous expliquer comment faire en sorte qu'un bot effectue un traitement régulier en utilisant discord.py, qui est un wrapper d'API Python Discord qui vous permet d'écrire un bot de manière concise dans l'outil de discussion Discord.

Mise en garde

L'exemple de code ne fonctionnait pas vraiment. L'exemple de code a été révisé le 10 avril 2020.

supposition

Notes sur la version

discord.py a été fourni avec ver0.16.12 (version dite asynchrone) depuis longtemps, mais la v1.0.0 (version dite de réécriture) a été publiée en avril 2019, et l'utilisation de la série v0 n'est plus recommandée. N'est pas ... En fait, la série v0 ne prend pas en charge Python 3.7 ou supérieur, et une mise à jour et une maintenance futures ne peuvent être prévues. Nous vous recommandons de prendre en charge autant que possible la dernière version. Veuillez vous référer à l'article suivant pour le traitement régulier dans la série v0.

Faire parler le bot à intervalles réguliers sur discord.py [version asynchrone]

Méthode

Utilisez tasks, une extension de'discord.py '. Il s'agit d'une bibliothèque qui se concentre sur l'exécution répétitive, qui est souvent utilisée dans le développement de robots. Le processus itératif peut être décrit de manière très concise. Document officiel

Fondamentalement, sur la ligne au-dessus de la méthode que vous souhaitez exécuter périodiquement Après avoir ajouté @ tasks.loop ([intervalle d'exécution]), start () est exécuté au moment où vous voulez démarrer l'exécution périodique.

Regardons un exemple concret dans la section suivante.

Exemple concret

Voici un exemple d'exécution périodique toutes les 10 secondes immédiatement après le démarrage du bot sur le canal avec l'ID spécifié à l'avance.

from discord.ext import tasks
import discord

client = discord.Client()

channel_sent = None
"""
La partie qui définit la méthode qui parle toutes les 10 secondes.
Une ligne au-dessus de async def indique une exécution périodique.()Spécifiez l'intervalle dans.
Par exemple, toutes les 5 minutes(minutes=5)est.
"""
@tasks.loop(seconds=10)
async def send_message_every_10sec():
    await channel_sent.send("10 secondes se sont écoulées")

"""
Cette fois, je veux commencer l'exécution régulière immédiatement après le démarrage du bot, donc
Démarrez l'exécution régulière lorsque le bot est prêt()Faire
"""
@client.event
async def on_ready():
    global channel_sent 
    channel_sent = client.get_channel(any_channel_id)
    send_message_every_10sec.start() #Derrière la méthode qui s'exécute régulièrement.start()Mettez


client.run("hogehogetoken")

Vous pouvez maintenant demander au canal spécifié de dire "10 secondes se sont écoulées" toutes les 10 secondes.

Si vous l'appliquez, lorsque vous recevez la commande spécifiée, vous pouvez l'exécuter à partir de ce moment. Vous changez simplement le timing de start ().

À la fin

Faites parler le bot à intervalles réguliers sur discord.py [version asynchrone] Je suis désolé que le nombre de vues de cet article augmente encore, j'ai donc créé une ligne de flux vers la dernière version pour le moment. Assurez-vous de mettre à jour ...

Veuillez commenter si vous avez des questions. J'ai maîtrisé discord.py dans une certaine mesure.

Supplément d'exemple de code

L'exemple de code ci-dessus est un code qui a été corrigé plusieurs fois après avoir reçu des rapports de bogue. Il y a des parties non naturelles parce que nous l'avons modifié pour qu'il ne s'écarte pas de l'exemple de code qui a été écrit à l'origine. En particulier, la réécriture de la valeur de la variable externe à l'aide de «global» doit être évitée si ce n'est pas nécessaire (elle est moins lisible et peut involontairement réécrire la valeur de la variable).

Par exemple, en se référant à l'article suivant, si la fonction de bouclage elle-même prend le canal de destination comme argument, il peut être passé comme argument de start () sans réécrire avec global. https://qiita.com/rareshana/items/b84bec58acd48cb14118

Vous pouvez également utiliser Cog, une fonction qui regroupe les commandes, les événements et les tâches, pour stocker des canaux dans des variables d'instance, éliminant ainsi le besoin d'utiliser des variables globales. Veuillez réécrire de manière appropriée en fonction de la situation.

Recommended Posts

[Dernière version] Faites parler le bot à intervalles réguliers avec discord.py
Utilisez la dernière version de PyCharm sur Ubuntu
Installez la dernière version de CMake sur Ubuntu 18.04.4 LTS
Mettez la dernière version de Python dans Linux (Debian) du Chromebook
Installez la dernière version de Git sur votre serveur Linux
Suspendre Thread sur Linux (version corrigée en bas de l'article)
Installez la dernière version d'Apache httpd 2.4 à partir des sources sur Cent OS 8
Soyez prudent lorsque vous récupérez des tweets à intervalles réguliers avec l'API Twitter