Scrittura di plugin Hubot con CoffeeScript

Nel caso ti stia nascondendo sotto una roccia, Campfire è un'applicazione di chat in tempo reale, scritta dai nostri amici a 37 Signals. Campfire ha un'API robusta, che ti dà la possibilità di usare gli strumenti per migliorare l'ambiente del team.

Campfire è ampiamente utilizzato da aziende con lavoratori remoti e consente una rapida collaborazione tra team distribuiti. Tieni presente che, in alcuni casi, ad esempio nel mio lavoro presso Emma, ​​Inc., il telecomando potrebbe significare "nella prossima stanza". In Emma, ​​possiamo controllare lo stato dei nostri sistemi, recuperare rapidamente i dati dei clienti e molte altre attività utili che facilitano il nostro lavoro. Molte di queste attività sono rese possibili con l'implementazione di Hubot.


Cos'è l'Hubot?

I plugin sono divertenti da scrivere e ancora più divertenti da usare.

Hubot è un framework scriptable creato dagli utenti di Github; lo descrivono come "un robot di embetterment di vita personalizzabile e alimentato da kegerator". Hubot è open source, scritto in CoffeeScript su Node.js e facilmente implementabile su piattaforme come Heroku. Mentre Hubot può essere eseguito in molti ambienti diversi, mi concentrerò sull'esecuzione di Hubot all'interno dei confini di una chat room di Campfire.

Oltre a rilasciare l'origine per Hubot, Github ha creato un piccolo numero di script predefiniti forniti con il sorgente Hubot. Questi script consentono a Hubot di fare cose come importare facilmente le immagini / img simpatici gattini:

O puoi importare video / breakdance su youtube:

Github ha anche creato un repository di plugin Hubot in cui gli utenti possono inviare nuovi plug-in. Al momento della stesura di questo documento, ci sono 294 plug-in nel repository pubblico, che coprono tutti i tipi di funzionalità che vanno dall'utile: controllare lo stato di un servizio AWS, interagire con un server Travis-CI o con codifica base64; per l'umoristico: riproduzione di una clip audio rimshot; all'assurdo: aggiungi un paio di baffi a una fotografia. Puoi anche controllare il plugin del generatore di nickname che ho scritto!

Il cielo è il limite con Hubot. Se qualcosa può essere fatto da Node.js, allora può essere automatizzato usando Hubot. Con solo un po 'di conoscenza di CoffeeScript, puoi scrivere il prossimo grande plugin di Hubot. A proposito, facciamo un rapido corso di aggiornamento in CoffeeScript prima di scrivere il nostro primo plug-in Hubot. Se hai già familiarità con CoffeeScript, sentiti libero di passare alla sezione successiva.


Cos'è CoffeeScript?

CofeeeScript si descrive come un "piccolo linguaggio che compila in JavaScript" e "un tentativo di esporre le parti buone di JavaScript in un modo semplice". L'obiettivo di CoffeeScript è quello di rimuovere la noia del boilerplate (tutte quelle fastidiose parentesi graffe, punto e virgola e parentesi) dalla vita degli sviluppatori e distillare JavaScript fino alla sua essenza. Di conseguenza, il tuo codice diventa più facile da leggere e ne è necessario meno. Diamo un'occhiata ad alcuni semplici esempi e confrontiamo il risultante JavaScript che compilate CoffeeScript.

Oh aspetta, ho detto "compilare"?

Di sicuro l'ho fatto, e come lo fai? Sono contento che tu abbia chiesto ... c'è un numero di strumenti che offrono questo servizio. Il mio preferito è CodeKit, ma assicurati di controllare la linea di comando guidata da Yeoman. Puoi anche compilare direttamente CoffeeScript se hai installato Node.js e puoi anche utilizzare uno strumento di conversione in tempo reale come JS2Coffee, che ti consente di convertire avanti e indietro tra CoffeeScript e JavaScript.

stringhe

