Skrive Hubot Plugins med CoffeeScript

Hvis du har skjult under en stein, er Campfire et sanntids chatprogram, skrevet av våre venner på 37 Signaler. Campfire har en robust API, noe som gir deg muligheten til å slå på verktøy for å bedre lagmiljøet.

Campfire er mye brukt av bedrifter med fjerntliggende arbeidstakere og gir rask samarbeid mellom distribuerte lag. Husk at i noen tilfeller, som for eksempel på jobben min på Emma, ​​Inc., kan fjernkontrollen bety "i neste rom." På Emma kan vi sjekke statusen til våre systemer, raskt hente kundedata, og mange andre nyttige oppgaver som gjør arbeidet vårt lettere. Mange av oppgavene er gjort mulig med implementeringen av Hubot.


Hva er Hubot?

Plugins er morsomme å skrive og enda morsommere å bruke.

Hubot er et scriptable rammeverk laget av folkene på Github; de beskriver det som "en tilpassbar, kegerator-drevet livstjeneste robot". Hubot er åpen kildekode, skrevet i CoffeeScript på Node.js, og kan enkelt distribueres på plattformer som Heroku. Mens Hubot kan kjøre i mange forskjellige miljøer, vil jeg fokusere på å kjøre Hubot innenfor rammen av et Campfire-chatrom.

I tillegg til å frigjøre kilden til Hubot, skapte Github et lite antall forhåndsbygde skript som sender med Hubot-kilden. Disse skriptene tillater Hubot å gjøre ting som å importere bilder enkelt / img søte kattunger:

Eller du kan importere videoer / youtube breakdancing:

Github opprettet også et Hubot-plugin-lager hvor brukere kan sende inn nye plugins. På grunn av dette skrives det 294 plugins i det offentlige arkivet, som dekker alle slags funksjonalitet som spenner fra det nyttige: Kontroller statusen til en AWS-tjeneste, interaksjon med en Travis-CI-server eller base64-koding; til den humoristiske: spille et rimshot lydklipp; til det absurde: Legg et mustache på et fotografi. Du kan til og med sjekke kallenavnet generator plugin som jeg skrev!

Himmelen er grensen med Hubot. Hvis noe kan gjøres fra Node.js, kan det automatiseres ved hjelp av Hubot. Med bare en liten bit av CoffeeScript-kunnskap kan du skrive neste store Hubot-plugin. Når vi snakker om, la oss ta en rask oppfriskningskurs i CoffeeScript før vi skriver vår første Hubot-plugin. Hvis du allerede er kjent med CoffeeScript, er du velkommen til å hoppe videre til neste avsnitt.


Hva er CoffeeScript?

CofeeeScript beskriver seg som et "lite språk som kompilerer til JavaScript" og "et forsøk på å avsløre de gode delene av JavaScript på en enkel måte". CoffeeScript har som målsetting å fjerne bølgebrytelsen (alle de pesky krøllete bøylene, semikolonene og parentesene) fra utviklerens liv og destillere JavaScript ned til dens bare essens. Som et resultat blir koden enklere å lese, og det er mindre av det å starte opp. La oss ta en titt på noen få enkle eksempler og sammenligne den resulterende JavaScript-kompilatoren du komponerer CoffeeScript.

Å vent, sa jeg "kompilere"?

Det gjorde jeg sikkert, og hvordan gjør du det? Jeg er glad du spurte ... det finnes en rekke verktøy som tilbyr denne tjenesten. Min personlige favoritt er CodeKit, men sørg for å sjekke ut kommandolinjen drevet Yeoman. Du kan også kompilere CoffeeScript direkte hvis du har installert Node.js, og du kan til og med bruke et sanntids konverteringsverktøy som JS2Coffee, som lar deg konvertere frem og tilbake mellom CoffeeScript og JavaScript.

Strings

Så, hvordan ser CoffeeScript ut? La oss starte med en linje med JavaScript:

varforfatter = 'Ernest Cline';

CofeeScript-ekvivalenten er:

forfatter = 'Ernest Cline'

objekter

Det er et enkelt eksempel, men det begynner å vise hva CoffeeScript gjør for deg ... fjerne verbositet. Legg merke til abscensen av Var søkeord og semikolon. Du trenger aldri dem når du skriver i CoffeScript. Hva med en objektreferanse i JavaScript?

bok = title: 'Ready Player One', dato: '10 / 16/2011 ', referanser: spill: [' Street Fighter ',' Pac-Man '], musikk: [' Oingo Boingo ',' Men Without Hats '], filmer: [' Back To The Future ',' The Last Starfighter ']

Her er CoffeeScript-versjonen:

bok: title: "Ready Player One" dato: "10/16/2011" referanser: spill: ["Street Fighter", "Pac-Man"] musikk: ["Oingo Boingo", "Men Without Hats"] ["Tilbake til fremtiden", "The Last Starfighter"]

En viktig ting å huske om CoffeeScript er at koden din fortsatt er der, men den ekstra fluffen til noen avgrensere, terminatorer og søkeord er borte. CoffeeScript går et ekstra trinn (eller tre) og antar disse tegnene for deg.

funksjoner

Hva med funksjoner du kanskje spør? De er like ryddige og ryddige, fjerner seler og returordet. Som før, her er JavaScript:

funksjon openGate (nøkkel) var gates = 'Copper': 'Du åpnet kobberporten', 'Jade': 'Du åpnet Jade Gate', 'Crystal': 'Du åpnet Crystal Gate'; returportene [nøkkel] || 'Din nøkkel er ugyldig' openGate ('Jade')

Og her er det samme i CoffeeScript:

openGate = (key) -> porter = Kobber: "Du åpnet kobberporten" Jade: "Du åpnet Jade Gate" Crystal: "Du åpnet Crystal Gate" -portene [nøkkel] | "Din nøkkel er ugyldig" openGate "Jade"

