Scrierea Plugin-urilor Hubot cu CoffeeScript

În cazul în care ați fost ascunse sub o piatră, Campfire este o aplicație de chat în timp real, scrisă de prietenii noștri la 37 de semnale. Campfire are un API robust, oferindu-vă posibilitatea de a înșuruba pe instrumente pentru a îmbunătăți mediul echipei.

Campfire este utilizat pe scară largă de companiile cu lucrători la distanță și permite o colaborare rapidă între echipe distribuite. Rețineți că, în unele cazuri, cum ar fi la serviciul meu la Emma, ​​Inc., telecomanda ar putea însemna "în camera următoare". La Emma, ​​putem verifica starea sistemelor noastre, putem recupera rapid datele despre clienți și multe alte sarcini utile care fac munca noastră mai ușoară. Multe dintre aceste sarcini sunt posibile prin implementarea lui Hubot.


Ce este Hubot?

Pluginurile sunt distractive pentru a scrie și chiar mai distractiv de utilizat.

Hubot este un cadru scripturi creat de oamenii de la Github; ei îl descriu ca "un robot personalizabil, cu kegerator-alimentat viața de embetterment". Hubot este open source, scris în CoffeeScript pe Node.js, și ușor de instalat pe platforme precum Heroku. În timp ce Hubot poate rula în mai multe medii diferite, mă voi concentra pe rularea lui Hubot în limitele unei camere de chat Campfire.

În plus față de eliberarea sursei pentru Hubot, Github a creat un număr mic de scripturi pre-construite livrate cu sursa Hubot. Aceste scripturi permit Hubotului să facă lucruri cum ar fi importul cu ușurință a imaginilor / img pisoi drăguț:

Sau puteți importa videoclipuri / youtube breakdancing:

Github a creat, de asemenea, un depozit Hubot, în care utilizatorii pot trimite noi pluginuri. De la această scriere, există 294 de pluginuri în repozitoriul public, acoperind tot felul de funcționalități, de la utilul: verificarea stării unui serviciu AWS, interacțiunea cu un server Travis-CI sau codarea base64; la umor: redarea unui clip audio de tip rimshot; la absurd: adăugați o mustață unei fotografii. Puteți chiar verifica plugin-ul generatorului de pseudonime pe care l-am scris!

Cerul este limita cu Hubot. Dacă se poate face ceva din interiorul Node.js, atunci poate fi automatizat folosind Hubot. Cu doar puțină cunoaștere de CoffeeScript, puteți scrie următorul mare plugin Hubot. Vorbind despre, să facem un curs de perfecționare rapidă în CoffeeScript înainte de a scrie primul nostru plugin Hubot. Dacă sunteți deja familiarizat cu CoffeeScript, atunci nu ezitați să mergeți înainte în secțiunea următoare.


Ce este CoffeeScript?

CofeeeScript se descrie ca o "limbă mică care compilează în JavaScript" și "o încercare de a expune părțile bune ale JavaScript într-un mod simplu". Scopul lui CoffeeScript este acela de a elimina tediul de placă de boiler (toate coastele ascuțite, virgule și paranteze) de la viața dezvoltatorilor și distilat JavaScript până la esența ei goală. Drept urmare, codul dvs. devine mai ușor de citit și mai puține dintre ele se pot încărca. Să aruncăm o privire la câteva exemple simple și să comparăm rezultatul JavaScript pe care îl compilați CoffeeScript.

Așteaptă, am spus "compilați"?

Sigur că am făcut-o și cum faceți asta? Mă bucur că ați întrebat ... există o serie de instrumente care oferă acest serviciu. Preferatul meu personal este CodeKit, dar asigurați-vă că verificați linia de comandă condusă de Yeoman. Puteți, de asemenea, să compilați direct CoffeeScript dacă ați instalat Node.js și puteți chiar utiliza un instrument de conversie în timp real, cum ar fi JS2Coffee, care vă permite să convertiți înainte și înapoi între CoffeeScript și JavaScript.

Siruri de caractere

Deci, ce arata CoffeeScript? Să începem cu o linie de JavaScript:

var autor = 'Ernest Cline';

Echivalentul CofeeScript este:

autor = 'Ernest Cline'

Obiecte

Acesta este un exemplu simplu, dar începe să arate ce face CoffeeScript pentru tine ... eliminând verbozitatea. Observați abținerea var cuvântul cheie și punct și virgulă. Nu veți avea nevoie de aceștia când scrieți în CoffeScript. Ce zici de o referință de obiect în JavaScript?

book = title: 'Ready Player One', data: '10 / 16/2011 ', referințe: games: [' Street Fighter ',' Pac-Man '], muzica:' Oingo Boingo ' Pălării], filme: ['Înapoi spre viitor', 'Ultimul starfighter']

Iată versiunea CoffeeScript:

book: title: "Ready Player One" data: "10/16/2011" referințe: jocuri: ["Street Fighter", "Pac-Man"]: ["Înapoi în viitor", "Ultimul starfighter"]

Un lucru cheie pe care trebuie să-l amintiți despre CoffeeScript este că codul dvs. este încă acolo, dar puful suplimentar al unor delimitatori, terminatori și cuvinte cheie nu mai există. CoffeeScript merge un pas în plus (sau trei) și își asumă acele personaje pentru tine.

funcţii

Ce zici de funcțiile pe care le-ai putea întreba? Ele sunt la fel de îngrijite și ordonate, îndepărtând bretele și cuvântul cheie de returnare. Ca și înainte, iată JavaScript-ul:

funcția openGate (cheie) var gates = 'Copper': 'Ai deschis poarta de cupru', 'Jade': 'Ai deschis poarta Jade', 'Crystal': 'Ai deschis poarta de cristal'; porți retur [cheie] || 'Cheia dvs. este nevalidă openGate (' Jade ')

Și aici este același lucru în CoffeeScript:

openGate = (cheie) -> porti = cupru: "Ai deschis poarta de cupru" Jade: "Ai deschis poarta Jade" Crystal: "Ai deschis portile Crystal" [cheie] | "Cheia dvs. este nevalidă" openGate "Jade"

CoffeeScript are o serie de alte caracteristici extrem de utile care o fac o alegere convingătoare. Caracteristici cum ar fi înțelegerile (în principiu bucle cu o singură linie), clase "adevărate", înlocuire de sfoane la îndemână, comparații în lanț și multe altele. Puteți citi mai multe despre CoffeeScript pe site-ul său la CoffeeScript.org.


Aranjand scena

Va trebui să instalăm câteva elemente înainte de a începe să lucrăm la plugin-ul nostru. Vom avea nevoie de Node.js, NPM și Hubot - împreună cu diferitele lor dependențe.

Instalare

Cerul este limita cu Hubot.

Să începem prima instalare Node.js. Deschideți o fereastră terminal și tastați care nod. Dacă primiți înapoi o cale de sistem de fișiere, puteți sări peste această secțiune. Dacă vezi nod nu a fost găsit sau ceva similar, atunci va trebui să îl instalați. Mergeți pe site-ul web Node.js și descărcați (și instalați) binarul adecvat pentru sistemul dvs. de operare. Cu excepția cazului în care ați instalat recent Nod, este probabil o idee bună să continuați și să instalați cea mai recentă versiune. Versiuni mai noi ale navei Node cu NPM (sau Node Package Manager) pe care o vom folosi pentru a instala software-ul nostru.

În continuare, va trebui să instalăm Hubot. Tip npm instala hubot -g în fereastra terminalului și lăsați NPM să-și facă treaba. Prefer să instalez pluginuri ca acesta în mod global, astfel încât flag -g.

Folosind Hubot pe plan local

După terminarea instalării, vom CD la directorul de instalare a hubot-ului și îl rulați pentru prima dată. Acest director poate diferi în funcție de mașina dvs. pariculară, dar este la / Usr / local / lib / node_modules / hubot pe mașina mea. Acoperiți hubotul cu următoarea comandă . bin / hubot. Apoi, testați-o cu comanda hubot ping. Hubot ar trebui să răspundă imediat cu PONG. Să aruncăm o privire rapidă la pluginul respectiv înainte de a scrie propriul nostru. Cele trei linii de cod sunt curajul aproape oricarui alt plugin Hubot. Aici este în toată slava sa:

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

