[PYTHON] [Discode Bot] J'ai essayé de créer un Bot qui me dit la valeur de race de Pokemon

Contexte de création

La valeur de la race est un facteur important pour déterminer le statut dans Pokemon. En fait, lorsque vous jouez contre Pokemon, vous ne pourrez peut-être pas jouer à un jeu décent à moins de connaître la valeur de la course. À l'heure actuelle, si vous ne connaissez pas la valeur de race de Pokemon, vous devez rechercher Google un par un, ce que j'ai trouvé gênant. J'ai donc commencé à penser qu'il serait pratique d'avoir un chat bot qui me dit de manière interactive la valeur de la course.

Objectif

Il y a trois objectifs principaux.

Plus précisément, les parties et les connaissances qui peuvent être utilisées pour le développement comprennent "Pokemon Race Value Database" et "Common Pokemon Name Mistakes". (Je veux corriger le nom Pokemon correct en sachant comment faire une erreur dans un nom Pokémon commun)

Dessin d'achèvement

Livre illustré de [nom de Pokémon] Si vous cliquez sur le chat, il vous indiquera la valeur de course de Pokemon. IMG_0468.jpg Pour le moment, je ne l'ai installé que sur le serveur Discord que j'exécute. Introduction du serveur Discord "Gatserver" pour Pokemon Gachi Environ 200 personnes, dont plusieurs personnes qui ont connu la première place de la saison, participent.