Allora, che aspetto ha CoffeeScript? Iniziamo con una riga di JavaScript:

var author = 'Ernest Cline';

L'equivalente CofeeScript è:

autore = 'Ernest Cline'

Oggetti

Questo è un semplice esempio, ma inizia a mostrare ciò che CoffeeScript fa per te ... rimuovendo la verbosità. Nota l'assenza del var parola chiave e il punto e virgola. Non avrai mai bisogno di quelli quando scrivi in ​​CoffeScript. Che ne dici di un riferimento a un oggetto in JavaScript?

book = title: 'Ready Player One', data: '10 / 16/2011 ', riferimenti: games: [' Street Fighter ',' Pac-Man '], musica: [' Oingo Boingo ',' Men Without Hats '], film: [' Back To The Future ',' The Last Starfighter ']

Ecco la versione di CoffeeScript:

book = title: "Ready Player One" data: "16/10/2011" riferimenti: giochi: ["Street Fighter", "Pac-Man"] musica: ["Oingo Boingo", "Men Without Hats"] film: ["Ritorno al futuro", "The Last Starfighter"]

Una cosa fondamentale da ricordare su CoffeeScript è che il tuo codice è ancora lì, ma il peluche extra di alcuni delimitatori, terminatori e parole chiave sono spariti. CoffeeScript fa un passo in più (o tre) e assume quei personaggi per te.

funzioni

Che dire delle funzioni che potresti chiedere? Sono ugualmente puliti e ordinati, rimuovendo le parentesi graffe e la parola chiave return. Come prima, ecco il JavaScript:

function openGate (key) var gates = 'Copper': 'Hai aperto il Copper Gate', 'Jade': 'Hai aperto il Jade Gate', 'Crystal': 'Hai aperto il Crystal Gate'; return gates [chiave] || "La tua chiave non è valida" openGate ('Jade')

Ed ecco la stessa cosa in CoffeeScript:

openGate = (chiave) -> gates = Rame: "Hai aperto il Cancello di Rame" Giada: "Hai aperto la Porta di Giada" Crystal: "Hai aperto il Cancello di Cristallo" cancelli [chiave] | "La tua chiave non è valida" openGate "Jade"

CoffeeScript ha una serie di altre funzioni estremamente utili che ne fanno una scelta irresistibile. Funzionalità come le comprensioni (fondamentalmente loop di una linea), classi "vere", sostituzione pratica delle stringhe, confronti concatenati e altro ancora. Puoi leggere di più su CoffeeScript sul suo sito Web su CoffeeScript.org.


Ponendo le basi

Dovremo installare alcuni elementi prima di poter iniziare a lavorare sul nostro plug-in. Avremo bisogno di Node.js, NPM e Hubot - insieme alle loro varie dipendenze.

Installazione

Il cielo è il limite con Hubot.

Iniziamo ad installare Node.js. Apri una finestra di terminale e digita quale nodo. Se si ottiene un percorso del file system, è possibile saltare questa sezione. Se vedi nodo non trovato o qualcosa di simile, quindi dovrai installarlo. Vai al sito Web Node.js e scarica (e installa) il file binario appropriato per il tuo sistema operativo. A meno che tu non abbia recentemente installato Node, è probabilmente una buona idea andare avanti e installare la versione più recente. Versioni più recenti di Node ship con NPM (o Node Package Manager) che useremo per installare il nostro software.

Il prossimo passo avremo bisogno di installare Hubot. genere npm install hubot -g nella finestra del terminale e lasciare che NPM faccia il suo lavoro. Preferisco installare plugin come questo a livello globale, quindi il flag -g.

Usando Hubot Localmente

