Slack es uno de esos servicios que si bien es privativo, te da la libertad de jugar con sus APIs a gusto. Es por esto que existe multitud de librerías para trabajar con Slack y en variados lenguajes. Hoy expongo un pequeño experimento que hice basado en la librería simple slack api.

Este experimento actúa más bien como un framework para la creación de bots en Slack. Framework porque te obliga a trabajar de una determinada manera, pero a cambio de abstraer la implementación de la librería.

Como crear un bot en tu cuenta de Slack

Si no haz creado un bot antes, solo debes ir a la página de la integración “Bot” en Slack.

Si ya estás logueado solo presionas “Add Configuration”, ingresas el nombre de tu bot y ya está!

Copiar el “API Token”, ya que lo utilizaremos más tarde.

Si ya tienes un Slack de pruebas, vete a “Apps (+)” en el menú izquierdo y presiona sobre el bot que recién creaste, esto lo agregará automáticamente a tu Slack.

Conectando la aplicación al bot

Ya tienes tu bot creado en Slack, pero si no le metemos código solo se quedará tirado ahí por siempre. Partamos clonando el repo del framework:

git clone https://github.com/felipeleivav/java-slack-bot-seed.git

Una vez clonado, editamos el archivo properties:

config/slack.bot.properties

Y en la clave, le asignamos el token que copiamos anteriormente.

slack.token.testbot = <token>

Ahora, a darle build:

./build.sh

Y por último, arrancar!

cd dist
./launch.sh

Let’s see…

Cada mensaje que enviamos por Slack, irá a parar a la aplicación que acabas de arrancar!

Nice!

Programando el bot

Vale, ya creamos el bot, tenemos la aplicación conectada, ahora toca darle un poco de vida.

How?

Abre el proyecto clonado en tu IDE favorito. El único package que deberás tocar es com.slack.app.bot. Toda clase que esté en ese package se considerará un bot.

Para poder conectar una clase bot a Slack, solo debes agregar la anotación @TokenProperty apuntando a la clave del archivo properties con el token:

@TokenProperty("slack.token.newbot")
public class NewBot {

}

Luego, para darle una función debes crear un método que incluya al menos una de las siguientes anotaciones:

  • @IsPM le dice que el método leerá solo los mensajes directos
  • @IsMention le dice que el método leerá solo los mensajes donde mencionen a tu bot
  • @Channel("general") lee solo los mensajes de #general
  • @User("felipe") lee solo los mensajes de @felipe
  • @Message("hello") lee solo los mensajes que digan hello
  • @MessageRegex(".*hello.*") y los que contengan hello (regexp!)
  • @Any ignora cualquier filtro y lee todos los mensajes

Y por último, tenemos las anotaciones de parámetros:

  • @IsPMParam booleano que indica si el mensaje es directo
  • @IsMentionParam booleano que indica si es una mención al bot
  • @UserParam objeto SlackUser con detalles del usuario que envió el mensaje
  • @ChannelParam objeto SlackChannel con el detalle del canal
  • @MessageParam string del mensaje

Por ejemplo, si quieres contestar solo mensajes privados:

@IsPM
public String contestarPrivado(@UserParam UserSlack usuario) {
    return "Hola " + usuario.getUsername() + "!";
}

Cualquier duda puedes dirigirte al repo de este proyecto.

Detalles técnicos

Esta librería utiliza la API Reflection de Java para la implementación de las anotaciones. Además esta diseñado con multithreading, si ves el App.java verás que por cada bot que se detecte se generará un hilo, lo que te permitirá crear N bots dentro del mismo proyecto y sin que uno cuelgue al otro cuando por ejemplo se realice un llamado a un servicio o una base de datos producto de un chat en Slack.

Final notes

La creación del bot se basó en el framework que cree para este propósito, pero si te interesa trabajar directamente con la librería también puedes hacerlo! De todas las librerías de Slack que he visto esta es la que me ha parecido más completa y fácil de usar. Pásate por el repo en Github para saber como utilizarla.