Möchten Sie die Funktionalität testen? Schreiben Sie über diesen Link an den Bot und er wird Ihnen antworten.
Und für diejenigen, die daran interessiert sind, wie es funktioniert und wie ein 16-jähriger Schüler es schreiben konnte, werde ich Ihnen in diesem Artikel gerne alles im Detail erzählen.
Hintergrund
Alles begann mit meinem anderen Bot für VK auf dem Knoten js , der Sprachnachrichten entschlüsselte (und da solche Bots ein Dutzend sind, habe ich beschlossen, keinen Artikel über seine Entwicklung zu schreiben, obwohl er auch einige Besonderheiten aufweist). Nachdem ich es gestartet hatte, schlug mein Vater vor, einen weiteren Bot für unseren Familienchat per Telegramm zu entwickeln. Die Essenz dieses Bots war einfach: Datum und Uhrzeit aus der Textnachricht einer Person zu extrahieren und mithilfe von Telegrammverzögerungsnachrichten direkt im Familienchat Erinnerungen zu erstellen.
Aber bald war ich enttäuscht. Es stellte sich heraus, dass Bots keine verzögerten Nachrichten erstellen können. Deshalb habe ich beschlossen, ein eigenes System zum Speichern und Ausführen von Erinnerungen zu schreiben.
Entwicklung von
Allgemeine Information
Dieser Bot ist in Knoten js geschrieben und lebt von Heroku .
Es ist in der Lage, jede Textnotiz minutengenau zu speichern.
Er kann auch in Gruppengesprächen arbeiten.
Im Moment erkennt der Bot Datum und Uhrzeit nur auf Russisch.
SmartScheduler ist ein Open Source-Projekt, das auf meinem Github verfügbar ist .
Extrahieren Sie Datum und Uhrzeit aus der Nachricht
Ich beschloss, mit der schwierigsten Aufgabe zu beginnen: eine Texterinnerung in ein Datum und eine Erinnerung selbst aufzuteilen. Dazu mussten wir alle möglichen Standards für das Schreiben des Datums durch eine Person berücksichtigen, von " um 12:00 Uhr " bis " nächsten Sonntag um fünfundzwanzig bis acht Uhr abends ".
Es wurde eine große Datenbank (constValues.js) erstellt, in der konstante Ausdrücke und deren Eigenschaften gespeichert sind, die eine Person in ihrer Rede verwendet. Dann wurden Funktionen geschrieben, um jede Schreibweise der Zeit zu erkennen.
Beispielsweise wird eine Funktion verwendet , um ein Datum in der Form "bis X % time_type %" zu erkennen
FindAdditiveLiteralsund den Wochentag zu ermitteln FindDayOfWeek.
Jede Zeitbezeichnungsoption hatte ihre eigene Priorität.
Infolgedessen sieht der Parser-Algorithmus folgendermaßen aus:
- Die ursprüngliche Zeichenfolge ist in Wörter unterteilt. Die Wörter, in denen die Suche nach Zeit durchgeführt wird, dürfen nicht mehr als 40 sein.
- Ein Array von Wörtern wird durch die Funktion zur Umwandlung von Wörtern in Zahlen geleitet.

