Programmer un bot Discord en Python

Discord est un réseau social de plus en plus utilisé par les lycéens. La programmation d’un bot pouvant se faire en Python, c’est un outil idéal pour faire des projets en mathématiques, comme en SNT ou en NSI.

Côté Discord, que faire ?

  • Avoir un compte Discord
  • Se créer un serveur Discord.
  • Se rendre à la page https://discord.com/developers/applications :
    • Créer une application.
    • Dans les configurations de l’application créée, dans l’onglet Bot, ajouter un bot.
    • Copier le token. On en aura besoin plus tard !
    • Dans l’onglet OAuth2 :
      • Dans Scopes, choisir “Bot”.
      • Dans Bot permissions, choisir ce qui vous semble utile, au moins ce qui concerne les messages.
      • Copier l’url
  • Dans le navigateur :
    • Coller l’url
    • Choisir le serveur dans lequel vous voulez inscrire le bot
    • Confirmer que vous bien un humain si c’est le cas.
    • Votre bot doit apparaître à ce stade comme utilisateur hors ligne de votre serveur.

Côté Python, que faire ?

  • Installer le module discord.
  • Créer un dossier pour votre application.
  • Dans ce dossier, on trouvera :
    • le fichier python main.py
    • le fichier token.txt
  • Dans le fichier token.txt, coller le token du bot créé.
  • Éditer votre fichier main.py.
  • Exécuter votre fichier main.py
  • Si tout se passe bien, votre bot sera en ligne et pourra commencer à agir !

Une version minimale de main.py

Dans cette version, il vous faudra peut-être :

  • Modifier le préfixe des commandes. Pour moi, un exemple de commande est “!coucou” (sans les apostrophes).
  • Remplacer le nom du salon pour le message de connexion.
import discord
from discord.ext import commands
import sys

#-------------------- on récupère le token
with open("token.txt","r",encoding="utf-8") as fichier :
	token= fichier.readline()

#-------------------- on choisit le préfixe pour nos commandes, ici !
bot = commands.Bot(command_prefix="!")

##########################################################################
# à la connexion
##########################################################################
@bot.event
async def on_ready():
	channel = discord.utils.get(bot.get_all_channels(), name="général")  #remplacer "général" par le nom du salon
	await bot.get_channel(channel.id).send("Bonjour à tous !")
	print(f"{bot.user.name} est prêt.")  


##########################################################################
# en cas d'erreur dans les commandes
##########################################################################
@bot.event
async def on_command_error(ctx,error):
	if isinstance(error,commands.CommandNotFound):
		await ctx.reply("Vérifier votre commande.")
	else :
		raise error


##########################################################################
# Coucou
##########################################################################
@bot.command(name="coucou")
async def bonjour(ctx):
	reponse=f"Ça va, {ctx.message.author.name} ?"
	await ctx.reply(reponse)
	print(f"Réponse à message {ctx.message.id} : {reponse}")

##########################################################################
# Déconnexion
##########################################################################
@bot.command(name="exit")
async def exit(ctx):
	reponse="Bot déconnecté. Bye Bye !"
	await ctx.reply(reponse)
	await bot.close()
	print(f"Réponse à message {ctx.message.id} : {reponse}")


##########################################################################
##########################################################################
##########################################################################
# Exécution du bot
##########################################################################
##########################################################################
##########################################################################

bot.run(token)

Exemple de commande avec des paramètres

La somme de deux nombres. Par exemple : !somme 2 3

##########################################################################
# somme
##########################################################################
@bot.command(name="somme")
async def somme(ctx,val1:int,val2:int):
	reponse=f"{val1} + {val2} = {val1+val2}"
	await ctx.reply(reponse)
	print(f"Réponse à message {ctx.message.id} : {reponse}")