[PYTHON] Faites simplement migrer l'échobot Discord.py 0.X vers 1.X

Contexte

Le programme que j'ai créé pour que Voiceroid lise les messages Discord à l'aide de Python 3.6 n'était pas utilisable après Python 3.7. (Depuis un an) De plus, la version de Discord.py était si ancienne que je voulais la mettre à jour. (Il a été découvert que cela ne fonctionnait pas après la mise à jour)

Je voulais utiliser Python pour la première fois depuis longtemps, alors corrigeons-le!

environnement

L'environnement supposé cette fois est le suivant. ・ Python 3.7.4 ・ Discord.py 1.2.4 ・ Windows10

Veuillez consulter d'autres pages pour les paramètres d'environnement Python. Veuillez utiliser votre éditeur préféré, etc.

Rénovation Echobot

Je voudrais faire un simple bot d'écho. Je l'ai fait la dernière fois Discord.py 0.x, donc je ne pouvais pas l'utiliser maintenant.

EchoBot.py


# Discord.py 0.x
import discord
client = discord.Client()

@client.event
async def on_ready():
    print("-"*35)
    print("user name:", client.user.name)
    print("user id:", client.user.id)
    print("-"*35)

@client.event
async def on_message(message):
        #Ne réagissez pas à votre propre message
    if client.user != message.author:
        #Écrire un message
        m= message.author.name +"Le message envoyé par"+message.content+"est"
        #Envoyer un message au canal auquel le message a été envoyé
        await client.send_message(message.channel, m)


client.run("Jeton BOT")

