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!
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.
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.
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.
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.
** 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