Bot "Smart planner": comprend parfaitement

Si vous avez toujours voulu avoir un serviteur personnel qui vous rappellerait tout ce que vous lui dites, mais que vous n'avez pas eu l'occasion d'en embaucher un, alors le robot que j'ai développé sera un digne remplaçant pour lui.







Voulez-vous tester la fonctionnalité? Écrivez au bot en utilisant ce lien et il vous répondra.



Et pour ceux qui s'intéressent à son fonctionnement et à la manière dont un élève de 16 ans a pu l'écrire, je serai ravi de tout vous raconter en détail dans cet article.



Contexte



Tout a commencé avec mon autre bot pour VK sur le nœud js , qui a déchiffré les messages vocaux (et comme ces robots sont un centime une douzaine, j'ai décidé de ne pas écrire d'article sur son développement, bien qu'il ait également plusieurs caractéristiques distinctives). Après l'avoir lancé, mon père m'a suggéré de développer un autre bot pour notre conversation familiale par télégramme. L'essence de ce bot était simple: extraire la date et l'heure du message texte d'une personne et, en utilisant des messages retardés par télégramme, créer des rappels directement dans le chat familial.



Mais bientôt j'ai été déçu. Il s'est avéré que les robots ne peuvent pas faire de messages différés, j'ai donc décidé d'écrire mon propre système pour stocker et exécuter des rappels.



Développement de



informations générales



Ce bot est écrit dans le nœud js et vit sur heroku .



Il est capable de stocker tous les rappels de texte précis à la minute près.



Il peut également travailler dans des conversations de groupe.



Pour le moment, le bot reconnaît la date et l'heure uniquement en russe.



SmartScheduler est un projet open source disponible sur mon github .



Extraire la date et l'heure du message



J'ai décidé de commencer par la tâche la plus difficile: diviser un rappel de texte en une date et un rappel lui-même. Pour ce faire, il fallait prendre en compte toutes les normes possibles pour écrire la date par une personne, de « à 12h00 » au « dimanche prochain à vingt-cinq à huit heures du soir ».



Une grande base de données (constValues.js) a été créée, stockant des expressions constantes et leurs propriétés qu'une personne utilise dans son discours. Ensuite, des fonctions ont été écrites pour reconnaître chaque orthographe de l'époque.



Par exemple , une fonction est utilisée pour reconnaître une date sous la forme "à X % time_type %" FindAdditiveLiterals, et pour trouver le jour de la semaine FindDayOfWeek.



Chaque option de désignation de temps avait sa propre priorité.



En conséquence, l'algorithme de l'analyseur ressemble à ceci:



  1. La chaîne d'origine est divisée en mots. Les mots dans lesquels la recherche du temps est effectuée ne peuvent excéder 40.
  2. Un tableau de mots est transmis via la fonction de conversion de mot en nombre.
  3. Toutes les indications d'heure se trouvent dans le message, et les mots utilisés dans les instructions sont également marqués (par exemple, dans l'indication "réveil 8 heures", les mots "8" et "heures" sont marqués).

  4. Si une caractéristique du temps n'a pas été trouvée (par exemple, le mois) dans un message texte, la valeur actuelle de cette caractéristique est prise.
  5. Pour le verdict final, les indications d'heure avec la priorité la plus élevée et les indications adjacentes qui ont le même mot source sont sélectionnées (par exemple, dans le mot "10:30", l'heure et les minutes sont indiquées simultanément).
  6. , , , .
  7. , .
  8. ,

    { string: answer, string: text, date: date }





    { string: answer, string: text }

    (answer – , text – , date – ).




Les questions suivantes étaient de savoir où stocker tous les rappels et comment suivre leur mise en œuvre.



Au départ, je voulais utiliser la bibliothèque de planification des nœuds , mais j'ai abandonné cette idée, car je ne voulais pas obstruer la RAM avec tous les rappels.



Au lieu de cela, j'ai décidé d'étudier le fonctionnement des bases de données SQL et de créer les miennes.



Après avoir lu de nombreux articles sur Internet, j'ai créé une base de données postgresql sur la plateforme heroku, car vous pouvez y intégrer des bases de données dans vos applications, ce qui est très pratique.



Pour interagir avec la base de données, j'ai écrit un petit script (db.js) dans lequel j'ai implémenté toutes les fonctions nécessaires, telles que l'initialisation de la base de données, l'obtention d'une liste de rappels, etc.