C'est aussi simple que de renvoyer un message de quelqu'un d'autre que le bot. Nous allons modifier cela pour correspondre à 1.X. Cette fois, c'est dans ʻon_message` qu'il faut modifier.

EchoBot_after.py


@client.event
async def on_message(message):
    if message.author.bot:  #Ignorer si l'expéditeur du message est Bot
        return
    #Envoyer à la chaîne publiée
    await message.channel.send(f"{message.author.name}message de{message.content}est")

Puisqu'il s'agit d'un bot d'écho, ce type de modification est suffisant, mais cela semble difficile pour une application multifonctionnelle.

Réparer pendant la réparation

Voici beaucoup de réécritures

EchoBot.py


import discord
import re
client = discord.Client()
CHANNEL_ID = "ID du canal principal"


@client.event
async def on_ready():  #Afficher l'ID et le nom sur la console de démarrage
    print("-"*50)
    print(client.user.name)  # User Name
    print(str(client.user.id))  # User ID
    print(""*50)
    print("URL d'invitation au bot")
    strURL = "https://discordapp.com/oauth2/authorize?&client_id="
    strURL += str(client.user.id) + "&scope=bot&permissions=0"
    print(strURL)
    print("-"*50)
    print(f"client : {client}")
    print(f"client.user : {client.user}")
    print("-"*50)
    channel = client.get_channel(CHANNEL_ID)
    await channel.send("Cela a commencé.")  #Notifier au démarrage


@client.event
async def on_message(message):  #Traitement qui fonctionne lors de la réception d'un message
    if message.author.bot:  #Ignorer si l'expéditeur du message est Bot
        return

    if client.user in message.mentions:  #Je répondrai quand une réponse viendra
        await message.channel.send( f"{message.author.mention}appelé?")  #Envoyez un message de réponse
        return

    Msg = message.content
    if re.search(r"http(.*)", Msg):
        Msg = re.sub(r"http(.*)", ", URL ci-dessous", Msg)  #URL omise
    await message.channel.send(f"{message.author.name}message de{Msg}est")


client.run("Jeton BOT")

Ceci termine le bot d'écho. Si vous changez la partie message.author.name en message.author.nick, vous pouvez obtenir le surnom de la personne de la guilde.

prime

Il s'agit d'un assortiment de fonctions client (fonctions que je pense utiliser personnellement) que j'ai créées pour vérifier diverses choses lors de la mise à jour.

DiscordTest.py


import discord
import re
import datetime
import sys
from inspect import currentframe

client = discord.Client()
CHANNEL_ID = "Identifiant de la chaine"


@client.event
async def on_ready():  #Afficher l'ID et le nom sur la console de démarrage
    now = datetime.datetime.now()
    print(now.strftime('%Y/%m/%d %H:%M:%S'))
    print("-"*50)
    print(client.user.name)  # User Name
    print(str(client.user.id))  # User ID
    print(""*50)
    print("URL d'invitation au bot")
    strURL = "https://discordapp.com/oauth2/authorize?&client_id="
    strURL += str(client.user.id) + "&scope=bot&permissions=0"
    print(strURL)
    print("-"*50)
    print(f"client : {client}")
    print(f"client.user : {client.user}")
    print("-"*50)
    channel = client.get_channel(CHANNEL_ID)
    await channel.send("Cela a commencé.")  #Notifier au démarrage


@client.event
async def on_typing(channel, user, when):  #Quelqu'un essaie d'écrire un message
    printDate(sys._getframe().f_code.co_name, channel, user, when)


@client.event
async def on_message(message):  #Traitement qui fonctionne lors de la réception d'un message
    printDate(sys._getframe().f_code.co_name, message)
    if message.author.bot:  #Ignorer si l'expéditeur du message est Bot
        return
    if client.user in message.mentions:  #Je répondrai quand une réponse viendra
        reply = f"{message.author.mention}appelé?"  #Répondre au contenu
        await message.channel.send(reply)  #Envoyez un message de réponse
        return

    if re.search(r"Planche à découper", message.content):  #Déterminez si la commande est incluse
        e = discord.Embed(title='KOROSUZO☆')
        await message.channel.send('Avez-vous dit quelque chose', embed=e)  #
        return
    Msg = message.content
    if re.search(r"http(.*)", Msg):
        Msg = re.sub(r"http(.*)", ", URL ci-dessous", Msg)  #URL omise
    await message.channel.send(f"{message.author.nick}message de{Msg}est")


@client.event
async def on_guild_role_create(role):  #Que se passe-t-il lorsqu'une règle de guilde est créée
    printDate(sys._getframe().f_code.co_name, role)
    channel = client.get_channel(CHANNEL_ID)
    await channel.send(f"{role}A été créé")


@client.event
async def on_user_update(before, after):
    printDate(sys._getframe().f_code.co_name, before, after)


@client.event
async def on_member_update(before, after):  #Traitement exécuté lorsque les informations du membre changent
    printDate(sys._getframe().f_code.co_name, before, after)


@client.event
async def on_guild_role_delete(role):
    printDate(sys._getframe().f_code.co_name, role)
    channel = client.get_channel(CHANNEL_ID)
    await channel.send(f"{role}A été supprimé")


@client.event
async def on_voice_state_update(member, before, after):
    channel = client.get_channel(CHANNEL_ID)
    printDate(sys._getframe().f_code.co_name, member, before, after)
    #Quitter le canal vocal
    if after.channel is None:
        await channel.send(f"{member}Mais{before.channel.name}J'ai quitté la pièce de")
        return
    #Rejoignez le canal vocal
    if before.channel is None and after.channel is not None:
        await channel.send(f"{member}Mais{after.channel.name}J'ai participé à")
        return
    #Déplacer le canal vocal
    if before.channel != after.channel:
        await channel.send(f"{member}Mais{after.channel.name}Déplacé vers")
        return


@client.event
async def on_guild_update(before, after):  #Que faire lorsque la guilde est mise à jour
    channel = client.get_channel(CHANNEL_ID)
    printDate(sys._getframe().f_code.co_name, before, after)
    await channel.send(f" {before}Mais{after}Changé en")


@client.event
async def on_guild_channel_delete(channel):  #Lorsqu'une chaîne est supprimée
    printDate(sys._getframe().f_code.co_name, channel)


@client.event
async def on_guild_channel_create(channel):  #La chaîne a été créée
    printDate(sys._getframe().f_code.co_name, channel)


@client.event
async def on_guild_channel_pins_update(channel, lastPin):  #Lorsqu'un message est épinglé ou non épinglé
    print(sys._getframe().f_code.co_name)
    chkprint(channel, lastPin)
    if lastPin is not None:
        print(f"lastPin +9h : {lastPin + datetime.timedelta(hours=9)}")  #Corrigé à l'heure du Japon
    print("-"*50)


def printDate(name, *args):
    print(name)
    now = datetime.datetime.now()
    print(now.strftime('%Y/%m/%d %H:%M:%S'))
    chkprint(*args)
    print("-"*50)


def chkprint(*args):
    names = {id(v): k for k, v in currentframe().f_back.f_locals.items()}
    print(', '.join(names.get(id(arg), '???') + ' = ' + repr(arg) for arg in args))


client.run('Jeton BOT')

Il y avait une fonction pour changer son propre statut, changer le nom et les règles de la guilde, et réagir de différentes manières, mais j'ai rassemblé les parties que je pouvais utiliser.

Site de référence

** Comment obtenir le nom d'une fonction depuis une fonction [Python] ** https://qiita.com/abeken0713/items/77420c8c05e53628199a

** Idéal pour le débogage d'impression! Implémentation d'une fonction qui imprime les noms de variables sous forme de chaînes en même temps que les valeurs à l'intérieur ** https://qiita.com/AnchorBlues/items/f7725ba87ce349cb0382

Discord.py https://discordpy.readthedocs.io/ja/latest/migrating.html#

Recommended Posts

Faites simplement migrer l'échobot Discord.py 0.X vers 1.X
Termes étroitement liés au système X Window
Excel X Python La technique de travail la plus rapide
[Algorithm x Python] Comment utiliser la liste
Introduction à discord.py (2)
Comment entraîner Kaldi avec JUST Corpus
Ajoutez simplement le pilote à la touche de forme avec mélangeur
La route vers Pythonista
La route vers Djangoist