Créer des robots Discord de prix de jetons et de compte à rebours qui se mettent à jour chaque minute, avec un hébergement gratuit.
Par Mitch Schwartz
Mis à jour :
Ancien tutoriel — conservé à titre de référence.
URL Replit : https://replit.com/@MitchSchwartz/Rai…
)Avec Python, Replit, cronjob.org et uptime robot, vous pouvez créer et héberger gratuitement des robots Discord (ou autres).
Voir les parties 1 et 2 :[https://www.youtube.com/watch?v=j-GJc…)[https://www.youtube.com/watch?v=ddiy2…
)
Transcription
Salut, bon retour, tout le monde. Bon. Comme vous l'avez peut-être vu dans la dernière vidéo, au moment de l'enregistrement, assez drôle, je ne comprenais pas complètement le script que j'avais créé, mais je l'ai poussé un peu plus loin et je me suis dit : hé, je peux non seulement comprendre ça, mais vous savez, Integra arrivait à faire des mises à jour chaque heure.
Et en fait, ça pouvait le faire toutes les cinq minutes, mais ça aurait coûté vraiment cher. Alors comment on pourrait faire un robot qui se met à jour chaque minute? Un des projets, c'était de créer un robot de compte à rebours qui se réinitialise à la même heure chaque semaine. Et pour faire ça, oui, un compte à rebours qui se met à jour toutes les demi-heures n'est pas aussi bon qu'un compte à rebours qui se met à jour chaque minute.
Et dès que j'ai compris ça, je me suis dit : pourquoi on ne prendrait pas ça pour l'appliquer aussi aux robots de mise à jour des jetons, et avoir des prix minute par minute? Et laissez-moi. J'imagine que ç'aurait été une bonne idée de commencer par ça, mais laissez-moi l'afficher maintenant et vous montrer le résultat final des trois robots.
Alors regardez ici. Si on passe à Discord, qui, voyons sur quelle page ça ouvre. Peut-être que je vais couper ça au montage. Peut-être pas. Bon. J'espère que mon visage ne les cache pas, mais vous pouvez voir les trois robots ici. Ça, c'est le robot de compte à rebours. Ça, ce sont les robots de jetons, et ils se mettent bel et bien à jour chaque minute.
Alors maintenant, revenons. Sur Tolet, où j'héberge encore tout ça. Bon, Relet mentionne assez explicitement au démarrage que ce n'est pas un serveur de production. Pour l'instant, je fais seulement rouler ces robots sur un serveur de test et sur un. Autre serveur Discord. Alors je pense que je vais m'en tirer pour l'instant. Bientôt, je vais probablement le migrer vers un endroit un peu plus permanent, comme nos serveurs Pragma flow, pour l'instant.
Bon, le voici. Alors, allons-y. On a fait quelques mises à jour à la fonction main. Et je ne pense pas commencer par ça tout de suite. Alors, numéro un, allons voir les mises à jour qu'on a faites au robot de jetons. Vous pouvez voir que j'ai un peu séparé le code.
Et juste ici, on a, et j'ai déjà reçu de super bonnes suggestions sur la façon de refactoriser ça, et je, je, je ne l'ai juste pas encore fait. Alors je pense que je vais le faire dans la prochaine version. Mais en gros, ce qu'on fait ici, c'est qu'on a écrit une fonction pour faire l'appel à Nomics, pour obtenir le prix du jeton chaque minute.
Donc en gros, ce que j'ai fait, Inma, dans la première vidéo, je l'ai juste migré ici. Ça a demandé un peu d'effort. Ici, c'est une sorte de gestion d'erreurs que je n'ai pas encore réglée. Alors je l'ai juste mise en commentaire. Mais en gros, on définit l'appel. On l'envoie. On vérifie si c'est correct. Sinon, on lève l'exception, et je vais rendre tout ce code disponible.
Et ensuite, ce qu'on fait, c'est. Comme je ne sais pas vraiment dans quel ordre Nomics allait m'envoyer les résultats. Je pensais le savoir, mais ce n'est pas resté 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é. Et j'ai commencé à essayer ça, mais comme je n'arrivais pas à le faire marcher.
Et comme le but, c'est vraiment de livrer. et juste de passer à la prochaine étape. J'ai décidé qu'un if ferait tout aussi bien l'affaire, 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 le faire passer à une échelle folle. Alors ici, si, vous savez, la première entrée est, pardon, si le nom de la devise de la première entrée est égal à Orum, Orum deux.
Alors on assigne ça à la variable AP, et sinon, si la devise est égale à rate, on l'assigne à l'autre. Donc une fois qu'on a bouclé sur les deux réponses qu'on va recevoir. Vous savez, en gros, à la fin, j'ai mes deux valeurs assignées, et ensuite on fait un peu de formatage ici.
Je pense qu'il y a probablement une meilleure façon de faire ça. Et ensuite, vous savez, juste un paquet de diagnostics, et, et donc 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. C'est peut-être un petit côté TDA, mais je, je trouve que la structure, la structure visuelle des choses, ça compte vraiment pour moi.
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. Alors voilà. Je mets à jour. J'appelle cette fonction bot name update, qu'on va regarder dans une seconde.
Et je lui passe les variables, vous savez, ça, c'est ce que le surnom va être. Ça, c'est le jeton, et ça, c'est le serveur où je m'en vais. Alors regardons update bot name. Donc on a le nouveau nom qu'on veut envoyer. On a le nom du jeton qu'on met à jour, pardon, le nom du jeton. Donc c'est le jeton du robot, pour qu'on puisse s'authentifier, et ensuite on a le serveur que je veux mettre à jour.
Alors ici, j'ai dit : si le serveur, explicitement, si je l'ai défini comme le serveur crypto Raider, sinon, la valeur par défaut ou de repli, c'est mon serveur de test. Ça me semblait prudent que les choses se replient sur le serveur de test plutôt que l'inverse. Et ensuite ici, on a l'authentification, qui est la chaîne bot plus le jeton, que vous mettriez dans les variables d'environnement secrètes là, et ensuite vous y faites juste référence avec OS Byron point get.
Et ensuite la version chaîne du nom du jeton. Et bien sûr, vous devez importer OS pour les utiliser pour envoyer les requêtes. Et c'est sur les deux pages, vous devez importer requests. Donc ce sont les bibliothèques utilisées. Bon. Donc ça, c'est l'appel au robot, et on met à jour le nom.
Ici, et ensuite on vérifie juste qu'on a bien reçu un code de succès 200, et on imprime la réponse, et c'est juste pour le débogage, encore une fois. Donc c'est comme ça que le. Jeton. Oui, c'est comme ça que la mise à jour des jetons se fait. Et on peut aussi regarder le robot de compte à rebours et voir comment ils utilisent tous la même fonction d'appel.
Alors maintenant, si on regarde, j'ai importé quelques affaires, date, time, date parser, même si j'ai vu des versions qui n'utilisent pas date Parr, et en fait date. Parr, c'est vraiment cool. Parce que ça fait une sorte de langage courant. Comme j'ai écrit. Vous pouvez le voir ici en bas, midnight CST, et ensuite ça l'analyse. Au départ, je disais jeudi, parce que c'est, pardon, mercredi.
Parce que c'est là que la réinitialisation avait lieu, mais ça ne choisissait pas le bon mercredi. Ça choisissait soit le mercredi passé, et, et ce n'était pas très fiable. Alors je vais probablement régler ça. PYT Z nous aide avec les fuseaux horaires. Et ensuite, bien sûr, j'importe ma fonction update bot name. Donc la fonction de mise à jour du compte à rebours, ce qu'elle va faire, c'est définir CST.
Elle obtient l'heure actuelle en CST, parce que ça, ça va se réinitialiser à minuit le mercredi en CST. Et souvent, le conseil, c'est de faire, vous savez, la conversion de fuseau horaire en dernier. J'ai essayé ça, mais dans ce cas-ci, surtout parce qu'on tombe pile à minuit, c'était tellement plus simple de commencer en CST et d'y rester.
Alors on continue ici, c'est quoi la suite? Ah oui. 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 compte à rebours arrive à zéro, il doit se réinitialiser à sept jours. Et plutôt que d'attendre et de pouvoir tester une fois par semaine, j'ai juste fait en sorte de pouvoir voir : hé, si le jour est demain, je devrais voir zéro jour, et ensuite ça me permet d'échanger, en gros, ma variable, vous savez, demain égale maintenant.
Un jour. Donc en gros, je change mon heure de maintenant à demain. En gros, je fais croire au système qu'on est demain. Comme ça, je peux voir ce qui va se passer demain. J'espère que c'était clair. C'était peut-être un peu verbeux. OK. On continue. Donc oui, on veut trouver la prochaine date de réinitialisation, c'est ça? C'est là que j'utilise date Parr, pars, midnight CST.
Donc ça me donne cette valeur-là, 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. Alors avec ça, j'avais vraiment besoin de percer le plus de trous possible dans cette boîte noire. Ensuite, c'est vraiment simple : time till reset égale find next reset moins now.
Donc c'est la différence en jours? Donc l'heure fonctionnait, mais le jour ne fonctionnait pas vraiment là-dedans. Alors ce que j'ai fait, c'est que j'ai décidé de régler la logique des dates séparément, ce qui, ce qui me semblait la bonne décision. Alors ici, s'il y a, vous savez, parce que le jour de la semaine où je réinitialise, c'est mercredi, qui est deux.
Je dois donc 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é, c'était en gros de faire ce calcul d'abord, et ensuite de dire : si le jour est inférieur à zéro, ajouter. Donc c'est une autre façon de faire. J'ai essayé de l'ajouter, mais je devais changer trop de choses et je n'y suis juste pas encore revenu, mais c'est vraiment, vraiment quelque chose que je veux ajouter, même si ça fonctionne de façon vraiment fiable de toute façon.
Et ensuite, oui, on compose juste la chaîne du compte à rebours. Donc c'est, au bout du compte, le nom du robot. Donc notre variable days left assignée ici, plus le. Time till reset point seconds. C'est divisé par 360, mais la double barre oblique enlève le reste. Et ensuite, encore une fois, ici, on s'occupe du, du reste de ça avec la fonction modulo, et on met tout ça ensemble.
Donc on imprime la chaîne du compte à rebours. Et on fait la réinitialisation du nom du robot. Donc on l'envoie au serveur crypto Raiders et on l'envoie au serveur de test. Ouf. Bon. Ça fait pas mal de choses. Et on n'a même pas fini. Il reste encore quelques autres morceaux. Si on va dans endpoints.py, ça, 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.
Je n'utilise pas celui-là ici en bas, mais la route de l'app, chaque fois que l'URL de la route reçoit un ping, va exécuter ce qui suit. Donc elle exécute la fonction home. Et ça va imprimer running home. Ensuite, ça va exécuter la fonction de mise à jour du compte à rebours. Ensuite, ça va exécuter la fonction get token values.
C'est ça? Donc si on, on parcourt tout ça, chaque fois que ça reçoit un ping, ça va entrer dans la mise à jour du compte à rebours, faire tous ces calculs, et ensuite ça va appeler bot name update deux fois, et ensuite ça va aller. Appeler get token values. Et donc ça va passer à travers tout ça et appeler bot name updates pour chaque jeton, pour chaque serveur.
Bon, il y a sûrement des façons de faire une boucle à la place. Et, et ça vaudrait vraiment la peine de le faire plus tard. OK. Finalement, si on va à la fonction main, ce qui se passe quand on démarre tout ça, c'est que, tout d'abord, ça dit déjà I'm in. Donc ça donne juste cette confirmation.
Ici aussi. Ça obtient le jeton, et, et ça fait rouler le robot de compte à rebours. Ça fait client.run. Ça crée aussi la nouvelle instance du client en haut. Bon, c'est là que je ne comprends pas encore tout à fait comment ça fonctionne, parce que je ne connais pas si bien la bibliothèque discord point PPY. En fait, je ne l'ai pratiquement pas utilisée, parce que c'est du Python asynchrone et c'est juste un peu hors de portée.
Quand même, comme vous voyez, j'ai en fait commencé ça dans Integra, alors je suis assez fier de là où on est déjà rendus. Le, ce que j'ai remarqué, c'est le client.run. Ça semble assez important pour garder le robot en ligne. Quand je l'ai mis en commentaire, ça a arrêté de fonctionner. J'ai été un peu surpris, parce que la chose qui reçoit des pings ici, c'est, vous savez, comme je l'ai montré dans l'autre vidéo, on a configuré un appel récurrent avec uptime robot.
Je vais vous montrer. En fait, ici, je. CR job.org, pour que ça reçoive un ping chaque minute. Et j'utilise aussi. En plus de Chrome job.org, j'utilise uptime robot. Ça veut dire qu'il y a deux services qui envoient des pings et qui gardent tout ça en vie. Et ça l'a empêché de tomber, alors qu'avec uptime robot seul, ça tombait tous les jours ou tous les deux jours, et ensuite, vous savez, je devais aller appuyer sur le bouton de démarrage.
Alors encore une fois, si on regarde ici, quand on exécute ces fonctions, il n'y a en fait rien ici. Je ne suis pas sûr de ce qui garde vraiment le robot en vie. Ce que j'ai remarqué, c'est que. J'ai montré, vous savez, dans la partie deux, je vous ai montré comment je gardais le robot Raider en vie et comment je gardais le robot Orum en vie.
Et ces. Serveurs roulent encore, en fait, juste pour garder les robots en ligne. 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 robot se déconnecte, vous allez quand même voir le nom se mettre à jour. Le problème, c'est que le robot va tomber au bas de la liste des membres.
Alors ça devient beaucoup moins utile. Allons donc sur Chron jobb.org.
Et on peut voir juste ici. Je les ai pointés vers les trois serveurs. C'est assez facile de créer une tâche CR job, et vous pouvez la régler pour chaque minute. Une fois que c'est fait, vous avez vos mises à jour minute par minute. Et encore une fois, utiliser uptime robot comme solution de repli, c'est une assez bonne idée. Ça a bien marché. Ce qui est bien, c'est que si le serveur arrête de répondre pendant trois minutes, pour une raison quelconque, disons que Relet est surchargé ou qu'il se passe autre chose, alors CRO jobb.org va basculer.
C'est là que c'est bien d'avoir uptime robot qui roule soit toutes les cinq minutes, soit, à ce stade, vous savez, toutes les demi-heures, juste pour avoir une sorte d'onde longue, comme un ping à plus basse fréquence. Ça risque moins de se faire couper, et ça vous donne la chance de remettre Chron Jobb en marche avant que les deux tombent.
Et avec tout cet effort pour garder le serveur en vie, ce qui est peut-être un peu drôle et ridicule, c'est que. Vous pouvez juste passer à la version payante, et, et l'option toujours actif, ça coûte cinq dollars par mois. Alors je fais ça plus par fierté qu'autre chose, parce que, je veux dire, le temps que j'ai passé à économiser 5 $ par mois vaut, vaut bien plus que ça.
Mais vous savez, c'est juste le fun de trouver comment faire les choses gratuitement et d'avoir cette option. Alors oui, c'est ça. C'est la prochaine évolution des robots Discord. Voici comment. Des robots qui se mettent à jour chaque minute gratuitement, ce qui est assez cool. Et dans les prochaines vidéos, je pense que je vais commencer à faire des robots avec des actions.
Alors 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. Et, vous savez, commencer à envoyer différentes commandes à ces différentes routes, et ensuite écrire les fonctions personnalisées pour elles. Je suis presque certain que c'est comme ça que ça fonctionne. Il y a peut-être une autre façon, mais j'imagine qu'on va le savoir bientôt, et j'espère que la prochaine vidéo ne commencera pas par : ah oui, j'imagine que je me trompais dans la dernière.
Bref, de toute façon, ça va montrer que j'ai appris quelque chose. Alors on a fini ici. Merci d'avoir regardé. J'espère que vous avez appris quelque chose. Je vais partager ça dans les liens, et n'oubliez pas de vous abonner, de laisser un j'aime et un commentaire. Si vous avez des questions, je vais être content d'y répondre. Et on va en sortir d'autres comme ça si vous les trouvez utiles.
Alors merci beaucoup.