Bot "Planificador inteligente": entiende perfectamente

Si alguna vez ha querido tener un sirviente personal que le recuerde todo lo que le cuenta, pero no ha tenido la oportunidad de contratar uno, entonces el bot que he desarrollado será un digno reemplazo para él.







¿Quieres probar la funcionalidad? Escribe al bot usando este enlace y te responderá.



Y para aquellos que estén interesados ​​en cómo funciona y cómo un estudiante de 16 años pudo escribirlo, con mucho gusto les contaré todo en detalle en este artículo.



Antecedentes



Todo comenzó con mi otro bot para VK en el nodo js , que descifraba los mensajes de voz (y como esos bots cuestan diez centavos la docena, decidí no escribir un artículo sobre su desarrollo, aunque también tiene varias características distintivas). Después de que lo lancé, mi padre sugirió que desarrollara otro bot para nuestro chat familiar a través de telegram. La esencia de este bot era simple: extraer la fecha y la hora del mensaje de texto de una persona y, utilizando mensajes retrasados ​​de telegrama, crear recordatorios directamente en el chat familiar.



Pero pronto me decepcioné. Resultó que los bots no pueden hacer mensajes diferidos, así que decidí escribir mi propio sistema para almacenar y ejecutar recordatorios.



Desarrollo de



Información general



Este bot está escrito en node js y vive en heroku .



Es capaz de almacenar cualquier recordatorio de texto exacto al minuto.



También puede trabajar en conversaciones grupales.



Por el momento, el bot reconoce la fecha y la hora solo en ruso.



SmartScheduler es un proyecto de código abierto disponible en mi github .



Extraer fecha y hora del mensaje



Decidí comenzar con la tarea más difícil: dividir un recordatorio de texto en una fecha y un recordatorio en sí. Para ello, tuvimos que tener en cuenta todos los estándares posibles para escribir la fecha por una persona, desde " a las 12:00 " hasta "el próximo domingo a las veinticinco a las ocho de la noche ".



Se creó una gran base de datos (constValues.js), que almacena expresiones constantes y sus propiedades que una persona usa en su discurso. Luego se escribieron funciones para reconocer cada ortografía de la época.



Por ejemplo , una función se utiliza para reconocer una fecha en la forma "hasta X % time_type %" FindAdditiveLiteralsy para encontrar el día de la semana FindDayOfWeek.



Cada opción de designación de tiempo tenía su propia prioridad.



Como resultado, el algoritmo del analizador se ve así:



  1. La cadena original se divide en palabras. Las palabras en las que se realiza la búsqueda del tiempo no pueden superar las 40.
  2. Se pasa una matriz de palabras a través de la función de conversión de palabra a número.
  3. Todas las indicaciones de hora se encuentran en el mensaje, y las palabras utilizadas en las indicaciones también están marcadas (por ejemplo, en la indicación "reloj despertador 8 en punto" se marcan las palabras "8" y "horas").

  4. Si no se encontró alguna característica de tiempo (por ejemplo, mes) en un mensaje de texto, se toma el valor actual de esta característica.
  5. Para el veredicto final, se seleccionan las indicaciones de tiempo con mayor prioridad y las indicaciones adyacentes que tienen la misma palabra fuente (por ejemplo, en la palabra "10:30" se indican simultáneamente la hora y los minutos).
  6. , , , .
  7. , .
  8. ,

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





    { string: answer, string: text }

    (answer – , text – , date – ).




Las siguientes preguntas fueron dónde almacenar todos los recordatorios y cómo realizar un seguimiento de su implementación.



Inicialmente, quería usar la biblioteca de programación de nodos , pero abandoné esta idea, ya que no quería obstruir la RAM con todos los recordatorios.



En cambio, decidí estudiar cómo funcionan las bases de datos SQL y crear las mías propias.



Después de leer muchos artículos en Internet, creé una base de datos postgresql en la plataforma heroku, ya que puedes incrustar bases de datos en tus aplicaciones, lo cual es muy conveniente.



Para interactuar con la base de datos, escribí un pequeño script (db.js) en el que implementé todas las funciones necesarias, como inicializar la base de datos, obtener una lista de recordatorios, etc.