Al termine dell'installazione, lo faremo CD alla directory di installazione di hubot ed eseguirla per la prima volta. Quella directory può differire a seconda della macchina paricolare, ma è a / Usr / local / lib / node_modules / hubot sulla mia macchina. Avvia hubot con il seguente comando . bin / hubot. Quindi provalo con il comando hubot ping. Hubot dovrebbe immediatamente rispondere con PONG. Diamo un'occhiata veloce a quel plugin prima di scrivere il nostro. Le sue tre linee di codice sono l'anima di quasi tutti gli altri plugin di Hubot. Eccolo in tutta la sua gloria:

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

Quando Hubot viene avviato per la prima volta, scorre attraverso ogni plug-in nella directory degli script. Ogni plugin è scritto usando il comune module.exports Pattern dei nodi, che consente al plug-in di identificarsi con Hubot e consente inoltre a Hubot di accedere ai meccanismi interni del plugin. Trovati anche in un plugin sono uno o più rispondere chiamate di funzione. Ognuna di queste chiamate è correlata a un listener di eventi che attende di ascoltare una parola chiave o uno schema specifico. Infine, questo plugin restituisce un valore usando msg.send, restituendo qualsiasi messaggio arbitrario che preferisci.

A proposito, se sei curioso (come lo ero io) di vedere cosa contengono gli argomenti del robot o del msg, aggiungi semplicemente un console.log dichiarazione ovunque nel codice. Ad esempio, aggiungendo console.log (robot) subito dopo il module.exports dichiarazioni mostra le seguenti informazioni:

name: 'Hubot', comandi: [], versione: '2.3.4', server:  documentazione: , ascoltatori: [robot: [Circolare], regex: / ^ Hubot [:,]? \ s * (?: PING $) / i, callback: [Function], matcher: [Function]], [more stuff]

Ora sei pronto per iniziare a lavorare sul nostro primo plug-in Hubot.


Il tuo primo plugin Hubot

Ok, già abbastanza. So che sei pronto per scrivere il tuo plug-in, quindi ti invitiamo a fare uno veloce. Crea un nuovo file all'interno del SCR / scripts directory dell'installazione di Hubot. Nominalo deepthoughts.coffee, aprilo nel tuo editor di scelta, quindi inserisci le seguenti righe:

# Configura il plugin module.exports = (robot) -> # attende che la stringa "hubot deep" si verifichi robot.respond / deep / i, (msg) -> # Configura l'url di un server remoto msg.http (' http://andymatthews.net/code/deepthoughts/get.cfm ') # e fa una chiamata http get .get () (error, response, body) -> # restituisce la risposta completa msg.send body

Conoscerai già le prime due righe, quindi non le esamineremo. La terza riga inizia la configurazione di una richiesta HTTP; in questo caso, è un GET che non invia parametri al sito remoto. La quarta riga esegue la richiesta HTTP e imposta una funzione di callback che riceve eventuali errori, la risposta non elaborata e il corpo della pagina restituita. In questo caso, il corpo della pagina caricata non ha nemmeno HTML ... è semplicemente una stringa. Questo ci permette di restituirlo direttamente all'utente tramite msg.send. Salva quel file, riavvia Hubot con a muore hubot e a bin / hubot, e poi ottenere un profondo pensiero casuale con a hubot profondo. Si spera che sia qualcosa di profondo, profondamente stimolante e non quello sul venditore di trampolino o sulla puzzola d'oro.

I tuoi compiti di Hubot

Ora che hai scritto il tuo primo plug-in, ecco il codice per un altro. Vedi se riesci a capire cosa fa e come usarlo.

QS = richiede 'querystring' 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
  • Si noti l'avvenimento di importazione in alto.
  • Qual è il metodo di risposta per l'ascolto?
  • Cosa è msg.match?
  • Vedi che il plugin può anche fare richieste post?

Vai avanti e fai lo stesso

Come puoi vedere da questi pochi esempi, scrivere i plugin di Hubot è un compito abbastanza semplice. I plugin possono essere utili o estrosi, ma sono divertenti da scrivere e ancora più divertenti da usare. Che tipo di plugin creerai per il mondo?

.