Escribiendo Plugins de Hubot con CoffeeScript

En caso de que te hayas escondido debajo de una roca, Campfire es una aplicación de chat en tiempo real, escrita por nuestros amigos en 37 Señales. Campfire tiene una API robusta, que le brinda la posibilidad de utilizar herramientas para mejorar el entorno del equipo.

Campfire es ampliamente utilizado por empresas con trabajadores remotos y permite una colaboración rápida entre equipos distribuidos. Tenga en cuenta que, en algunos casos, como en mi trabajo en Emma, ​​Inc., el control remoto podría significar "en la habitación de al lado". En Emma, ​​podemos verificar el estado de nuestros sistemas, recuperar rápidamente los datos del cliente y muchas otras tareas útiles que facilitan nuestro trabajo. Muchas de estas tareas son posibles con la implementación de Hubot..


¿Qué es Hubot??

Los complementos son divertidos de escribir y aún más divertidos de usar.

Hubot es un marco de scripts creado por la gente de Github; lo describen como "un robot personalizable, que se alimenta con energía de kegerator". Hubot es de código abierto, escrito en CoffeeScript en Node.js, y se implementa fácilmente en plataformas como Heroku. Si bien Hubot puede ejecutarse en muchos entornos diferentes, me centraré en ejecutar Hubot dentro de los límites de una sala de chat de Campfire.

Además de liberar la fuente de Hubot, Github creó una pequeña cantidad de scripts precompilados que se envían con la fuente de Hubot. Estos scripts le permiten a Hubot hacer cosas como importar imágenes fácilmente / img lindos gatitos:

O puedes importar videos / YouTube Breakdance:

Github también creó un repositorio de complementos de Hubot donde los usuarios pueden enviar nuevos complementos. En el momento de escribir este artículo, hay 294 complementos en el repositorio público, que cubren todo tipo de funcionalidades que van desde lo útil: verificar el estado de un servicio de AWS, interactuar con un servidor Travis-CI o la codificación base64; Para el humorístico: reproducir un clip de audio rimshot; Al absurdo: añadir un bigote a una fotografía. Incluso puedes ver el complemento generador de apodos que escribí!

El cielo es el límite con Hubot. Si se puede hacer algo desde Node.js, entonces se puede automatizar utilizando Hubot. Con solo un poco de conocimiento de CoffeeScript, puede escribir el próximo gran complemento de Hubot. Hablando de eso, tomemos un rápido curso de actualización en CoffeeScript antes de escribir nuestro primer plugin de Hubot. Si ya está familiarizado con CoffeeScript, no dude en pasar a la siguiente sección..


¿Qué es CoffeeScript??

CofeeeScript se describe a sí mismo como un "pequeño lenguaje que se compila en JavaScript" y "un intento de exponer las partes buenas de JavaScript de una manera sencilla". El objetivo de CoffeeScript es eliminar el tedio de la repetición (todos esos molestos llaves, punto y coma y paréntesis) de la vida de los desarrolladores y destilar JavaScript hasta su esencia. Como resultado, su código se vuelve más fácil de leer, y hay menos de que arrancar. Veamos algunos ejemplos simples y comparemos el JavaScript resultante que compila CoffeeScript.

Oh espera, dije "compilar"?

Seguro que lo hice, y como lo haces? Me alegra que hayas preguntado ... hay una serie de herramientas que ofrecen este servicio. Mi favorito personal es CodeKit, pero asegúrese de revisar la línea de comandos de Yeoman. También puede compilar directamente CoffeeScript si ha instalado Node.js, e incluso puede usar una herramienta de conversión en tiempo real como JS2Coffee, que le permite realizar conversiones entre CoffeeScript y JavaScript..

Instrumentos de cuerda

Entonces, ¿qué aspecto tiene CoffeeScript? Empecemos con una línea de JavaScript:

var author = 'Ernest Cline';

El equivalente de CofeeScript es:

autor = 'Ernest Cline'

Objetos

Ese es un ejemplo simple, pero comienza a mostrar lo que CoffeeScript hace por usted ... eliminando la verbosidad. Tenga en cuenta la ausencia de la var palabra clave y el punto y coma. Nunca los necesitarás cuando escribas en CoffeScript. ¿Qué tal una referencia de objeto en JavaScript??

book = title: 'Ready Player One', fecha: '10 / 16/2011 ', referencias: juegos: [' Street Fighter ',' Pac-Man '], música: [' Oingo Boingo ',' Men Without Sombreros '], películas: [' Regreso al futuro ',' El último caza estelar ']

Aquí está la versión de CoffeeScript:

libro = título: "Ready Player One" fecha: "10/16/2011" referencias: juegos: ["Street Fighter", "Pac-Man"] música: ["Oingo Boingo", "Men Without Hats"] películas: ["Regreso al futuro", "El último caza estelar"]

Una cosa clave que debe recordar acerca de CoffeeScript es que su código todavía está allí, pero la pelusa adicional de algunos delimitadores, terminadores y palabras clave se han ido. CoffeeScript da un paso adicional (o tres) y asume esos caracteres por ti.

Funciones

¿Qué hay de las funciones que podrías preguntar? Son igualmente limpios y ordenados, eliminando llaves y la palabra clave return. Como antes, aquí está el JavaScript:

función openGate (tecla) var gates = 'Copper': 'Has abierto Copper Gate', 'Jade': 'Has abierto Jade Gate', 'Crystal': 'Has abierto Crystal Gate'; puertas de retorno [clave] || 'Tu clave no es válida' openGate ('Jade')

Y aquí está lo mismo en CoffeeScript:

openGate = (clave) -> gates = Copper: "Has abierto Copper Gate" Jade: "Has abierto Jade Gate" Crystal: "Has abierto Crystal Gate" gates [key] | "Tu clave no es válida" openGate "Jade"

CoffeeScript tiene una serie de otras características extremadamente útiles que lo convierten en una opción convincente. Características como comprensión (básicamente, bucles de línea simple), clases "verdaderas", reemplazo de cadenas a mano, comparaciones encadenadas y más. Puede leer más sobre CoffeeScript en su sitio web en CoffeeScript.org.


Preparando el escenario

Tendremos que instalar algunos elementos antes de poder comenzar a trabajar en nuestro complemento. Necesitaremos Node.js, NPM y Hubot, junto con sus diversas dependencias..

Instalación

El cielo es el límite con Hubot..

Primero instalemos Node.js. Abre una ventana de terminal y escribe cual nodo. Si recupera una ruta del sistema de archivos, puede omitir esta sección. Si tú ves nodo no encontrado O algo similar, entonces necesitarás instalarlo. Diríjase al sitio web Node.js y descargue (e instale) el binario apropiado para su sistema operativo. A menos que haya instalado recientemente Node, probablemente sea una buena idea seguir adelante e instalar la versión más reciente. Las versiones más recientes de Node se envían con NPM (o Node Package Manager) que usaremos para instalar nuestro software.

A continuación necesitaremos instalar Hubot. Tipo npm instala hubot -g en la ventana de tu terminal y deja que NPM haga su trabajo. Prefiero instalar complementos como este globalmente, por lo tanto, la bandera -g.

Usando Hubot localmente

Una vez finalizada la instalación, discos compactos al directorio de instalación de hubot y ejecutarlo por primera vez. Ese directorio puede diferir dependiendo de su máquina particular, pero está en / usr / local / lib / node_modules / hubot en mi maquina Encienda el hubot con el siguiente comando . bin / hubot. Luego probarlo con el comando hubot ping. Hubot debería responder inmediatamente con APESTAR. Echemos un vistazo rápido a ese complemento antes de escribir el nuestro. Sus tres líneas de código son las entrañas de casi todos los demás complementos de Hubot. Aquí está en todo su esplendor:

