Ça va être tout noir !

TA GUEULE !

Quand on récupère une réplique culte pour créer un bot rigolo sur Discord …

L’idée

Bon, vous n’êtes pas sans savoir qu’au vu de la situation sanitaire, le gouvernement a mis en place un couvre feu dans certaines grandes agglomérations. Du coup, vu que je ne peux plus aider le petit commerçant du coin en buvant des pintes jusqu’à tard dans la nuit, j’ai utilisé ce temps pour coder un petit bot rigolo ! Le principe est simple : Envoyer un message tous les jours à 21h00 « Ca va être tout noir ! » … (il s’agit d’une référence à ce flim.)

 

Préambule

On en avait déjà parlé dans un précédent article à propos de Python mais je vais quand même le rappeler :

  • Je ne suis pas développeur. Je fais un peu de code des fois pour rigoler sur mon temps libre ; mais disons que je code avec les pieds. J’ai pas mal bidouillé avec le langage VBA sur Excel. Autant dire : c’est pas glorieux.
  • Par la suite, vous verrez qu’on va utiliser Node.js ; sachez qu’il y a 24 heures, je ne savais même pas que ce truc existait. Autant dire que je pars de loiiiiin.
  • Je ne compte pas vous apprendre à coder dans cet article, mais à vous expliquer le cheminement et comment je m’y suis pris.
  • Pour information je suis sous Linux Mint 19.04 (mais ca doit pouvoir se faire avec d’autres OS)
  • J’imagine qu’il y a plein d’autres moyens d’arriver au résultat final. C’est une façon de faire, c’est certainement pas la meilleure.
  • Je suis peut être en train de réinventer la roue. Il est fort  probable qu’il existe déjà une solution quelque part sur les internets…
  • J’espère que cet article vous apprendra des choses, et vous donnera des idées pour d’autres projets. N’hésitez pas à détourner son utilité première pour arriver à d’autres fins.
  • Enfin, cet article n’a pas pour but d’approuver ou de critiquer les décisions gouvernementales, ce n’est qu’un prétexte pour faire un robot rigolo.

 

Le projet

Alors, on va donc créer un bot qui , tous les jours à 21h00 , postera un message « Ça va être tout noir ! » sur mon salon Discord.

Discord ?

Oui alors JE SAIS : C’est pas libre. Néanmoins j’ai quelques personnes dans mon entourage qui utilisent ça, et j’ai installé un bridge entre Discord et Element (histoire que ce soit « un peu moins pire »). Mais bref, c’est pas le sujet, à la rigueur je pourrais en faire un article un autre jour.

 

Faire un bot

Par chance, on trouve tout un tas de ressources en ligne pour apprendre à créer un bot. Je me suis pas mal basé sur cet article.

En résumé il raconte quoi le début de cet article ?

  1. Avoir l’environnement Node.js sur sa machine (ça dépendra de votre système d’exploitation et vous trouverez ce qu’il faut ici.)
  2. Avoir un compte Discord (pas besoin d’un compte premium, le compte gratuit suffira)
  3. D’un éditeur de texte
  4. Ensuite via l’interface Développeur de Discord on va créer le bot (référez vous à l’étape 1 de l’article)
  5. On va faire tout ce qu’il faut , et on ajoute le bot à un salon « test »

Ça donne ça :

Étape 2

Pour l’étape deux, j’ai fait un peu différemment du tutoriel; j’ai tout fait graphiquement dans mon environnement de bureau ; à savoir :

  • Créer le dossier
  • Créer le fichier config.json (avec le token du bot)
  • Lancer le terminal depuis le dossier en question et lancer la commande npm init et npm install discord.js.
  • Créer le fichier index.js

Le fichier index.js contenant :

const Discord = require(« discord.js »);
const config = require(« ./config.json »);
const client = new Discord.Client();

client.login(config.BOT_TOKEN);

Ça donne ça :

Il est vivant !

Bon maintenant, on va lancer le bot. J’ouvre le terminal depuis ce dossier, je tape node index.js ; et je regarde sur mon serveur discord et… TADAAA ! Le bot est en ligne 🙂

Ensuite, j’ai arrêté de suivre le tuto. Vous pouvez bien sur continuer de vous amuser ; mais le tuto en question fait répondre le bot à des commandes utilisateurs. Or moi je veux faire quelque-chose de beaucoup plus simple : lui faire dire des trucs à intervalles réguliers.

 

