Criando a un niño digital

Luciano Adonis
devsChile
Published in
4 min readMay 17, 2019

--

Existiendo gran variedad de ejemplos sobre cómo llevar un proyecto en Ruby, no encontré algo en lo que pudiese basarme o inspirarme para sobrepasar las limitantes de la versión actual de nuestro mejor bot para Slack, cuyo uso diario es claramente productivo (☁️, ♈️, ⛓ & 🚨).

Así que en este post, escribiré sobre la experiencia de encontrar una solución de forma no tan esperada.

Los límites de Enerbot

En un momento de reflexión previa a la hora del almuerzo, llegué a una terrible conclusión; Enerbot, el bot para Slack escrito en Ruby más amistoso de cierta comunidad, no podía cantar.

Pensé en agregarle una funcionalidad muy mundana, cuando este leyese en Slack “enerbot canta”, seleccionase algún extracto de lyrics predefinido y enviase línea por línea, con un pequeño intervalo de segundos entre estas. Simulando el acto de escribir.

Es más recitar que cantar, pero: ¿hace mal un poco de imaginación?

En Ruby, es increíblemente simple, un .each por cada nueva línea en conjunto a un sleep(1).

¿Dónde esta la dificultad?

Al ser el primer bot, Enerbot creció con una estructura muy estricta, obligándolo a realizar bastantes validaciones y aplicar reglas cuestionables, conllevando a que este te responda con el texto completo, sin poder iterar sobre método de respuesta.

En resumen, se malcrió.

Así que como buen padre, en vez de enderezar al pequeño, hice lo más razonable. Tener uno nuevo y prometerme a mí mismo no volver a cometer los mismos errores.

Planificación

El nuevo bot a concebir, debía lograr lo siguientes puntos:

  • Cantar (recitar).
  • Ser tedioso en forma agradable y que pueda dar recomendaciones basado en tiempo transcurrido desde “algo” o acontecimientos.
  • Su rendimiento y disposición dependen del clima.

Composición

No todo lo realizado con Enerbot debía ser descartado, por ejemplo, el núcleo, el cual defino como la parte encargada de realizar el loop constante de respuestas en tiempo real, debía mantenerse. El resto, requería de bastante atención para conseguir extender los alcances de Enerbot.

Luego de 15 minutos de deliberación y quedarme sin jugo de piña, encontré la manera más simple de reorganizar el resto de componentes y funcionalidades.

¿Cuál? Dividiéndolo en los componentes de alma:

  • Mente. 👤
  • Voluntad. 💪🏻
  • Emociones. ❤️

Proceso del parto

Separarlo en esos 3 componentes me facilitó enormemente la visualización de la nueva estructura. Quedando inicialmente de la siguiente forma:

actions/*.rb              # Funciones para todos los gustos.
mind/consciousness.rb # Definición de los diferentes clientes.
senses/sight.rb # Modulos relacionados a búsquedas.
client.rb # Carga de configs e inicio del bot.
directives.rb # Funciones y mucho regex.
main.rb # Loop eterno de lectura constante.
voice.rb # Modulo para interactuar con Slack.

Resolviendo mis dos inquietudes principales previas al nacimiento de esta nueva versión:

  • Justifique su respuesta.
  • Puntos extra con el uso de palabras en inglés.

◽️ Respuesta: distribuyendo en Mind, Consciousness, and Behavior.

Dentro del directorio Mind, se encuentra el modulo de Consciousness que inicializa el cliente adecuado para las interacciones con Slack.

Incluido en núcleo del bot y en cualquiera de las otras funcionalidades que lo requieran.

◾️ Segunda: ¿Podrá el nuevo bot cantar canciones pop?

  • Recitar también cuenta.
  • Puntos extra con el uso de palabras en ingles.

◽️ Respuesta: distribuyendo el trabajo en Mind > Judgment, and Voice.

Voice es el módulo que disponibiliza las distintas formas de postear un mensaje o contenido en Slack al resto de funcionalidades, empleando Conscious para inicializar el cliente adecuado.

El modulo judgment toma la decisión de cómo manejar el mensaje.

No se me ocurrió un cómo meter la “voz” del bot dentro de los tres directorios que componen su alma, así que quedó en “voice.rb”.

Notas de paternidad

Decidir el nombre de la criatura siempre es un trabajo difícil, yo quería AIGIS, mientras que el resto del equipo ENERGON prefería algo más como MAGI.

El punto medio fue MAIGIS, al menos de forma provisional.

MAIGIS actualmente ya posee algunos de sus “sentidos” con funciones como: saber la temperatura (Perception) y verse influenciada por esta, buscar información dentro de Slack y mirar Twitter (Sight).

Otro detalle destacable, es que a diferencia de su hermano mayor, MAIGIS utiliza el Sandbox de MongoDB que te entrega 500 Mb para lo que se te antoje. Buena opción si prefieres usar una base de datos como servicio.

Como reflexión de esta experiencia, no recomendaría abiertamente desarrollar en base a lo que sientas o te creas correcto, pero he de admitir, me fue bastante útil. Dividiendo el comportamiento de una forma “similar” al que empleamos nosotros, permitió ciertos cambios y la posibilidad de otras que no se me hubiesen ocurrido siguiendo otro modelo.

Eventualmente crecerá y obtendrá nuevos trucos, por el momento canta y eso es suficiente.

Si quieres echarle un 👁 a los repos, links abajo:

TL;DR: En resumen quedó entrete la nueva versión basada en el capricho de mi hora de almuerzo.

--

--