Steem Twitter Bot: commandes 'mentions' et 'account', bug de réponses réglé

Cela fait déjà deux semaines que je vous ai mis à jour sur l'avancement de Steem Twitter Bot. J'ai passé tout ce temps à travailler dessus mais je ne voulais surtout pas sortir des commandes à moitié finies juste pour vous mettre à jour, j'ai préféré les terminer avant de vous en parler. Steem Twitter Bot a enfin atteint le cap des 10 utilisateurs (ou plutôt abonnés), ce n'est pas beaucoup mais je ne m'attends de toute façon pas à ce qu'un tel projet attire des centaines de steemiens. J'ai commencé à travailler sur ce bot pour moi et m'en sers tous les jours, le reste ce n'est que du bonus. Je suis déjà assez étonné comme ça de voir qu'il puisse servir à d'autres personnes ! Aujourd'hui est un jour important pour ce bot, pas uniquement parce que de nouvelles commandes font leurs apparitions mais aussi parce que je pense avoir résolu le problème majeur que certains utilisateurs avaient avec Steem Twitter Bot (ne pas recevoir de réponse). Avant de parler des nouveautés et des améliorations apportées à ce bot, parlons un peu de ce qui est prévu pour les prochaines mises à jours. Je pense que ce qui manque le plus en ce moment est la possibilité de lire les commentaires d'un post, je travaillerai là-dessus après avoir créé une version de Steem Twitter Bot pour Telegram. J'aimerais que les deux bots soient synchronisés au niveau des mises à jours, il est donc nécessaire que je me concentre sur Telegram pour l'instant. Vous pouvez remercier @kaliangel pour m'avoir donné l'idée de rendre le bot disponible sur Telegram ! Ça m'a donné l'envie de le rendre disponible sur bien plus de plateformes (tant que les bots y sont les bienvenus), celles qui me viennent tout de suite en tête sont Facebook et Discord. Je sais que pas mal d'entre vous détestent Facebook, moi y compris, mais le but est de rendre le bot accessible de partout et pas uniquement là où ça me plait ! Certains utilisateurs ont probablement remarqué que leurs paramètres ne sont pas sauvegardés très longtemps. Pour faire court, c'est dû au fait que Heroku (le service avec lequel j'héberge cette application) ne permet pas de garder des fichiers créés dynamiquement. J'ai prévu de remédier à ce problème en me servant d'Amazon Web Services, je pourrai y envoyer et recevoir mes fichiers de sauvegarde dont le fichier contenant les paramètres. Enfin, je préfère me concentrer sur l'exploration de la blockchain pour l'instant, une fois cette partie maîtrisée, je commencerai à travailler sur une utilisation de SteemConnect V2 pour aller bien plus loin que de la simple exploration ! C'est tout ce que j'avais à dire, il est temps de s'intéresser aux nouveautés et aux améliorations apportées par cette mise à jour !
Nouveautés
Nouvelle commande: 'mentions'
Dès que j'ai commencé à travailler sur ce bot, j'ai su que j'allais tôt ou tard lui ajouter une commande 'mentions'. C'est quelque chose que je regardais tout le temps quand j'étais sur Steemit, j'étais donc aux anges quand Busy a ajouté un système de notifications qui contenait des mentions. La commande 'mentions' est un peu différente des autres mais ne devrait pas être compliquée à apprendre. En plus de permettre la spécification d'un utilisateur et d'une certaine quantité de résultats à afficher, cette commande vous permet de spécifier si vous ne voulez voir que des posts, que des commentaires ou les deux. Comme d'habitude, toutes les informations nécessaires sont fournies par la commande 'help' ! SteemData est utilisé pour rendre la chose possible, le résultat prend assez longtemps à arriver donc soyez patient !