CoffeeScript har en rekke andre ekstremt nyttige funksjoner som gjør det til et overbevisende valg. Funksjoner som forståelser (i utgangspunktet single line loops), "ekte" klasser, hendig streng erstatning, kjede sammenligninger og mer. Du kan lese mer om CoffeeScript på sin hjemmeside på CoffeeScript.org.


Stille inn scenen

Vi må installere noen få elementer før vi kan begynne å jobbe med pluginet vårt. Vi trenger Node.js, NPM og Hubot - sammen med deres ulike avhengigheter.

Installasjon

Himmelen er grensen med Hubot.

La oss først installere Node.js. Åpne et terminalvindu og skriv inn hvilken knutepunkt. Hvis du får tilbake en filsystembane, kan du hoppe over denne delen. Hvis du ser node ikke funnet eller noe lignende, så må du installere det. Gå over til Node.js nettsted og last ned (og installer) riktig binært for operativsystemet. Med mindre du nylig har installert Knutepunkt, er det sannsynligvis en god ide å gå videre og installere den nyeste versjonen. Nyere versjoner av Node skip med NPM (eller Node Package Manager) som vi skal bruke for å installere programvaren vår.

Deretter må vi installere Hubot. Type npm installere hubot -g inn i terminalvinduet ditt og la NPM gjøre sitt arbeid. Jeg foretrekker å installere plugins som dette globalt, og dermed -g-flagget.

Bruke Hubot lokalt

Etter at installasjonen er fullført, vil vi cd til hubot-installasjonsmappen og kjøre den for første gang. Denne katalogen kan variere avhengig av din parikulære maskin, men den er på / Usr / local / lib / node_modules / hubot på min maskin. Brann opp hubot med følgende kommando . bin / hubot. Prøv det med kommandoen hubot ping. Hubot skal umiddelbart svare med PONG. La oss ta en rask titt på det pluginet før du skriver vår egen. De tre kodelinjene er tarmene til nesten alle andre Hubot-plugin. Her er det i all sin herlighet:

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

Når Hubot starter opp, går den gjennom alle pluginene i skriptkatalogen. Hver plugin er skrevet med felles module.exports Nodemønster, som gjør at pluginet kan identifisere seg til Hubot, og det tillater også Hubot tilgang til pluginets indre arbeid. Også funnet i et plugin er en eller flere svar funksjonsanrop. Hver av disse samtalene er knyttet til en hendelselytter som venter på å høre et bestemt søkeord eller mønster. Til slutt sender denne plugin tilbake en verdi ved hjelp av msg.send, retur noen vilkårlig msg du foretrekker.

Forresten, hvis du er nysgjerrig (som jeg var) for å se akkurat hva roboten, eller msg, argumenter inneholder, bare legg til en console.log erklæring hvor som helst i koden. For eksempel legger du til console.log (robot) umiddelbart etter module.exports uttalelser viser følgende informasjon:

name: 'Hubot', kommandoer: [], versjon: '2.3.4', server:  dokumentasjon: , lyttere: [robot: [Circular], regex: / ^ Hubot [:,]? \ s * (?: PING $) / jeg, tilbakeringing: [Funksjon], matcher: [Funksjon]], [flere ting]

Nå er du klar til å begynne å jobbe med vårt første Hubot-plugin.


Din første Hubot-plugin

Ok, nok allerede. Jeg vet at du er klar til å skrive din egen plugin, så vi kan gjøre en rask en av våre egne. Opprett en ny fil i SCR / scripts katalog over din Hubot-installasjon. Navngi det deepthoughts.coffee, åpne den i valgfri redaktør, og skriv deretter inn følgende linjer:

# Konfigurerer plugin module.exports = (robot) -> # venter på strengen "hubot deep" for å forekomme robot.respond / deep / i, (msg) -> # Konfigurerer URLen til en ekstern server msg.http (' http://andymatthews.net/code/deepthoughts/get.cfm ') # og gjør en http-samtale .get () (feil, svar, kropp) -> # sender tilbake den komplette meldingen msg.send body

Du er allerede kjent med de to første linjene, så vi vil ikke se gjennom dem. Den tredje linjen begynner å sette opp en HTTP-forespørsel; i dette tilfellet er det en GET som ikke sender noen parametre til den eksterne siden. Den fjerde linjen utfører HTTP-forespørselen og setter opp en tilbakeringingsfunksjon som mottar eventuelle feil, det raske svaret og kroppen til den returnerte siden. I dette tilfellet har den lastede sidens kropp ikke engang noen HTML ... det er bare en streng. Dette tillater oss å returnere det direkte til brukeren ved hjelp av msg.send. Lagre den filen, start Hubot med en hubot dø og a bin / hubot, og så få deg en tilfeldig dyp tanke med en hubot dypt. Forhåpentligvis er det noe dypt, dypt tankevekkende og ikke det ene om trampolinsalgeren eller den gylne skunk.

Din Hubot Hjemmearbeide

Nå som du har skrevet din første plugin, her er koden for en annen. Se om du kan finne ut hva det gjør og hvordan du bruker det.

QS = krever '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) (feil, res, kropp) -> msg.send kropp
  • Legg merke til at importen skjer øverst.
  • Hva svarer svarmetoden på?
  • Hva er msg.match?
  • Se at pluginet også kan gjøre innleggsforespørsler?

Gå frem og gjør det samme

Som du kan se fra disse få eksemplene, er å skrive Hubot-plugins en ganske enkel oppgave. Plugins kan være nyttige eller lunefull, men de er morsomme å skrive og enda morsommere å bruke. Hva slags plugin vil du lage for verden?

.