[github](https://github.com/ryoYAMAZAKI11/Pokemonbot )

environnement

【local】 MacOS Catalina Ver. 10.15.4 Python Ver. 3.7.7 【serveur】 J'ai rendu le bot résident sur xserver en suivant la procédure sur le site suivant. https://ogapsan.com/archives/1077

la mise en oeuvre

Quand j'ai recherché avec Discord Bot, Python semblait amusant. À l'avance, j'ai sauvegardé les données de valeur de course de Pokemon en tant que base de données dans le fichier json, et je l'ai fait "retirer les données de valeur de course et les faire réagir au Dicord Bot" en Python.

Base de données des valeurs de course

Créé en référence au livre d'images national de capture approfondie de Pokémon.

Partie de la base de données


{
...

"Lézard humain":{"No":"4","Nom du Pokémon":"Lézard humain","HP":"39","attaque":"52","la défense":"43","Attaque spéciale":"60","Défense spéciale":"50","Agilité":"65","total":"309"},
"Lézard":{"No":"5","Nom du Pokémon":"Lézard","HP":"58","attaque":"64","la défense":"58","Attaque spéciale":"80","Défense spéciale":"65","Agilité":"80","total":"405"},
"Lizardon":{"No":"6","Nom du Pokémon":"Lizardon","HP":"78","attaque":"84","la défense":"78","Attaque spéciale":"109","Défense spéciale":"85","Agilité":"100","total":"534"},

...
}

Corps du bot livre d'images Pokemon

https://qiita.com/1ntegrale9/items/9d570ef8175cf178468f J'ai installé discord.py à partir de l'acquisition du jeton de bot en référence à.

Le code source est ci-dessous

main.py


import sys
import discord
import json
from collections import OrderedDict
import pprint
import re
import bot_token

client = discord.Client()

@client.event
async def on_ready():
    print('Logged in as', file=sys.stderr)
    print(client.user.name, file=sys.stderr)
    print(client.user.id, file=sys.stderr)
    print('------', file=sys.stderr)
    
@client.event



async def on_message(message):
    #Je ne veux pas réagir si l'expéditeur est un bot
    if message.author.bot:
        return
    #Découvrez s'il commence par "livre d'images"
    if message.content == 'Livre d'images de Zakoyama':
        message_send = "Lotto, le créateur de ce bot!" + "\n" + "Lotto à nous contacter sur Twitter pour tout problème!"+ "\n" + "https://twitter.com/zakoyama_com"
        
    elif re.match('.+Livre d'images$', message.content):
        json_open = open('pokedex_zen.json', 'r')
        json_load = json.load(json_open)    
        #Obtenir le nom du Pokémon à partir du message (supprimer la partie "livre d'images")
        m = message.content[0:len(message.content)-3]
        
        #Envoyer un message au canal auquel le message a été envoyé
        if m in json_load:
            message_send = "```"
            for key, value in json_load[m].items():
                if key == 'No':
                    message_send = message_send + '%s.%s'%(key, value) + ' '
 elif key == 'Nom Pokemon':
 message_send = message_send + '% s'% (valeur) + "\ n" + 'HP Attack Defense Special Attack Special Defense Quick Total \ n'
                elif key == 'HP' :    
                    message_send = message_send + '%3d'%(int(value))
                else:    
                    message_send = message_send + '%4d'%(int(value))
                    
            message_send = message_send + "```"
            print('0 ' + m)#Se connecter
        else:
            message_send = "Lotto où aucun Pokémon ne peut être trouvé!"
            print('1 ' + m)#Se connecter
            
    await message.channel.send(message_send)
    
client.run(bot_token.TOKEN)

bot_token.py


TOKEN = "Jetons obtenus ici"

Point 1: Déclenchez le livre d'images de [nom Pokémon]

La plupart des utilisateurs sont japonais et tapent à partir de leur smartphone, donc les commandes comme ! P '' qui sont courantes dans les bots Discord ne sont pas bonnes. J'ai pensé. Par conséquent, le bot répond avec le livre d'images de [nom de Pokemon] '' `` qui est facile à saisir même à partir d'un smartphone.

main.Extrait de py


    elif re.match('.+Livre d'images$', message.content):

De cette façon, il est extrait à l'aide du module d'expression régulière re```.

main.Extrait de py


    #Obtenir le nom du Pokémon à partir du message (supprimer la partie "livre d'images")
    m = message.content[0:len(message.content)-3]

Le nom Pokemon a été stocké dans la variable `` m``` en supprimant la partie "livre d'images" à trois lettres de la fin.

Point 2: rendre la valeur de la course aussi facile à voir que possible

Dans Discord, la largeur des caractères des alphabets et des espaces diffère selon le type. Par conséquent, le simple fait de les organiser entraînera une grande déviation comme celle-ci. IMG_0594.jpg J'ai donc utilisé le bloc de code Discord. "```Si vous le placez entre ", il devient un bloc de code. La taille de l'alphabet et l'espace demi-largeur sont unifiés, et la taille des caractères japonais est également plus petite, ce qui facilite la visualisation. IMG_0595.jpg Cependant, la taille du japonais pleine largeur et des alphabets et des espaces demi-largeur est de 2:Puisqu'il n'est pas 1, il semble qu'il changera un peu en essayant de le traduire en japonais. Il est implémenté comme suit dans le code source.

main.Extrait de py


 #Envoyer un message au canal auquel le message a été envoyé
        if m in json_load:
            message_send = "```"#Démarrez le bloc de code ici
            for key, value in json_load[m].items():
                if key == 'No':
                    message_send = message_send + '%s.%s'%(key, value) + ' '
                elif key == 'Nom du Pokémon':
                    message_send = message_send + '%s'%(value) + " \n"  + 'HP Attack Defense Special Attack Special Defense Quick Total\n'
                elif key == 'HP' :    
                    message_send = message_send + '%3d'%(int(value))
                else:    
                    message_send = message_send + '%4d'%(int(value))
                    
 message_send = message_send + "` `` "# Fermez le bloc de code ici

###Point 3: le journal est une sortie standard Si c'est vrai, je voulais enregistrer un journal et le faire comme "Classement Pokémon qui est beaucoup recherché", mais je n'ai pas l'impression de pouvoir le faire immédiatement, et le but de la journalisation est "Je veux savoir comment faire une erreur dans un nom Pokémon commun" Par conséquent, j'ai décidé d'enregistrer la sortie standard en crachant un journal. Il est craché avec la fonction d'impression comme suit.

main.Extrait de py


 print ('0' + m) # Pour enregistrer
...

 print ('1' + m) # Pour enregistrer

Si Pokémon est trouvé0, Si non trouvé1Vous pouvez vérifier "les erreurs courantes dans les noms de Pokémon". (Si vous effectuez un traitement de texte, vous pouvez également connaître le Pokémon qui est beaucoup recherché)

Une partie du journal


 0 Rotom thermique
 0 Galados
 0 Chiracino
 0 Yukimenoko
 1 Arora Kyukon
 0 Kyukon
 0 baiser d'épine

Lors de l'exécution sur le serveur pour prendre ce journal, exécutez la commande suivante.

nohup python3 main.py 1>> out.log 2> /dev/null &

avec çaout.logEst connecté. #Réalisation du but J'ai présenté ce Bot pendant environ 2 mois. Vérifiez le niveau de réalisation pour chacun des trois objectifs.

-Réduction des efforts de recherche -Activation du serveur Discord -Acquérir des pièces et des connaissances pouvant être utilisées pour un développement futur

###Réduction des efforts de recherche C'est assez simple. Vous n'avez pas besoin de rechercher sur Google, c'est donc facile. Cependant, étant donné que la valeur de la race ne suffit pas à elle seule comme information et que je veux connaître la technique et les caractéristiques, je peux finir par faire une recherche sur Google. C'est un problème futur.

###Activation du serveur Discord Au début de l'introduction du bot, le nombre de participants était d'environ 20, mais il dépassait 200. Il est devenu assez actif. On pense que l'une des raisons est que les tweets en cours de création ont reçu beaucoup de RT. Tweets étendus

###Acquérir des pièces et des connaissances pouvant être utilisées pour un développement futur J'ai pu créer une liste des valeurs de race Pokémon.

Quant au journal, quand je l'ai vérifié et que je n'ai trouvé aucun Pokémon, il était rempli de 80% de matériau inférieur et était inutile. Probablement le déclencheurLivre d'images deParce queIl semble qu'il y ait des gens qui jouent avec des mots obscènes dans le rôle de.

#Résumé Il a été créé en une semaine et ajusté tout en étant introduit pendant environ deux mois. J'ai fait quelque chose avec une fonction décente, mais honnêtement, cela ne fonctionne pas très bien (environ une fois par jour). Je vais continuer à l'améliorer sans faute.

Ce qui m'a impressionné, c'est que lorsque le tweet était RT, beaucoup de gens ont dit qu'ils voulaient l'utiliser, mais peu l'ont utilisé. Je me suis parfaitement rendu compte que les besoins que les gens disent et les vrais besoins qui sont réellement nécessaires peuvent être différents.

Recommended Posts

[Discode Bot] J'ai essayé de créer un Bot qui me dit la valeur de race de Pokemon
J'ai fait un bot mou qui m'informe de la température
J'ai créé un bot LINE qui me dit le type et la force de Pokémon dans la région de Garal avec Heroku + Flask + PostgreSQL (Heroku Postgres)
Je veux un bot Slack qui calcule et me dit le salaire d'un emploi à temps partiel à partir du calendrier de Google Agenda!
Depuis que j'ai commencé à travailler à des moments différents, j'ai créé un Bot qui me dit l'heure de quitter le travail
[Python] J'ai créé un robot qui me dit la température actuelle lorsque j'entre un nom de lieu sur LINE
L'histoire de la création d'un Line Bot qui nous raconte le calendrier de la programmation du concours
Créez un BOT qui raccourcit l'URL Discord
Création d'un bot Slack qui confirme et notifie à AWS Lambda la date d'expiration d'un certificat SSL
[Go] Créez un outil qui renvoie la valeur de course du Pokémon reçu de l'entrée standard
[Python & SQLite] J'ai analysé la valeur attendue d'une course avec des chevaux dans la fourchette 1x win ②
J'ai essayé de créer un Discord Bot sur Docker qui signale le nombre de personnes infectées par corona à Tokyo à un moment spécifié
Lors de l'incrémentation de la valeur d'une clé qui n'existe pas
J'ai créé un robot Twitter qui marmonne le Pokémon capturé par #PokemonGO
J'ai créé un robot Line qui devine le sexe et l'âge d'une personne à partir de l'image
J'ai fait un calendrier qui met à jour automatiquement le calendrier de distribution de Vtuber
J'ai écrit un lecteur de corpus qui lit les résultats de l'analyse MeCab
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
[Python & SQLite] J'ai analysé la valeur attendue d'une course avec des chevaux dans la fourchette 1x win ①
J'ai créé un LINE BOT qui renvoie une image de riz terroriste en utilisant l'API Flickr
L'histoire de l'adresse IPv6 que je souhaite conserver au minimum
J'ai créé un SlackBot qui m'informe chaque semaine des informations sur le concours AtCoder
Avec LINEBot, j'ai fait une application qui m'informe de "l'heure du bus"
J'ai créé un Linebot qui m'informe des sites d'évacuation à proximité sur AWS
Créez un BOT qui affiche le nombre de personnes infectées dans le nouveau Corona
J'ai créé une fonction qui divise assez bien une copie maladroite d'un texte PDF.
J'ai créé une application Twitter qui décrypte les caractères de pré-connexion avec heroku (échec)
[Python / C] J'ai créé un appareil qui fait défiler sans fil l'écran d'un PC à distance.
J'ai fait un calendrier qui met à jour automatiquement le calendrier de distribution de Vtuber (édition Google Calendar)
Une histoire qui réduit l'effort de fonctionnement / maintenance
[Python] Un programme qui compte le nombre de vallées
#Une fonction qui renvoie le code de caractère d'une chaîne de caractères
LINE Bot qui vous informe des stocks d'intérêt
Générer cette forme du fond d'une bouteille pour animaux de compagnie
Un mémo que j'ai touché au magasin de données avec python
L'histoire selon laquelle la valeur de retour de tape.gradient () était None
Une histoire qui a analysé la livraison de Nico Nama.
[Python] Un programme qui compare les positions des kangourous.
Lorsque j'ai créé un scan ECR à partir d'un CDK, je pouvais voir l'arrière du scan
J'ai créé une API avec Docker qui renvoie la valeur prédite du modèle d'apprentissage automatique
Un outil qui transforme automatiquement le gacha de Soshage
Code qui définit les valeurs par défaut en cas d'AttributeError
Un diagramme de réseau a été créé avec les données du COVID-19.
Trouver l'index de la valeur maximale (valeur minimale) d'un tableau multidimensionnel
J'ai fait une fonction pour vérifier le modèle de DCGAN
J'ai fait une image ponctuelle de l'image d'Irasutoya. (partie 1)
J'ai essayé un peu le comportement de la fonction zip
J'ai fait une image ponctuelle de l'image d'Irasutoya. (partie 2)
Extraire la valeur de dict ou list sous forme de chaîne de caractères
L'histoire de la création d'un bot de boîte à questions avec discord.py
Script Python qui compare le contenu de deux répertoires
J'ai écrit un script qui divise l'image en deux
J'ai essayé de créer un site qui permet de voir facilement les informations mises à jour d'Azure
Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
Publiez le script shell créé pour réduire les problèmes de création de LiveUSB sous Linux
J'ai essayé l'analyse d'image du livre de score de tir à l'arc (un livret qui enregistre les résultats des coups). (Google Colaboratory)