Ces quelques lignes de code correspondent à la connexion à la base de données SteemData, suivie par une requête adaptée aux paramètres reçus pour finir sur l'envoi d'une réponse contenant les informations demandées par l'utilisateur. Comme vous pouvez le voir, la function handleMentions contient une fonction privée nommée getDocsArray. Cette fonction est appelée récursivement si l'utilisateur a demandé une liste de mentions contenant des posts et des commentaires. Le reste du code est plutôt classique, je dois juste changer la ligne 333 car elle lance un tri inutile lorsque juste des posts ou juste des commentaires sont demandés.
Nouvelle commande: 'account'
Cette commande m'a pris pas mal de temps à écrire, elle permet d'imprimer les informations utiles à propos d'un compte pour que vous n'ayez pas à aller sur steemd. Certaines informations sont évidentes comme le pouvoir de vote, la bande passante, le portefeuille et les métadonnées d'un compte (nom, lieu, description...). D'autres le sont un peu moins comme la valeur de vote, la valeur de portefeuille, le nombre de posts et de votes faits depuis la création du compte et dans les dernières 24 heures. Il y a bien plus d'informations bien-sûr ! Par exemple, étant un utilisateur de Busy, je me suis dit que ce serait sympathique d'aussi inclure certaines métadonnées créées par ce site (réseaux sociaux et cryptomonnaies) donc je l'ai fait ! Si vous utilisez un autre site qui ajoute des métadonnées qui pourraient être utiles pour ce bot, n'hésitez pas à me le dire afin que je peaufine cette commande. La commande 'account' est très simple, il suffit de l'utiliser suivie d'un nom d'utilisateur !

Le bloc de code que vous voyez ci-dessus est la partie la plus importante de cette commande. Ce que vous voyez est exécuté après avoir obtenu le tableau de comptes renvoyé par la fonction steem.api.getAccounts. Je n'aime pas le fait qu'autant de fonctions de rappels soit encapsulées mais je pense avoir déjà trouvé un moyen de remédier à ça d'une manière qui permettra de gagner en temps de réponse. Au lien d'attendre qu'une function soit finie avant d'en lancer une autre, je les lancerai toutes en même temps, traiterai leurs informations individuellement et ajouterai une boucle while qui s'occupera de vérifier que tout est bon avant de construire le message à envoyer. Je n'ai pas pu capturer les lignes de codes les plus longues mais l'essentiel est là. Vous pouvez remarquer que je fais souvent appel à un objet appelé formatter, j'en parlerai plus en détail à la fin de ce post. Pour faire court, je l'ai créé pour éviter des répétitions dans mon code mais aussi parce que je savais que j'allais devoir réutiliser certains bouts de code pour des futures commandes. Certaines lignes du texte renvoyé sont optionnelles simplement parce qu'elles n'existent pas forcément sur un compte Steem (location, website, about, twitter, bitcoin...).
Réponses à tout le monde
Certains d'entre vous ne recevaient aucune réponse de la part de Steem Twitter Bot, ce qui pose problème puisque tout se fait par messages privés ! Je pensais avoir réglé le problème lors de la dernière mise à jour mais il se trouve qu'un autre problème moins facilement détectable existait. Si vous ne comprenez rien au développement, vous ne comprendrez pas ce qui va suivre, désolé. Le problème venait de Twitter, leurs ids et leur manque de documentation à leur sujet. Une partie conséquente des utilisateurs Twitter ont un id très long. Tellement long qu'il crée des problèmes d'overflow en JavaScript. Le problème était que mon application recevait un id erroné dès le début à cause de l'overflow et essayait d'envoyer un message à cet id, qui n'existait du coup pas ! Heureusement, Twitter fournit aussi les ids sous forme de string pour éviter ce problème, j'aurais juste aimé en être averti clairement par leur documentation...
Plus de follow back
Puisqu'il semblerait que le bot ne doive pas suivre un compte pour lui envoyer des messages privés (tant que ce compte le suit), j'ai décidé de supprimer le code qui permettait au bot de suivre les utilisateurs l'ayant suivi. En plus de ça, ça évitera au bot de se faire bannir pour 'mass following'. Donc si vous suivez le bot et qu'il ne vous suit pas en retour, ne vous inquiétez pas, c'est tout à fait normal !
Améliorations
Commandes 'comments' et 'replies' plus rapides
Les commandes 'comments' et 'replies' prenaient longtemps à répondre. C'était parce que mes requêtes à SteemData prenaient pas mal de temps. Heureusement, j'ai découvert que Steem.js fournissait des méthodes pour obtenir les commentaires et réponses, elles étaient juste nommées bizarrement. J'ai changé le code pour ces commandes, ce qui devrait rendre leurs réponses beaucoup plus rapides. La commande 'comments' passe à présent par la fonction handleUserRelatedPostsCommand. Puisque le code de traitement de la commande 'replies' est très similaire à d'autres codes que je vous ai montrés dans les anciens posts, j'ai décidé de ne pas en parler. Vous pouvez cependant avoir un aperçu ci-dessous.