- Alle Zeitangaben sind in der Nachricht enthalten, und die in den Anzeigen verwendeten Wörter sind ebenfalls markiert (zum Beispiel sind in der Anzeige "Wecker 8 Uhr" die Wörter "8" und "Stunden" markiert).
- Wenn in einer Textnachricht kein Zeitmerkmal (z. B. Monat) gefunden wurde, wird der aktuelle Wert dieses Merkmals verwendet.
- Für das endgültige Urteil werden die Zeitangaben mit der höchsten Priorität und benachbarte Anzeigen mit demselben Quellwort ausgewählt (z. B. gibt das Wort "10:30" gleichzeitig die Stunde und die Minute an).
- , , , .
- , .
- ,
{ string: answer, string: text, date: date }
{ string: answer, string: text }
(answer – , text – , date – ).
Die nächsten Fragen waren, wo alle Erinnerungen gespeichert werden sollten und wie ihre Implementierung verfolgt werden kann.
Anfangs wollte ich die Node-Schedule- Bibliothek verwenden , gab diese Idee jedoch auf, da ich den RAM nicht mit allen Erinnerungen verstopfen wollte.
Stattdessen habe ich mich entschlossen, die Funktionsweise von SQL-Datenbanken zu untersuchen und meine eigenen zu erstellen.
Nachdem ich viele Artikel im Internet gelesen hatte , erstellte ich eine Postgresql- Datenbank auf der Heroku-Plattform, da Sie Datenbanken in Ihre Anwendungen einbetten können, was sehr praktisch ist.
Um mit der Datenbank zu interagieren, habe ich ein kleines Skript (db.js) geschrieben, in dem ich alle erforderlichen Funktionen implementiert habe, z. B. das Initialisieren der Datenbank, das Abrufen einer Liste mit Erinnerungen usw.
In meiner Datenbank befinden sich zwei Tabellen: die erste zum Speichern von Erinnerungen und die zweite zum Speichern der Zeitzonen der Benutzer (dazu später mehr).
Danach habe ich das Speichern einer analysierten Erinnerung aus einer Textnachricht in der Datenbank implementiert. Der Timer, der einmal pro Minute arbeitet, überprüft die Uhrzeit der Erinnerungen. Wenn die Zeit für eine Erinnerung gekommen ist, wird sie aus der Datenbank gelöscht und eine Nachricht mit dem Text aus der Erinnerung wird an den Benutzer gesendet, der sie erstellt hat.
Ich habe auch die Anzeige aller Erinnerungen über den Befehl / list hinzugefügt .
(Neben jeder Erinnerung befindet sich ein klickbarer / N-Befehl, der ihn entfernt, wenn Sie darauf klicken.)
Zeitzoneneinstellung
Bevor ich mich entschied, diesen Artikel zu schreiben und auf Habr zu stellen, war die Moskauer Zeitzone in den Umgebungsvariablen fest codiert. Dies war genug für die Verwendung in unserer Familie, aber um alle Freuden und Annehmlichkeiten des Lebens mit dem SmartScheduler-Bot zu nutzen, entschied ich mich, eine individuelle Zeitzoneneinstellung hinzuzufügen.
Um die Konfiguration abzuschließen, müssen Sie den Befehl / tz schreiben , vor dem der Bot den Benutzer warnt, wenn er seine Zeitzone noch nicht angegeben hat:
(Aufgrund der Tatsache, dass die Zeitzone nicht angegeben ist, verwendet die Antwort nicht die Ortszeit, sondern die Greenwich-Zeit.)
Bei der Eingabe des Befehls / tz Der Prozess zur Bestimmung der Zeitzone beginnt und eine Tastatur mit drei Tasten wird angezeigt:
- Verwenden des Standortes des Benutzers.
- Manuelle Eingabe.
- Stornierung.
Die erste Schaltfläche fragt den Benutzer nach seinem Standort, anhand dessen die Zeitzone berechnet wird.
Anwendungsbeispiel
Mit der zweiten Schaltfläche können Sie Ihre Zeitzone manuell im Format ± HH: MM eingeben ,
wobei ± - plus oder minus, HH - Stunden, MM - Minuten.
Anwendungsbeispiel
Die dritte Schaltfläche bricht den Definitionsprozess ab.
Nachdem der Benutzer seine Zeitzone angegeben hat, zeigt der Bot die Erinnerungszeit korrekt an und speichert sie.
Letzte Verbesserungen
Nachdem ich mit der Hauptfunktionalität fertig war, fügte ich die Haupttastatur mit den Hauptfunktionen hinzu, korrigierte die Antworten für die Befehle / start und / help und für die kleinen Dinge.
Ich habe auch beschlossen, die Standardzeitzone für alle Benutzer durch Moskau zu ersetzen .
Ergebnis
Der Hauptvorteil des SmartScheduler-Bots ist natürlich die Datumsanalyse, mit der Sie die erforderlichen Informationen oder Aufgaben auch in unvorhersehbaren Situationen schnell und bequem in Form einer Erinnerung aufschreiben können.
Sie müssen nicht mehr im Kalender nach dem richtigen Tag suchen und die Uhr drehen, um die richtige Zeit einzustellen. Es reicht aus, dem Bot menschlich „was“ und „wann“ zu sagen, und dann wird er alles selbst tun.
Fazit
Vor der Entwicklung von Bots auf dem Knoten js war ich mit Javascript völlig unbekannt. Daher wurde das gesamte Wissen, das ich beim Schreiben des Codes verwendet habe, aus dem Internet übernommen, wo Sie häufig nicht genau das finden, was Sie wirklich benötigen. Aus diesem Grund gibt es höchstwahrscheinlich irgendwo in meinem Code sehr dumme Fehler, für die ich immer noch nicht viel zu identifizieren weiß.
Mein Ziel war es zunächst nicht, aus Sicht der Projektstruktur das fortschrittlichste und idealste zu schaffen. Das Wichtigste für mich war, neues Wissen zu erwerben, eine neue Programmiersprache zu lernen, um das Verständnis der Informatik im Allgemeinen zu verbessern und ein MVP-Produkt zu erstellen.
Aber wenn diese Entwicklung gefragt ist, werde ich sie gerne weiter verbessern. Wenn Sie Ideen haben oder einen Fehler finden, sind Sie im Github des Projekts willkommen. Ich habe bereits Ideen, wo und wie ich was ändern kann (z. B. den schrecklichen Spaghetti-Code im Parsing-Modul unter Verwendung des normalen Besuchermusters umschreiben) sowie Pläne, Unterstützung für die englische Sprache hinzuzufügen.
Ich hoffe, dieser Bot hilft Ihnen ebenso wie mir und meiner Familie bei unseren täglichen Aktivitäten.
Vielen Dank für Ihre Aufmerksamkeit!
UPD: Unterstützung für Sprachnachrichten auf vielfachen Wunsch hinzugefügt.
UPD 2: Der Bot hat seit Veröffentlichung des Artikels ein umfangreiches Update erhalten. Liste der Änderungen .