Bots Discord V4 - Bâtir et héberger plusieurs bots Discord dans un seul script Python

Par Mitch Schwartz Mis à jour :
Ancien tutoriel — conservé à titre de référence.

En mode agile, pas question de vous faire attendre si cette vidéo peut déjà vous servir, alors en voici;

REPÈRES TEMPORELS : ‍[00:03) - Aperçu

‍[01:20) - comment garder plusieurs bots en ligne

‍[05:50) - Déclencher des actions de bot avec des tâches cron

‍[07:37) - Obtenir la valeur des jetons avec l’API de Nomics et mettre à jour le nom de nos bots Discord

‍[13:38) - Bot de compte à rebours hebdomadaire pour Discord

‍[20:16) - Récupérer les événements de Discord et trouver l’heure de début du prochain événement

LiensVous trouverez Cryptoraiders à https://cryptoraiders.xyz/) ou sur Discord à https://discord.gg/NV3VWA5cNA

‍)Base de code ‍https://replit.com/@MitchSchwartz/Rai…)

‍

‍

‍

Transcription

‍

Salut, bon retour, tout le monde. Bon. Comme vous l'avez peut-être vu dans la dernière vidéo, euh, au moment de l'enregistrement, assez drôle, je ne comprenais pas complètement, euh, le script que j'avais, euh, créé. Mais je suis allé un peu plus loin et, euh, je me suis dit : hé, je, je peux non seulement comprendre ça, mais, vous savez, Integromat arrivait à faire des mises à jour toutes les heures.
Et en fait, ça pourrait se faire toutes les cinq minutes, mais ça aurait coûté vraiment cher. Alors comment on pourrait faire un bot qui se met à jour chaque minute? Euh, un des projets, c'était de créer un bot de compte à rebours qui se réinitialise au même moment chaque semaine. Et pour faire ça, oui, un minuteur qui se met à jour toutes les demi-heures, ce n'est pas aussi bon qu'un minuteur qui se met à jour chaque minute.
Et dès que j'ai trouvé comment faire. Ben, pourquoi on ne prendrait pas ça pour l'appliquer aussi aux bots de mise à jour des jetons, pour avoir des prix minute par minute? Euh, et laissez-moi. J'imagine que ç'aurait été une bonne idée de commencer par ça, mais laissez-moi l'ouvrir maintenant pour vous montrer le résultat final des trois bots.
Donc, euh, ici, regardez. Si on passe à Discord, qui, voyons voir sur quelle page ça s'ouvre. Je vais peut-être couper ça au montage. Peut-être pas. Bon. Euh, j'espère que mon visage ne les cache pas, mais vous voyez, euh, les trois bots ici. Donc, euh, ça, c'est le bot minuteur. Ceux-là, ce sont les bots de jetons, et ils se mettent bien à jour chaque minute.
Maintenant, revenons. À Replit, où j'héberge encore tout ça. Replit mentionne assez explicitement, quand on démarre, que ce n'est pas un serveur de production. Pour l'instant, je fais rouler ces bots seulement sur un serveur de test et sur un. Autre serveur Discord. Donc je pense que ça va passer pour le moment. Bientôt, je vais probablement migrer tout ça, euh, vers un endroit un peu plus permanent, comme, euh, nos serveurs Pragma Flow, euh, pour l'instant.
Bon, voilà. Donc, donc on y va. On a fait quelques mises à jour à la fonction principale. Euh, et je ne pense pas que je vais commencer par ça tout de suite. Euh, donc, premièrement, allons voir les mises à jour qu'on a faites au bot de jetons. Euh, vous voyez que j'ai un peu séparé le code.
Et, euh, ici on a, et j'ai déjà reçu de très bonnes suggestions sur la façon de, euh, refactoriser ça, et je, je, je ne l'ai juste pas encore fait. Donc je pense que je vais le faire dans la prochaine version. Euh, mais en gros, ce qu'on fait ici, c'est qu'on a écrit une fonction pour faire l'appel à Nomics, pour obtenir, euh, le prix du jeton chaque minute.
En gros, ce que j'ai fait dans Integromat dans la première vidéo, je l'ai simplement migré ici. Euh, ça a demandé un peu d'effort. Ici, il y a une, euh, espèce de gestion d'erreurs que je n'ai pas encore réglée. Alors je l'ai juste mise en commentaire. Euh, mais en gros, on définit l'appel. On l'envoie. Euh, on vérifie si c'est correct. Et, euh, sinon, on lève l'exception, et je vais rendre tout ce code disponible.
Et ensuite, ce qu'on fait, c'est, euh, Donc, comme je ne savais pas dans quel ordre Nomics allait m'envoyer les résultats. Euh, je pensais le savoir, mais ça ne restait pas constant. Alors j'ai juste mis quelques conditions de base ici. Je ferais probablement ça avec une boucle si c'était un peu plus élaboré. Euh, et j'ai commencé à essayer ça, mais je n'arrivais pas à le faire marcher.
Et comme le but, c'est vraiment de livrer.  et de passer à la prochaine étape. Euh, j'ai décidé qu'une fonction if ferait aussi bien l'affaire, euh, parce que, encore une fois, je connais les deux jetons que je cherche, c'est assez simple, et, vous savez, je n'ai pas besoin de faire ça à une échelle démesurée. Donc ici, si, euh, vous savez, la première entrée est, euh, pardon, si le nom de la devise de la première entrée est égal à Aurum, euh, Aurum deux.
Alors on assigne ça, euh, à la variable AP, et sinon, si, euh, la devise est égale à Raider, alors on l'assigne à l'autre. Donc une fois qu'on a bouclé sur les deux réponses qu'on va recevoir. Euh, vous savez, en gros, à la fin, j'ai mes deux valeurs assignées, et ensuite on fait un peu de mise en forme ici.
Je pense qu'il y a probablement une meilleure façon de faire ça. Euh, et ensuite, vous savez, juste un paquet de diagnostics, et, et j'ai ajouté ces sauts de ligne ici quand j'imprime, juste parce que quand c'est un gros bloc de texte, j'ai beaucoup de difficulté à le lire. Euh, c'est peut-être un petit côté TDA, mais je, je trouve que la structure, la structure visuelle, ça compte vraiment pour moi.
Euh, alors j'ai juste ajouté ces sauts de ligne partout pour que ce soit un peu plus facile à lire. Et j'ai aussi ajouté ces trois chevrons, parce que, encore une fois, ça rendait plus facile pour mon œil de voir, vous savez, ce qui se passe, et, et de repérer les parties que j'ai imprimées volontairement. Euh, alors voilà. Je mets à jour. Euh, j'appelle cette fonction de mise à jour du nom du bot, qu'on va regarder dans une seconde.
Et je lui passe les variables, euh, vous savez, ça, c'est ce que sera le surnom. Ça, c'est le jeton, et ça, c'est le serveur où je vais. Alors regardons la mise à jour du nom du bot. On a le nouveau nom qu'on veut envoyer. On a le nom du jeton, euh, qu'on met à jour, euh, pardon, le nom du jeton. C'est le jeton du bot, euh, pour qu'on puisse s'authentifier, et ensuite on a le serveur que je veux mettre à jour.
Donc, euh, ici, j'ai dit : si le serveur est explicitement, si je l'ai défini comme le serveur Crypto Raiders, euh, sinon, par défaut ou en solution de repli, c'est mon serveur de test. Ça me semblait plus prudent que les choses se rabattent sur le serveur de test plutôt que l'inverse. Euh, et ensuite ici, on a l'authentification, qui est la chaîne bot plus le jeton, que, euh, vous mettriez dans les secrets, euh, les variables d'environnement, et que vous référencez ensuite avec os, euh, environ.get.
Euh, et ensuite la version chaîne du nom du jeton. Et bien sûr, il faut importer os pour s'en servir, euh, pour envoyer les requêtes. Et c'est sur les deux pages, il faut importer requests. Euh, donc ce sont les bibliothèques qui sont utilisées. Euh, bon. Donc ça, c'est le, le, vous savez, l'appel au bot, et on met à jour le nom.
Euh, ici, et ensuite on vérifie juste qu'on a reçu un, euh, code de succès 200, euh, et on imprime la réponse, et c'est encore une fois juste pour le débogage. Donc c'est comme ça que le. Jeton. Oui, c'est comme ça que, euh, la mise à jour des jetons se fait. Et on peut aussi regarder le bot minuteur pour voir comment ils utilisent tous la même fonction d'appel.
Maintenant, si on regarde, j'ai importé quelques trucs : datetime, euh, dateparser, même si, euh, j'ai vu des versions qui n'utilisent pas dateparser, et en fait, dateparser est vraiment cool. Parce qu'il comprend un peu le langage courant. Comme ce que j'ai écrit. Euh, vous le voyez ici en bas, midnight CST, et il analyse ça. Euh, au départ je disais jeudi, parce que c'est, euh, pardon, mercredi.
Parce que c'était le moment de la réinitialisation, mais il ne choisissait pas le bon mercredi. Il choisissait soit le mercredi passé, soit, et ce n'était pas très fiable. Je vais probablement régler ça. pytz nous aide avec les fuseaux horaires. Et ensuite, euh, bien sûr, j'importe ma fonction de mise à jour du nom du bot. Donc la fonction de mise à jour du minuteur, euh, ce qu'elle va faire, c'est définir CST.
Elle prend l'heure actuelle en CST, parce que ça, ça va se réinitialiser à minuit le mercredi, en CST. Et c'est juste que, euh, souvent, le conseil, c'est de travailler, vous savez, de faire la conversion de fuseau horaire en dernier. J'ai essayé ça dans ce cas-ci, surtout parce qu'on tombe pile à minuit. C'était tellement plus simple de commencer en CST et d'y rester.
Donc, euh, on continue ici, euh, c'est quoi la suite? Ah oui. Euh, c'est un petit truc que j'ai ajouté. Je voulais tester le changement. Parce que la partie la plus délicate, c'est quand le minuteur arrive à zéro, il doit se réinitialiser à sept jours. Et, euh, plutôt que d'attendre et de pouvoir tester une fois par semaine, j'ai fait en sorte de pouvoir voir : hé, si le jour, c'est demain, euh, alors je devrais voir zéro jour, et ça me permet, euh, d'échanger, en gros, ma variable, euh, vous savez, demain égale maintenant.
Euh, plus un jour. Donc en gros, je fais passer mon heure de maintenant à demain. Je fais croire au système qu'on est demain. Euh, pour voir ce qui va se passer demain. Euh, j'espère que c'était clair. C'était peut-être un peu verbeux. Bon. On continue. Euh, donc oui, on veut trouver la prochaine date de réinitialisation, non? C'est là que j'utilise dateparser, parse midnight CST.
Euh, ça me donne cette valeur, et encore une fois, beaucoup de débogage et d'impressions ici, parce que. C'était vraiment délicat. Les calculs de dates, franchement, c'est une plaie. Euh, et donc, j'avais vraiment besoin de percer autant de trous que possible dans cette boîte noire. Euh, ensuite, c'est vraiment simple : temps avant la réinitialisation égale, euh, prochaine réinitialisation moins maintenant.
Donc c'est la différence en jours? Euh, donc, euh, ça, donc l'heure fonctionne, mais le jour ne fonctionnait pas vraiment là-dedans. Alors ce que j'ai fait, c'est de régler la logique de date séparément, ce qui, ce qui me semblait être la bonne décision. Euh, donc ici, s'il y a, euh, vous savez, parce que le jour de la semaine où je réinitialise, c'est mercredi, qui vaut deux.
Donc je dois gérer les choses différemment si on est avant mercredi ou après mercredi. J'ai reçu un, un code vraiment génial. Et ce qui a été suggéré, en gros, c'était de faire d'abord ce calcul, et ensuite de dire : si le jour est inférieur à zéro, on ajoute. C'est une autre façon de faire. Euh, j'ai essayé de l'intégrer, mais je devais changer trop de choses et je, euh, n'y suis pas encore revenu, mais, euh, c'est clairement, clairement quelque chose que je veux ajouter, euh, même si ça fonctionne vraiment de façon fiable de toute façon.
Euh, et ensuite oui, on compose la chaîne du minuteur. C'est, au bout du compte, le nom du bot. Donc notre variable de jours restants, euh, assignée ici, plus le. Temps avant la réinitialisation, point seconds. Euh, c'est divisé par 360, mais, euh, la double barre oblique élimine le reste. Euh, et ensuite, encore une fois, ici, on traite, euh, le, le reste de ce calcul avec, euh, la fonction modulo, et, euh, on assemble tout ça.
Donc on imprime la chaîne du minuteur. Et on fait la réinitialisation du nom du bot. On l'envoie au serveur Crypto Raiders, euh, et on l'envoie au serveur de test. Ouf. Bon. Euh, ça fait beaucoup de choses. Euh, et on n'a même pas fini. Il reste encore quelques morceaux. Si on va dans endpoints.py, euh, c'est, je ne sais pas si ça s'appelait server au départ ou quelque chose comme ça, mais je l'ai renommé endpoint parce que c'est essentiellement ce que ça fait.
Euh, je n'utilise pas celui-là, en bas, mais la route de l'app, chaque fois qu'on envoie un ping à l'URL racine, elle va exécuter ce qui suit. Euh, elle exécute la fonction home. Euh, et ça va imprimer running home. Ensuite elle va exécuter la fonction de mise à jour du minuteur. Ensuite, la fonction qui récupère la valeur des jetons.
Non? Donc si on, on suit le déroulement, chaque fois qu'elle reçoit un ping, elle va entrer dans la mise à jour du minuteur, faire tous ces calculs, ensuite appeler la mise à jour du nom du bot deux fois, et ensuite elle va. Appeler la récupération de la valeur des jetons. Et donc elle va passer à travers tout ça et appeler, euh, la mise à jour du nom du bot pour chaque jeton, pour chaque serveur.
Il y a clairement des façons de faire une boucle à la place. Et, et, euh, ça vaudrait clairement la peine de le faire plus tard. Bon. Enfin, si on va dans la fonction principale, ce qui se passe quand on démarre tout ça, c'est, euh, d'abord, ça dit déjà : I'm in. Donc ça donne juste cette confirmation.
Euh, ça, euh, ici aussi. Ça récupère le jeton et, et ça fait rouler le bot minuteur. Euh, ça fait client.run. Ça crée aussi la nouvelle instance du client en haut. C'est là que je ne suis pas encore tout à fait, euh, clair sur la façon exacte dont ça fonctionne, parce que je ne connais pas si bien la bibliothèque discord.py. En fait, je ne m'en suis pas beaucoup servi, parce que c'est du Python asynchrone et c'est encore un peu hors de ma portée.
Malgré tout, comme vous voyez, j'ai en fait commencé ça dans Integromat, alors je suis assez fier du chemin parcouru. Euh, ce que, ce que j'ai remarqué, c'est le client.run. Ça semble assez important pour garder le bot en ligne. Quand je l'ai mis en commentaire, ça a arrêté de fonctionner. Euh, j'ai été un peu surpris, parce que ce qui reçoit le ping ici, c'est, euh, vous savez, comme je l'ai montré dans l'autre vidéo, on a configuré un, euh, appel récurrent avec UptimeRobot.
Je vais vous montrer. En fait ici, j'ai. cron-job.org, pour pouvoir recevoir un ping chaque minute. Euh, et j'utilise aussi. En plus de cron-job.org, j'utilise UptimeRobot. Ce qui veut dire qu'il y a deux services qui envoient des pings et qui gardent ça en vie. Et ça l'a empêché de tomber, alors qu'avec UptimeRobot seul, euh, ça tombait tous les jours ou tous les deux jours, et ensuite, vous savez, je devais aller appuyer sur le bouton de démarrage.
Donc, euh, encore une fois, en regardant ici, quand on exécute ces fonctions, il n'y a en fait rien ici. Euh, je ne suis pas sûr de ce qui garde réellement le bot en vie. Ce que j'ai remarqué, euh, C'est que. Donc j'ai montré, vous savez, dans la partie deux, je vous ai montré comment je gardais le bot Raider en vie et comment je gardais le bot Aurum en vie.
Et ces. Serveurs roulent encore, juste pour garder les bots en ligne. Euh, je n'ai pas encore trouvé comment combiner tout ça dans cette seule routine. Donc toutes les mises à jour passent par ici, et si le bot tombe hors ligne, vous allez quand même voir le nom se mettre à jour. Le problème, c'est que le bot va descendre au bas de la liste des membres.
Donc ça devient beaucoup moins utile. Allons faire un tour sur cron-job.org.
Et on peut voir ici. Je les fais pointer vers les trois serveurs. C'est assez facile de créer une tâche cron, et vous pouvez la régler pour chaque minute. Une fois que c'est fait, vous avez vos mises à jour minute par minute. Euh, et encore une fois, utiliser UptimeRobot comme solution de repli, c'est une assez bonne idée. Ça a bien marché. Euh, ce qui est bien, C'est que si le serveur arrête de répondre pendant trois minutes, pour une raison ou une autre, euh, disons que Replit est surchargé ou, ou qu'il se passe autre chose, alors cron-job.org va basculer.
C'est là que c'est bien d'avoir UptimeRobot qui roule soit toutes les cinq minutes, soit, rendu là, vous, vous savez, toutes les demi-heures, juste pour avoir une espèce d'onde longue, euh, comme un ping à plus basse fréquence. Qui risque moins d'être coupé, et ça vous donne la chance de relancer cron-job avant que les deux tombent.
Euh, et pour tout cet effort pour garder le serveur en vie, euh, ce qui est peut-être un peu drôle et niaiseux, c'est que. Vous pouvez simplement passer à la version payante et, et l'option toujours actif coûte cinq dollars par mois. Donc je fais ça plus par orgueil qu'autre chose, parce que, franchement, le temps que j'ai passé à économiser 5 $ par mois vaut bien plus que ça.
Euh, mais vous savez, c'est juste le fun de trouver comment faire les choses gratuitement et, euh, d'avoir cette option. Alors voilà. C'est la prochaine évolution des bots Discord. Euh, c'est comment. Des bots qui se mettent à jour chaque minute, gratuitement, euh, ce qui est plutôt cool. Et, euh, dans des vidéos à venir, je pense que je vais commencer à faire des bots avec des actions.
On va montrer comment gérer ça, mais je suis pas mal sûr qu'on peut créer de nouvelles routes d'app ici. En gros, construire notre API. Euh, et, vous savez, commencer à envoyer différentes commandes, euh, à ces différentes routes, puis écrire les fonctions sur mesure pour elles. Je suis presque certain que c'est comme ça que ça marche. Il y a peut-être une autre façon, mais, euh, j'imagine qu'on va le découvrir bientôt et, euh, Euh, j'espère que la prochaine vidéo ne commencera pas par : ah oui, j'imagine que je me trompais dans la dernière.
Euh, donc de toute façon, euh, dans un cas comme dans l'autre, ça montrera que j'ai appris quelque chose. Donc, euh, on a fini. Merci d'avoir regardé. J'espère que vous avez appris quelque chose. Je vais partager ça dans les liens et, euh, n'oubliez pas de vous abonner et, euh, de laisser un j'aime et un commentaire. Si vous avez des questions, ça me fera plaisir d'y répondre. Et on va en sortir d'autres si vous les trouvez utiles.
Alors merci beaucoup.

‍