Meilleures listes de posts
J'ai apporté quelques modifications à l'apparence des listes de posts envoyées par le bot. L'ancienne manière d'afficher chaque post était la suivante:
- harpagon : EasySteem, la librairie javascript qui va vous simplifier la vie...
À présent, chaque post est affiché de la sorte:
- @harpagon posted EasySteem, la librairie javascript qui va vous simplifier la vie...
Le mot du milieu est bien évidemment changé par 'commented on', 'mentioned this user in' ou 'mentioned this user in a comment on' en fonction du contexte.
Création d'un objet formatter
Cette partie du post n'est susceptible que d'intéresser les développeurs le lisant, cette amélioration ne change pas l'expérience utilisateur mais l'expérience développeur. Inspiré par Steem.js, j'ai décidé de créer un objet formatter contenant toutes les fonctions ayant un rapport avec le formatage ou avec l'estimation de valeurs. La fonction la plus moche dans cet objet est sans aucun doute celle permettant d'obtenir l'âge d'un compte, je ne sais pas trop comment j'aurais pu la rendre moins répétitive honnêtement.

Cette fonction en particulier m'a donné des maux de tête mais j'ai fini par trouver un moyen de la faire fonctionner. Ce que j'avais en tête à la base était de simplement soustraire la date de création du compte à la date actuelle. Ça me donnerait un résultat en millisecondes avec lequel je pourrais travailler pour obtenir le nombre exact de millisecondes, minutes, heures, jours, mois et années ayant passé depuis la création du compte, donc l'âge. Tout allait bien jusqu'à ce que je réalise qu'un mois peut valoir entre 28 et 31 jours, pareil pour les années qui peuvent être bissextiles ! J'ai donc décidé de changer de plan d'attaque et d'instancier un objet Date en passant à son constructeur le résultat de la différence entre la date actuelle et la date de création du compte. Je ne savais pas trop si ça allait marcher, j'avais beaucoup de doutes mais, à ma grande surprise, l'âge du compte était correct ! Il était juste en avance de 1970 années étant donné que l'année correspondant à 0 millisecondes est 1970. Il m'a après suffit de renvoyer un objet contenant les différentes informations à propos de l'âge du compte. J'ai aussi ajouté un paramètre pour renvoyer une string formatée à la place. Pour la première fois, j'ai trouvé une utilité au retrait des break dans un switch. Je me suis servi de cette astuce pour créer un âge formaté.