Faire répéter des trucs à intervalle régulier

Bon, j’ai fait mes petites recherches sur les internets pour voir comment on fait . Car je ne parle pas le js donc je vais juste recopier des petits bouts de trucs et les assembler ensemble pour tenter d’arriver à mon résultat.

Je suis tombé là dessus. … Bon… Qu’est ce qu’on y apprend ? Je laisse tomber le code (je n’y comprends rien) mais je regarde les deux philosophies proposées : Cron et setInterval.

 

setInterval

L’idée consiste à mettre un minuteur sur le bot, qui se remet à zéro toutes les 24 heures ; et avec une petite bidouille, s’arranger pour qu’il poste le message pile à l’heure que l’on souhaite. Et hop le minuteur refait un cycle de 24 heures.

 

Cron

Cron est un programme que l’on retrouve sur Linux notamment qui permet de lancer des actions à des heures, ou à des intervalles précis. Par exemple, on peut lancer une action une fois tous les deux mois (pour faire une sauvegarde par exemple).

L’idée ici consiste à faire un bot qui se réveille, poste le message, et se rendort. En parallèle je demande à Cron de « réveiller » le bot tous les jours à 21h00.

 

Quel solution on prend ?

Par analogie, c’est comme si on devait éclairer une allée de garage :

  • La methode SetInterval consiste à mettre un minuteur de 20h00 a 7h00 du matin (grosso modo : quand il fait nuit) et la lampe va rester allumé toute la nuit.
  • La méthode Cron consiste à mettre un détecteur de mouvement qui allumera la lampe seulement quand c’est nécessaire.

Je vais donc utiliser la méthode Cron car j’ai pas envie qu’un processus tourne en tâche de fond pour juste « attendre ».

 

Le code

Je me suis inspiré de ce qu’on a trouvé là pour la méthode Cron. Et j’ai voulu le simplifier encore plus. J’ai fait quelques recherches (j’ai cherché surtout des exemples) pour comprendre comment le js fonctionnait. L’idée était de se passer des vérifications( bon channel, bon salon). Juste t’envoie le message, et tu te déco. Voilà ce que ça donne :

/*
CA VA ETRE TOUT NOIR
*/

// Import the discord.js module
const Discord = require(« discord.js »);

// Import the config (for bot token btw)
const config = require(« ./config.json »);

// Create an instance of a Discord client
const client = new Discord.Client();

// Check if the bot is Ready and send the message in the log
client.on(‘ready’, () => {
console.log(‘I am ready!’);
sendMessage();
});

// Sending the message and destroy
function sendMessage(){
channel = client.channels.cache.get(‘CHANNELID‘);
channel.send(‘@everyone CA VA ETRE TOUT NOIR ! #couvrefeu’).then(() => {
client.destroy();
})
}


// Log our bot in
client.login(config.BOT_TOKEN);

 

Attention, il faut remplacer CHANNELID par l’identifiant du channel dans lequel vous souhaitez que votre bot poste le message.

L’identifiant du channel

Comment fait on pour récupérer cet identifiant ? Et bien il faut d’abord activer les options développeur dans discord. Pour cela il faut se rendre dans les paramétres (icone Engrenage) ; puis dans Apparence ; et enfin activer le mode développeur.

Une fois que ce mode est activé, vous pouvez faire un clic droit sur n’importe quel channel et récupérer l’identifiant unique à ce channel.

On essaye ?

Il ne reste plus qu’a lancer le terminal et une nouvelle fois taper node index.js si tout est bien paramétré correctement, vous verrez un message dans votre terminal « I’m ready » , votre bot se connecter, envoyer le message, et de déconnecter aussitôt ! Si ca ne marche pas, vous devriez voir l’erreur dans votre terminal. Vérifiez que vous avez bien mis le CHANNEL ID entre les apostrophe ‘ ‘ .

Ca marche !

Bon maintenant, il faut trouver une solution pour que la commande node index.js s’envoie toute seule tous les jours à 21h00… C’est là qu’intervient Cron !

 

Automatiser la chose : préparer le terrain