Il y a deux tables dans ma base de données: la première pour stocker les rappels, et la seconde pour stocker les fuseaux horaires des utilisateurs (plus à ce sujet plus tard).



Après cela, j'ai implémenté l'enregistrement d'un rappel analysé d'un message texte dans la base de données. L'heure des rappels est vérifiée par une minuterie qui fonctionne une fois par minute. Si le moment est venu pour un rappel, il est supprimé de la base de données et un message contenant le texte du rappel est envoyé à l'utilisateur qui l'a fait.



J'ai également ajouté l'affichage de tous les rappels via la commande / list .







(à côté de chaque rappel, il y a une commande cliquable / N qui le supprime lorsque vous cliquez dessus)



Réglage du fuseau horaire



Avant que je décide d'écrire cet article et de le mettre sur Habr, le fuseau horaire de Moscou était codé en dur dans les variables d'environnement. C'était suffisant pour une utilisation au sein de notre famille, mais afin de profiter de tous les plaisirs et commodités de la vie avec le robot SmartScheduler que tout le monde pouvait, j'ai décidé d'ajouter un paramètre de fuseau horaire individuel.



Pour terminer la configuration, vous devez écrire la commande / tz , dont le bot avertira l'utilisateur s'il n'a pas encore spécifié son fuseau horaire:







(du fait que le fuseau horaire n'est pas spécifié, la réponse n'utilise pas l'heure locale, mais l'heure de Greenwich)



Lors de la saisie de la commande / tz le processus de détermination du fuseau horaire démarre et un clavier apparaît avec trois boutons:







  1. Utilisation de l'emplacement de l'utilisateur.
  2. Entrée manuelle.
  3. Annulation.



Le premier bouton demande à l'utilisateur son emplacement, en fonction duquel le fuseau horaire est calculé.



Exemple d'utilisation




Le deuxième bouton vous permet de saisir manuellement votre fuseau horaire au format ± HH: MM ,

où ± - plus ou moins, HH - heures, MM - minutes.



Exemple d'utilisation




Le troisième bouton annule le processus de définition.



Une fois que l'utilisateur a spécifié son fuseau horaire, le bot affichera correctement et enregistrera l'heure de rappel.



Améliorations finales



Après avoir terminé avec la fonctionnalité principale, j'ai ajouté le clavier principal avec les fonctions principales, corrigé les réponses pour les commandes / start et / help , et pour les petites choses.



J'ai également décidé de remplacer le fuseau horaire par défaut pour tous les utilisateurs par Moscou .



Résultat



Le principal avantage du robot SmartScheduler est, bien sûr, l'analyse des dates, qui vous permet d'écrire rapidement et facilement les informations ou la tâche nécessaires sous la forme d'un rappel, même dans les situations les plus imprévisibles.



Vous n'avez plus besoin de parcourir le calendrier à la recherche du bon jour et de tourner l'horloge pour régler la bonne heure, il suffit de dire humainement au bot «quoi» et «quand», puis il fera tout lui-même.



Conclusion



Avant de développer des bots sur node js, je ne connaissais pas du tout javascript.Par conséquent, toutes les connaissances que j'ai utilisées pour écrire le code proviennent d'Internet, où vous ne trouvez souvent pas exactement ce dont vous avez vraiment besoin. Pour cette raison, très probablement, quelque part dans mon code, il y a des erreurs très stupides, pour lesquelles je ne sais toujours pas grand-chose à identifier.



Au départ, mon objectif n'était pas de créer le plus avancé et l'idéal du point de vue de la structure du projet, il était très important pour moi d'acquérir de nouvelles connaissances, d'apprendre un nouveau langage de programmation pour améliorer la compréhension de l'informatique en général, et de créer un produit MVP.



Mais si ce développement est demandé, je continuerai à l'améliorer avec plaisir, et si vous avez des idées ou trouvez un bug, alors bienvenue sur le github du projet. J'ai déjà des idées sur où et comment changer quoi (par exemple, réécrire le terrible code spaghetti dans le module d'analyse en utilisant le modèle normal de visiteur), ainsi que des plans pour ajouter la prise en charge de la langue anglaise.



J'espère que ce bot vous aidera aussi bien qu'il m'aide, moi et ma famille, dans nos activités quotidiennes.



Merci de votre attention!



UPD: Ajout de la prise en charge des messages vocaux à la demande générale.

UPD 2: Le bot a reçu une mise à jour majeure depuis la publication de l'article. Liste des changements .



All Articles