Enfin, voici quelques autres fonctions importantes disponibles dans l'objet formatter. La fonction currency formate un nombre en un affichage correct pour la devise et la langue sélectionnée. Pour l'instant, cette fonction est une surcouche plus qu'autre chose mais ça ne sera plus le cas quand des paramètres seront introduits pour la devise et la langue voulue. La fonction currentBandwidth renvoie la bande passante allouée et la bande passante utilisée d'un compte. Merci à @jfollas pour ses incroyables explications qui m'ont faites comprendre comment calculer la bande passante d'un compte (cliquez ici pour lire son post). La fonction currentSteemPower renvoie le Steem Power acquis, reçu et délégué d'un compte. Tous les calculs de cette fonction sont faits par la fonction vestToSteem fournie par l'object formatter de Steem.js. La fonction currentVotingPower renvoie le pouvoir de vote d'un compte soit en tant qu'entier, soit en tant que pourcentage. Merci à @stoodkev pour son tutoriel m'ayant sauvé du temps pour mes calculs du pouvoir de vote d'un compte (cliquez ici pour y jeter un œil). La fonction estimateVoteValue estime la valeur actuelle du vote d'un utilisateur. Encore une fois, merci à @stoodkev pour avoir fournit la base (cliquez ici pour lire son post) à laquelle je n'ai eu qu'à ajouter un calcul rapide de pouvoir de vote pour obtenir le résultat voulu. Vous pouvez bien-sûr copier mes fonctions, elles ne sont après tout pour la plupart pas réellement les miennes !
Contributions
Si vous voulez contribuer à ce projet ou m'avertir d'un de ses problèmes, n'hésitez pas à visiter sa page GitHub. Vous pouvez aussi le cloner et suivre les instructions disponibles sur GitHub pour le faire tourner correctement. Mes réseaux sociaux sont listés à la fin du fichier README.md si vous voulez me contacter. Si vous m'ajoutez sur Steam, veuillez expliquer la raison de votre ajout sur mon mur, je risque de vous refuser dans le cas contraire (c'est devenu une habitude à cause des bots).

tu es vraiment un passionné ça se voit. J'aimerai bien pouvoir échanger avec toi sur discord
Tu peux ! :P
Je suis sur le discord de @francosteemvotes et celui de @aidefr. Sinon, si tu préfères par MP hésite pas à me trouver sur un de ces discords et m'envoyer un MP ^^
Merci pour ton travail !
Coucou @ragepeanut,
Quel travail ! mais tu as mis combien de temps pour ton post ??? As-tu vu mon message sur le discord concernant la nouvelle console ? Curieuse d'avoir ton avis.
A+
Christel
Merci @corsica ! :D
Le post original en anglais j'ai mis un jour je pense, la traduction française quelques heures ^^ Oui, je l'ai vu mais j'étais occupé et j'ai complètement oublié que je devais y répondre ! De quelle console tu parles ? Je n'ai entendu parler d'aucune nouvelle console récemment donc je suis assez curieux de savoir.
J'ai fait exprès de rester vague je savais que j'allais titiller ta curiosité. Et voici, je n'ai pas encore trouvé le temps de lire l'article . Tu me diras.
A+
Christel
Ça ne me fait ni chaud ni froid à vrai dire. Je ne fais déjà pas partie du public concerné étant donné que je n'aime pas trop les jeux de plateaux, avec quelques rares exceptions comme Ticket to Ride. Et puis, l'article dit que $349 c'est bas mais je trouve ça extrêmement cher pour ce que la console propose... Pour le même prix, je peux m'acheter une Nintendo Switch ! Le système d'échange est intéressant, même si j'ai du mal à comprendre l'intérêt d'avoir une figurine avec un certain niveau d'expérience vu que ça ne va pas influencer les parties de jeux de plateaux. Par exemple, ce n'est pas parce que ma figurine est à un niveau élevé que j'ai plus de chances de gagner à Ticket to Ride, ce serait absurde. Et puis le système de figurines me fait trop penser aux jeux à la Skylanders qui sont à mes yeux d'immenses pompes à fric. Tu paies pour le jeu à plein prix puis tu te retrouves à acheter des figurines trop chères sur le côté pour pouvoir jouer avec tous les personnages. Pour conclure tout ça, je dirais que c'est plutôt une tentative de marketing plutôt qu'une utilisation intéressante de la blockchain. Je leur souhaite le meilleur mais je pense que ça va faire un gros flop.
Je suis sûr que tu ne t'attendais pas à une réponse aussi négative, désolé :P
Je m'attendais surtout à une réponse honnête et proche de la vérité compte tenu de tes connaissances. Je t'attendais rien de plus que ton avis lol je ne suis pas actionnaire :D. Bon vive la switch que je ne me suis toujours pas acheter d'ailleurs. Par contre même si j'ai toujours adoré les consoles et que j'ai quelques ancêtres je n'ai jamais retenu les catégories de jeu. Mario, Zelda, Sonic et compagnie sont des jeux de plateaux ?
Merci pour ta réponse détaillée, C'est cool.
Pas de soucis ! ^^
Non, jeux de plateaux c'est tout simplement des jeux de société avec un plateau (comme le Monopoly par exemple) mais là du coup sur la PlayTable c'est ces jeux de sociétés mais en version digitale ! Je ne me suis pas encore acheté la Switch non plus, je me suis mis en tête de ne me la financer qu'avec des Steem (ceux qui sont dans mes savings) ! Super Mario Odyssey et le dernier Zelda sont tous les deux des jeux de plateforme, action/aventure. Évidemment chacun se joue différemment mais ils reposent sur les mêmes mécaniques de base des jeux de plateforme.
ah voila jeu de plateforme ! Merci
Cette description et tout ce temps passé mérite bien un coup de pouce de notre part ! Upvoté à 100% !
Merci beaucoup ! <3