Asap: un comando de Slack para notificar lo antes posible

Slack ASAP es un comando de barra de Slack que usamos en Sophilabs para notificar a nuestros compañeros lo antes posible. El comando envía SMS, correos electrónicos y mensajes privados de Slack al contacto. Se puede configurar para agregar más notificadores o incluso eliminarlos.

Funciona como un servidor Cowboy que escucha el comando de barra al que hace referencia la aplicación Slack ASAP. La aplicación registra un comando de barra que llama al servidor; este, a su vez, llama a cada notificador y le pasa el mensaje procesado de Slack. Un notificador puede hacer cualquier cosa con el mensaje e incluso agregar adjuntos al resultado del comando. El proyecto incluye acciones comunes, como enviar correos con Bamboo y SMS con ExTwilio. Otros notificadores posibles son hacer llamadas telefónicas, enviar un mensaje de Google Hangouts o reproducir una voz sintetizada con el mensaje por los altavoces. El paquete obtiene la información del perfil del destinatario y se encarga del trabajo de exponer todos los datos mediante la estructura SlackAsap.Message.
Este es un flujo básico:
- Cowboy recibe la solicitud del comando de barra.
- Transforma los parámetros JSON en una
SlackAsap.Message _struct_. - Llama al notificador
SlackAsap.Core, que comprueba el token de Slack y procesa el comando. - Si es un comando de ayuda, simplemente muestra la información de uso.
- Si es un mensaje, llama a los demás notificadores uno por uno y pasa el mensaje del notificador anterior al siguiente.
- Responde a la solicitud con el mensaje resultante después de que lo procese el último notificador.

El proyecto empezó como parte de nuestra investigación y desarrollo con Elixir en Sophilabs. Nos sorprendió lo rápido que pudimos crear un comando de barra y facilitar las pruebas con un enfoque TDD. El artículo de Lasse Ebert sobre mocks en Elixir muestra cómo crearlos rápidamente sin usar ninguna biblioteca. Descubrí que ya hay suficientes bibliotecas y herramientas para resolver eficazmente la mayoría de los problemas habituales, como interactuar con Slack y enviar correos o SMS. El único problema que encontré durante el desarrollo fue la dificultad para identificar los errores de programación o configuración. Las trazas de pila de iex no son suficientemente claras, por lo que las funciones deben comunicar los errores de la forma más clara posible. Así, quien las invoca puede interpretar los posibles errores y realizar las correcciones necesarias. Por ejemplo, cometí un error de configuración en el paquete ExTwilio, cuya solución fue cambiar la sintaxis de configuración de la API de un Map a una cadena. Sin embargo, por la falta de manejo de errores, recibí un error poco específico como el siguiente al llamar a la función de la API de SMS de ExTwilio.
{:error, "The requested resource /2010-04-01/Messages.json was not found", 404}
Por suerte, Elixir incluye un depurador integrado disponible en su consola, iex. Este artículo muestra algunas técnicas para depurar módulos.
Crear este paquete fue una buena experiencia. El código está disponible en Github. Como siempre, cualquier contribución es bienvenida.