Hay dos tablas en mi base de datos: la primera para almacenar recordatorios y la segunda para almacenar las zonas horarias de los usuarios (más sobre esto más adelante).



Después de eso, implementé el guardar un recordatorio analizado de un mensaje de texto en la base de datos. La hora de los recordatorios se verifica mediante un temporizador que funciona una vez por minuto. Si ha llegado el momento de un recordatorio, se elimina de la base de datos y se envía un mensaje con el texto del recordatorio al usuario que lo hizo.



También agregué la visualización de todos los recordatorios a través del comando / list .







(hay un comando / N en el que se puede hacer clic junto a cada recordatorio, que lo elimina al hacer clic en él)



Configuración de zona horaria



Antes de decidir escribir este artículo y publicarlo en Habr, la zona horaria de Moscú estaba codificada en las variables de entorno. Esto fue suficiente para usarlo dentro de nuestra familia, pero para aprovechar todas las delicias y comodidades de la vida con el bot SmartScheduler que cualquiera pudiera, decidí agregar una configuración de zona horaria individual.



Para completar la configuración, debe escribir el comando / tz , sobre el cual el bot advertirá al usuario si aún no ha indicado su zona horaria:







(debido a que no se especifica la zona horaria, la respuesta no usa la hora local, sino la hora de Greenwich)



Al ingresar el comando / tz se inicia el proceso de determinación de la zona horaria y aparece un teclado con tres botones:







  1. Usando la ubicación del usuario.
  2. Entrada manual.
  3. Cancelar.



El primer botón pregunta al usuario su ubicación, según la cual se calcula la zona horaria.



Ejemplo de uso




El segundo botón le permite ingresar manualmente su zona horaria en el formato ± HH: MM ,

donde ± - más o menos, HH - horas, MM - minutos.



Ejemplo de uso




El tercer botón cancela el proceso de definición.



Una vez que el usuario ha especificado su zona horaria, el bot mostrará y guardará correctamente la hora del recordatorio.



Mejoras finales



Habiendo terminado con la funcionalidad principal, agregué el teclado principal con las funciones principales, corrigí las respuestas para los comandos / start y / help , y para las pequeñas cosas.



También decidí reemplazar la zona horaria predeterminada para todos los usuarios con Moscú .



Resultado



La principal ventaja del bot SmartScheduler es, por supuesto, el análisis de fechas, que le permite escribir rápida y cómodamente la información o tarea necesaria en forma de recordatorio incluso en las situaciones más impredecibles.



Ya no necesitas hojear el calendario en busca del día correcto y girar el reloj para configurar la hora correcta, basta con decirle humanamente al bot “qué” y “cuándo”, y luego hará todo él mismo.



Conclusión



Antes de desarrollar bots en node js, no estaba familiarizado con javascript, por lo tanto, todo el conocimiento que usé para escribir el código se tomó de Internet, donde a menudo no se puede encontrar exactamente lo que realmente necesita. Debido a esto, lo más probable es que en algún lugar de mi código haya errores muy estúpidos, de los que todavía no sé mucho para determinarlos.



Inicialmente, mi objetivo no era crear lo más avanzado e ideal desde el punto de vista de la estructura del proyecto, era más importante para mí obtener nuevos conocimientos, aprender un nuevo lenguaje de programación para mejorar la comprensión de la informática en general y crear un producto MVP.



Pero si este desarrollo está en demanda, continuaré mejorándolo con mucho gusto, y si tiene alguna idea o encuentra un error, bienvenido al github del proyecto. Ya tengo ideas sobre dónde y cómo cambiar qué (por ejemplo, reescribir el terrible código espagueti en el módulo de análisis usando el patrón de visitante normal), así como planes para agregar soporte para el idioma inglés.



Espero que este bot te ayude tanto como a mí y a mi familia en nuestras actividades diarias.



¡Gracias por su atención!



UPD: Soporte agregado para mensajes de voz por demanda popular.

UPD 2: el bot ha recibido una actualización importante desde que se publicó el artículo. Lista de cambios .



All Articles