Asap: um comando do Slack para notificar o mais rápido possível

Slack ASAP é um comando de barra do Slack que usamos na Sophilabs para notificar nossos colegas o mais rápido possível. O comando envia SMS, e-mails e mensagens privadas do Slack ao contato. Ele pode ser configurado para adicionar mais notificadores ou até removê-los.

Funciona como um servidor Cowboy que escuta o comando de barra referenciado pelo aplicativo Slack ASAP. O aplicativo registra um comando de barra que chama o servidor; este, por sua vez, chama cada notificador e passa a mensagem processada do Slack. Um notificador pode fazer qualquer coisa com a mensagem e até adicionar anexos ao resultado do comando. O projeto inclui ações comuns, como enviar e-mails com Bamboo e SMS com ExTwilio. Outros notificadores possíveis são fazer chamadas telefônicas, enviar uma mensagem do Google Hangouts ou reproduzir uma voz sintetizada com a mensagem pelos alto-falantes. O pacote busca as informações do perfil do destinatário e faz o trabalho de expor todos os dados por meio da estrutura SlackAsap.Message.
Este é um fluxo básico:
- Cowboy recebe a solicitação do comando de barra.
- Transforma os parâmetros JSON em uma
SlackAsap.Message _struct_. - Chama o notificador
SlackAsap.Core, que verifica o token do Slack e processa o comando. - Se for um comando de ajuda, simplesmente exibe as informações de uso.
- Se for uma mensagem, chama os demais notificadores um por um e passa a mensagem do notificador anterior ao seguinte.
- Responde à solicitação com a mensagem resultante depois que ela é processada pelo último notificador.

O projeto começou como parte da nossa pesquisa e desenvolvimento com Elixir na Sophilabs. Foi impressionante a rapidez com que criamos um comando de barra e facilitamos os testes com uma abordagem TDD. O artigo de Lasse Ebert sobre mocks em Elixir mostra como criá-los rapidamente sem usar nenhuma biblioteca. Percebi que já há bibliotecas e ferramentas suficientes para resolver com eficiência a maioria dos problemas comuns, como interagir com Slack e enviar e-mails ou SMS. O único problema que encontrei durante o desenvolvimento foi a dificuldade de identificar erros de programação ou configuração. Os rastreamentos de pilha do iex não são claros o suficiente, então as funções precisam comunicar os erros da maneira mais clara possível. Assim, quem as chama pode interpretar os possíveis erros e fazer as correções necessárias. Por exemplo, cometi um erro de configuração no pacote ExTwilio, cuja solução foi mudar a sintaxe de configuração da API de um Map para uma string. No entanto, por falta de tratamento de erros, recebi um erro pouco específico como o seguinte ao chamar a função da API de SMS do ExTwilio.
{:error, "The requested resource /2010-04-01/Messages.json was not found", 404}
Felizmente, Elixir inclui um depurador integrado, disponível no seu console, iex. Este artigo mostra algumas técnicas para depurar módulos.
Criar esse pacote foi uma boa experiência. O código está disponível no Github. Como sempre, qualquer contribuição é bem-vinda.