Atunci când Hubot pornește pentru prima dată, rulează prin fiecare plugin din directorul de scripturi. Fiecare plugin este scris folosind funcția comună module.exports Modelul nodului, care permite pluginului să se identifice cu Hubot, și permite, de asemenea, accesul Hubot la lucrările interioare ale pluginului. De asemenea, găsite într-un plugin sunt unul sau mai multe răspunde apeluri funcționale. Fiecare dintre aceste apeluri se corelează cu un ascultător al unui eveniment care așteaptă să audă un anumit cuvânt cheie sau un model. În cele din urmă, acest plugin trimite înapoi o valoare folosind msg.send, returnează orice mesaj arbitrar preferat.

Apropo, dacă sunteți curios (ca și mine) să vedeți exact ce conțin argumentele robotului sau msg, adăugați pur și simplu console.log declarație oriunde în cod. De exemplu, adăugând console.log (robotul) imediat după module.exports afișează următoarele informații:

name: 'Hubot', comenzi: [], versiune: '2.3.4', server:  documentație: , ascultători: [robot: [Circular], regex: s * (?: PING $) / i, apel invers: [Funcție], matcher: [Funcție]], [mai multe chestii]

Acum sunteți gata să începeți să lucrați la primul nostru plugin Hubot.


Primul Plug-in Hubot

Bine, destul, deja. Știu că sunteți gata să vă scrieți propriul plugin, așa că vă permite să faceți unul rapid propriu. Creați un fișier nou în cadrul script-uri / SCR director al instalării dvs. Hubot. Numeste deepthoughts.coffee, deschideți-l în editorul ales și apoi introduceți următoarele linii:

# Configurează pluginul module.exports = (robot) -> # așteaptă ca șirul "hubot deep" să apară robot.respond / deep / i, (msg) -> # Configurează urlul unui server la distanță msg.http (' http://andymatthews.net/code/deepthoughts/get.cfm ') # și efectuează un apel http .get () (eroare, răspuns, corp) -> # trimite înapoi întregul mesaj de reps msg.send

Sunteți deja familiarizați cu primele două linii, astfel încât nu le vom examina. A treia linie începe setarea unei cereri HTTP; în acest caz, este un GET care nu trimite parametri către site-ul la distanță. A patra linie execută cererea HTTP și stabilește o funcție de retur care primește orice eroare, răspunsul brut și corpul paginii returnate. În acest caz, corpul paginii încărcate nu are niciun HTML ... este pur și simplu un șir. Acest lucru ne permite să îl returnez direct către utilizator prin intermediul msg.send. Salvați fișierul, reporniți Hubot cu a hubotul mor și a bin / hubot, și apoi obțineți-vă un gând adânc aleatoriu cu un hubot profund. Sperăm că este ceva profund, profund gândit provocator și nu unul despre vînzătorul de trambulină sau scumpul de aur.

Lucrarea de la Hubot

Acum că ați scris primul plugin, iată codul pentru altul. Vedeți dacă puteți afla ce face și cum să-l utilizați.

QS = cere "querystring" modul.exports = (robot) -> robot.respond / post (. +) / I, (msg) -> url = 'http://httpbin.org/post' data = QS.stringify ('hubot-post': msg.match [1]) msg.http (url) .post (date) (err, res, corp) -> msg.send
  • Observați că importul se întâmplă în partea de sus.
  • Care este metoda de răspuns pentru care ascultați?
  • Ce este msg.match?
  • Vedeți că pluginul poate face și cereri de postare?

Duceți-vă și faceți-o la fel

După cum puteți vedea din aceste câteva exemple, scrierea pluginurilor Hubot este o sarcină destul de simplă. Plugin-urile pot fi utile sau capricioase, dar sunt distractive pentru a scrie și chiar mai distractiv de utilizat. Ce fel de plugin vei crea pentru lume?

.

Cod