module.exports = (robot) -> robot.respond / ping $ / i, (msg) -> msg.send "ping"

Cuando Hubot se inicia por primera vez, se ejecuta a través de cada complemento en el directorio de scripts. Cada plugin está escrito usando el común módulo.exportaciones El patrón de nodo, que permite que el complemento se identifique ante Hubot, y también le permite a Hubot acceder al funcionamiento interno del complemento. También se encuentran en un complemento son uno o más responder función de llamadas. Cada una de estas llamadas se correlaciona con un detector de eventos que espera escuchar una palabra clave o patrón específico. Por último, este plugin devuelve un valor usando msg.send, devolviendo cualquier mensaje arbitrario que prefieras.

Por cierto, si tienes curiosidad (como lo estaba yo) de ver qué contienen los argumentos del robot, o msg, simplemente agrega un console.log Declaración en cualquier parte del código. Por ejemplo, añadiendo console.log (robot) inmediatamente después de la módulo.exportaciones instrucciones muestra la siguiente información:

nombre: 'Hubot', comandos: [], versión: '2.3.4', servidor:  documentación: , oyentes: [robot: [Circular], expresiones regulares: / ^ Hubot [:,]? \ s * (?: PING $) / i, devolución de llamada: [Función], emparejador: [Función]], [más información]

Ahora estás listo para comenzar a trabajar en nuestro primer plugin de Hubot.


Su primer plugin de Hubot

Está bien, ya es suficiente. Sé que estás listo para escribir tu propio complemento, así que hagamos uno rápido. Crea un nuevo archivo dentro del scr / scripts Directorio de su instalación de Hubot. Nombralo pensamiento profundo, ábralo en el editor de su elección y luego ingrese las siguientes líneas:

# Configura el plugin module.exports = (robot) -> # espera a que aparezca la cadena "hubot deep" robot.respond / deep / i, (msg) -> # Configura la url de un servidor remoto msg.http (' http://andymatthews.net/code/deepthoughts/get.cfm ') # y hace un http get call .get () (error, respuesta, cuerpo) -> # devuelve la respuesta completa msg.send body

Ya estás familiarizado con las dos primeras líneas, así que no las revisaremos. La tercera línea comienza la configuración de una solicitud HTTP; en este caso, es un GET que no envía parámetros al sitio remoto. La cuarta línea ejecuta la solicitud HTTP y configura una función de devolución de llamada que recibe los errores, la respuesta sin formato y el cuerpo de la página devuelta. En este caso, el cuerpo de la página cargada ni siquiera tiene HTML ... es simplemente una cadena. Esto nos permite devolverlo directamente al usuario por medio de msg.send. Guarde ese archivo, reinicie Hubot con un hubot die y un bin / hubot, y luego hazte un pensamiento profundo al azar con una hubot profundo. Esperemos que sea algo profundo, que provoque una reflexión profunda y no el del vendedor de trampolines o la mofeta dorada..

Tu tarea de Hubot

Ahora que has escrito tu primer plugin, aquí está el código para otro. Vea si puede averiguar qué hace y cómo usarlo.

QS = requiere 'cadena de consulta' module.exports = (robot) -> robot.respond / post (. +) / I, (msg) -> url = 'http://httpbin.org/post' data = QS.stringify ('hubot-post': msg.match [1]) msg.http (url) .post (data) (err, res, body) -> msg.send body
  • Observe que la importación ocurre en la parte superior.
  • ¿Cuál es el método de respuesta escuchando??
  • Que es msg.match?
  • Ver que el plugin también puede hacer solicitudes de correos.?

Ve adelante y haz lo mismo.

Como puede ver en estos pocos ejemplos, escribir plugins de Hubot es una tarea bastante sencilla. Los complementos pueden ser útiles o caprichosos, pero son divertidos de escribir y aún más divertidos de usar. ¿Qué tipo de plugin crearás para el mundo??

.