Je ne vais évidemment pas rester devant mon écran et lancer le bot dés que 21h00 sonne. Non. Je vais héberger mon bot sur mon petit serveur à la maison : un Olimex Lime2. On en avait déja parlé ici. C’est un tout petit ordinateur qui consomme 5 Watts environ (donc trés peu, ca doit représenter environ 5€ / an d’électricité (c’est un calcul réalisé à la louche mouillée)) . Il reste allumé en permanence et ca sera donc parfait pour envoyer le message à intervalle régulier.

On en avait déja parlé tout à l’heure, vu que cette petite machine n’a pas une puissance extraordinaire, c’est intéressant de ne pas utiliser une fonction comme SetInterval qui obligerait à maintenir le bot allumé tout le temps. (Si vous voulez faire ça, tournez vous vers PM2 par exemple)

Bon alors, je me connecte via SSH à mon petit olimex lime2 et je vais devoir réinstaller node.js et npm. Mais cette fois en ligne de commande.

Je me suis inspiré de ça pour taper :
curl -sL https://deb.nodesource.com/setup_12.x | sudo bash -

Puis :
sudo apt-get install nodejs

Et enfin je me suis inspiré de ça (le même tuto qu’au début de cet article) pour créer mon répertoire, et remettre en place les différents fichiers nécessaires.

Enfin, j’ai créer le fichier index.js ; mais cette fois ci j’ai tout simplement copier/coller ce qu’on avait déja fait sur notre machine de développement. (On aurait pu aussi transférer les fichiers avec SCP par exemple.)

Maintenant, si dans notre terminal connecté via SSH à notre serveur on tape node index.js ca devrait marché.

Néanmoins, la commande ne se lancera pas toute seule tous les jours à 21h00

 

Automatiser la chose : Crontab

Bon alors, aprés diverses recherche sur Crontab, j’ai compris comment ça marche. C’est pas trés difficile. Il faut bien comprendre la syntaxe suivante :

# Exemple :
# .---------------- minutes (0 - 59)
# |  .------------- heures(0 - 23)
# |  |  .---------- jour du mois (1 - 31)
# |  |  |  .------- mois (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- jour de la semaine (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  *  commande à exécuter

Ou autrement :

mm hh jj MMM JJJ [user] tâche > log

Plus d’information ici.

 

Bon alors, nous on veut envoyer tous les jours à 21h00 :

  • La premiére étoile, celle des minutes, sera donc à 00
  • La seconde étoile, celle des heures, sera à 21
  • Le reste , on laisse les étoiles pour que cela s’execute à chaque jour de chaque mois, quelque soit le jour de la semaine (oui on peut faire des trucs tordu genre le premier mardi de chaque mois si on le souhaite)

Si vous avez un peu de mal à imaginer ce que ça donnerait, vous pouvez utiliser ce site. Ici, on voit bien que si je met 00 21 * * * , ca correspond bien à ce que je veux faire.

Editons le fichier Crontab

Il suffit de taper crontab -e et de rajouter tout à la fin de ce fichier notre nouvelle ligne :

00 21 * * * bash discordbot/launchbot.sh > discordbot/botlog.log

Au début, vous remarquez la régle c’est à dire « tous les jours à 21h00 » . Ensuite le chemin vers le script qui lancera notre bot, puis le chemin vers les log. Bien sur, c’est à ajuster selon votre configuration !

Avec ça, tous les jours à 21h00, crontab va lancer le script « launchbot.sh ». Il ne nous reste plus qu’a écrire ce dernier !

 

Créons le script !

Aprés quelques recherches sur internet, j’ai vu que c’était enfantin. Pas grand chose à dire, voilà à quoi il ressemble :

#!usr/bin/env sh

node ~/discordbot/index.js

 

CA VA ETRE TOUT NOIR !

Voilà, normalement tout est bon. Il ne reste plus qu’a patienter tranquillement et…

Evidemment, faut penser à un détail : vérifier bien que votre serveur est sur le bon fuseau horaire (et donc à la bonne heure). Pour vérifier ça, vous pouvez taper date. (Voilà pourquoi mon message a été envoyé à 23h00 et non à 21h00 … Ne faites pas la meme erreur que moi !)

 

Conclusion

Voilà, c’est tout pour moi. J’espere que cet article (bien que brouillon) vous a apporté deux ou trois trucs. A bientot pour de nouvelles aventures !

2 réflexions sur “Ça va être tout noir !

  1. Pingback: Bilan de 2020 | Oursoïde

  2. Pingback: Helios 64 / Part 6 : Gérer les pannes électriques | Oursoïde

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s