En raison de la décision de Discord d'appliquer les commandes slash pour les robots, j'arrêterai de développer ce projet. Cela signifie que je ne corrigerai aucun problème ou bug ni n'ajouterai de nouvelles fonctionnalités. Le projet restera sur GitHub mais il sera réalisé.
La principale raison pour laquelle j'ai pris cette décision est que la conversion du bot pour qu'il utilise des commandes slash m'obligerait à réécrire toute la logique de commande. Je n'ai ni le temps ni la motivation pour réécrire des parties importantes de la base de code. En plus de cela, dynoBot nécessite une maintenance assez lourde, en particulier en ce qui concerne le module de streaming musical qui dépend de nombreux autres packages npm qui ont tendance à tomber en panne.
Je vais donc malheureusement mettre ce projet de côté.
dynoBot est un bot Discord modulaire utilisant JavaScript et éventuellement Python et Lua. Il est construit de manière à ce que la création de nouveaux modules puisse être effectuée facilement dans un langage de script que vous préférez.
L’idée derrière le bot est de créer vous-même les modules dont vous avez besoin avec un minimum d’effort. Par conséquent, dynoBot peut être considéré comme un framework qui gère tout ce qui concerne l'API Discord, vous pouvez donc immédiatement commencer à développer vos propres modules.
Néanmoins, dynoBot peut être utilisé sans écrire une seule ligne de code tant que les modules inclus suffisent.
Le bot dispose actuellement des modules suivants :
Vous pouvez voir toutes les commandes disponibles en tapant "@BotName help" dans le chat Discord. Vous pouvez également consulter le fichier commands.json.
Vous avez d'abord besoin de nodejs et éventuellement de python3 pour les modules python et de lua pour les modules lua. Après l'installation, clonez ce référentiel et exécutez npm install
dans le dossier dynoBot
. Il devrait installer toutes les dépendances requises.
Pour exécuter le bot Discord, vous devrez ajouter le fichier security.json
dans le répertoire dynoBot/cfg
. Cela devrait ressembler à ceci :
{
"token" : " your discord bot token "
}
IMPORTANT : lorsque vous lancez ce projet, ne téléchargez pas le fichier security.json dans votre référentiel. Cela permettrait à d’autres de voler votre jeton Discord.
Si vous souhaitez utiliser le module Wolfram|Alpha, vous aurez également besoin de leur clé API dans security.json
. Vous pouvez demander une clé API Wolfram|Alpha gratuite ici.
Avec la clé API, votre security.json devrait ressembler à ceci :
{
"token" : " your discord bot token " ,
"wolframAlphaAPI" : " your api key "
}
Par défaut, tous les journaux sont écrits sur la console. Si vous souhaitez que les journaux soient écrits dans des fichiers journaux, vous devez activer la connexion dans security.json
comme ceci :
{
"token" : " your discord bot token " ,
"logging" : true
}
Vous pouvez maintenant démarrer le bot en utilisant la commande node main.js
dans le répertoire dynoBot
.
Vous pouvez créer des modules en JavaScript, Python ou Lua. Il existe deux types de modules, un module de discussion et un module hook. Un module de chat est exécuté chaque fois qu'un utilisateur envoie un message avec la commande correspondante. Un hook est automatiquement exécuté dans un intervalle spécifique. Ci-dessous, je vais vous montrer comment les créer en JavaScript, Python et Lua. Vous pouvez également consulter les exemples de modules pour JavaScript, Python et Lua inclus dans le projet.
Les modules JavaScript, Python et Lua nécessitent une entrée dans le fichier commands.json ressemblant à ceci :
{
"group" : " command-group-name " ,
"type" : " python " ,
"regex" : " py-example|python example " ,
"help" : " python example " ,
"path" : " src/py-modules/example-python.py " ,
"hidden" : false
}
Le contenu de la propriété help sera utilisé pour la liste des commandes. Si elle n’existe pas, la propriété regex sera utilisée.
La propriété group peut être utilisée pour autoriser le filtrage lors de l'utilisation de la commande help. Par exemple, il existe un groupe appelé « de base » comprenant toutes les commandes principales intégrées. Si vous souhaitez voir uniquement les commandes du groupe "de base" dans la liste des commandes, utilisez " help " au lieu de la commande d'aide normale.
Définir Hidden sur true exclura la commande de la liste des commandes.
Le module JavaScript a un accès direct au wrapper discord.js. La structure de base d'un module ressemble à ceci :
module . exports = {
run : function ( msg , client ) {
msg . getTextChannel ( ) . send ( "I received these parameters: " + msg . getContentArray ( ) ) ;
}
} ;
Le code exécuté lors de l'appel du module appartient à la fonction run. Les paramètres msg et client proviennent du chatbot-api-wrapper. Vous trouverez ici de plus amples informations sur la mise en œuvre.
Le module Python n'a pas accès au wrapper discord.js mais obtient les msg.contentArray
et msg.aRegexGroups
. La structure de base ressemble à ceci :
import sys
msg = sys . argv [ 1 ]. split ( "," ) # Array of input parameters
regexGroups = sys . argv [ 2 ]. split ( "," ) # Array of input regex groups
# insert code to handle the input parameters here
print ( "I received these parameters: " + str ( msg )) # This will be the msg that the bot sends
print ( "These are the regex groups" + str ( regexGroups )) # This is a second message that the bot sends
sys . stdout . flush () # cleanup
Comme vous pouvez le voir, l’impression oblige le bot à envoyer un message.
Le module Lua n'a pas non plus accès au wrapper discord.js mais obtient les msg.contentArray
et msg.aRegexGroups
. La structure de base ressemble à ceci :
-- Import lua module helper for splitting strings into arrays
require " src/utils/luaUtils "
local sMessage = arg [ 1 ] -- String of input parameters
local sRegexGroups = arg [ 2 ] -- String of input regex groups
local aMessage = utils . splitString ( sMessage , " , " ) -- Array of input parameters
local aRegexGroups = utils . splitString ( sRegexGroups , " , " ) -- Array of input regex groups
-- Insert code to handle the input parameters here
-- This will be the msg that the bot sends
print ( " I received these parameters: [ " .. tostring ( aMessage [ 1 ]) .. " , " .. tostring ( aMessage [ 2 ]) .. " ] " )
-- This is a second message that the bot sends
print ( " These are the regex groups: [ " .. tostring ( aRegexGroups [ 1 ]) .. " ] " )
Comme vous pouvez le voir, l’impression oblige le bot à envoyer un message. Dans l'ensemble, les modules Lua sont assez similaires aux modules Python.
Les modules JavaScript et Python nécessitent tous deux une entrée dans le fichier hooks.json ressemblant à ceci :
"technicalHookName" : {
"type" : " js " ,
"name" : " hookName " ,
"path" : " src/js-modules/yourModule.js " ,
"channel" : 0 ,
"interval" : 10000 ,
"running" : false
}
Le module JavaScript a accès à l'objet canal du wrapper discord.js. Le code exécuté lors de l'appel du module appartient à la fonction hook.
module . exports = {
hook : function ( channel ) {
channel . send ( "This js message is automatically sent in a specific interval" ) ;
}
} ;
La fonction hook est exécutée lorsque hooks.json possède un canal existant et est en cours d'exécution.
Le module Python n'a pas accès à l'objet canal, il ne reçoit aucune entrée. Il exécute simplement le script python et chaque appel d'impression crée un message de robot. Cela devrait ressembler à ceci :
import sys
# insert code to handle the input parameters here
# This will be the msg that the bot sends
print ( "This py message is automatically sent in a specific interval" )
sys . stdout . flush () # cleanup
Le module Lua n'a pas non plus accès à l'objet canal, il ne reçoit aucune entrée. Il exécute simplement le script Lua et chaque appel d'impression crée un message de robot. Cela devrait ressembler à ceci :
-- Insert code here
-- This will be the msg that the bot sends
print ( " This lua message is automatically sent in a specific interval. " )
Ceci est encore une fois similaire aux modules Python.
Oui, je vais revoir votre code et s'il est bon, je le fusionnerai dans le maître. Veuillez adapter votre style de code concernant les modules déjà existants.
Oui, c'est bien aussi. Mais ce serait bien si davantage de personnes pouvaient profiter de votre travail.