AtelierNum / nono

the resident bot of our discord 🤖
2 stars 1 forks source link

Participer à nono

Si vous souhaitez participer au développement de Nono, il faut d'abord le reproduire localement pour effectuer des tests avant d'envoyer une pull-request sur le repo.

  1. Dupliquer ce repo sur votre machine avec git pull https://github.com/AtelierNum/nono.git master
  2. Installer les dépendances : npm install.
  3. Reproduire le .env avec votre token de bot que vous aurez crée.
  4. Lancer l'app avec node mains.js.

Si vous voulez contribuer mais ne savez pas par où commencer vous pouvez regarder si il y a des issues portant le tag "good first issue". Il est tout à fait possible que le titre ou la description de la tâche ne soit pas claire, n'hésitez surtout pas à commenter vos questions dessus, c'est déjà du travail en soi et on vous en remerciera :D.

Créer un bot Discord

Il faut déclarer une application sur Discord pour pouvoir mettre en place un bot sur n'importe quel serveur. Cette application permettra de gérer les droits que vous lui donnerez et est identifiable avec le client_id ; le bot pourra être partagé à n'importe quel utilisateur Discord à partir de son token. Vous créez donc une nouvelle application ici. Nommez là, c'est mieux.

Une fois cela fait, vous pouvez vous rendre dans l'onglet Bot où vous pourrez ajouter un nouveau bot et lui donner un petit nom ainsi qu'un magnifique avatar. Vous pouvez maintenant récupérer le token du bot, le copier dans le .env et run l'app pour activer votre bot.

Il ne reste plus qu'à l'ajouter à votre serveur avec le lien suivant (en remplaçant le client_id): https://discord.com/oauth2/authorize?client_id=[le_client_id_de_votre_application_discord]&scope=bot

Comment créer une commande

commande simple

Pour créer une commande, créz un fichier .js dans le dossier /commands . Le nom de ce fichier sera le nom de votre commande. Par exemple /commands/repeat.js sera la commande repeat.

sous-commande

Pour créer une sous-commande, il faudra créer un dossier dans /commands pour votre famille de commandes, si elle n'existe pas déjà, puis mettre votre sous-commande dans ce dossier. Par exemple /command/arduino/led.js sera la commande arduino led.

Anatomie d'une commande

Une commande s'écrit sous la forme d'un module exportant au moins 2 proprietées :

command : est une chaîne de caractères definissant les paramètres positionnels que votre commande prend.

<mon_param> : est un paramètre obligatoire du nom de "mon_param" que vous pourrez recuperer plus tard comme ceci argv.mon_param . Il est obligatoire car il est entourré de <>

[autre_param] : ceci est un parametre optionnel du nom de "autre_param" que vous pourrez recuperer plus tard comme ceci argv.autre_param. Il est optionnel car il est entourré de []

[..le_reste] : si votre commande accepte un nombre undeterminé de paramètres, il vous sera possible de mettre un paramètre optionnel tout à la fin de vos paramètres et précédé par .. qui capturera dans un array/tableau (ici nommé "le_reste") tous les paramètres en excendant. Vous pourrez recuperer ce tableau par la suite via argv.le_reste

⚠️ notez que ces paramètres seront "positionnels" autrement dit c'est l'ordre dans lesquels vous les donnerez lors de l'appel qui determinera quelle valeur correspond à quel paramètre ⚠️

handler : est une fonction prennant argv en parammètre et qui s'exécutera lorsque votre commande sera appelée. C'est ici que vous décrirez ce que vous voulez que le bot fasse. argv contient tout le contexte dont vous avez besoin, nottament vos paramètres mais aussi des informations sur le message discord recolté par le bot via argv.msg.

À ces deux exports, il est recommandé d'y ajouter l'export suivant:

describe : Il s'agit simplement d'une chaîne de caractères qui explique ce que votre commande fait. C'est ce qui sera montré à côté de votre commande lorsque les utilisateurs taperont --help.

Pour des usages un peu plus avancés vous pouvez écrire une definition complète des paramètres de votre commande avec l'export ci dessous.

builder : est un objet prennant la description detaillée de vos paramètres permettant de definir plus que des paramètres positionnels. Chaque proprieté de cet objet est un paramètre qui lui même prend un objet definissant comment ce paramètre se comporte.

Example complet :

// ./commands/repeat.js
exports.command = '<sentence>'

exports.describe = 'repeat the sentence in the console'

exports.builder = {
  iterations: {
    default: 1,
    describe: "how many times the sentence is to be repeated",
    alias: 'i',
    type: "number"
  }
}

exports.handler = function (argv) {
  for(let i=0; i < argv.iterations; i++){
        console.log(argv.sentence);
    }
}

//repeat "F is for friends who do stuff together" -i 3
//donne :

// F is for friends who do stuff together
// F is for friends who do stuff together
// F is for friends who do stuff together