Skriva Hubot-plugins med CoffeeScript

Om du har gömt sig under en rock, är Campfire ett realtidschattprogram, skrivet av våra vänner på 37 Signaler. Campfire har ett robust API, vilket ger dig möjlighet att bult på verktyg för att förbättra lagmiljön.

Campfire används ofta av företag med fjärrarbetare och möjliggör ett snabbt samarbete mellan distribuerade lag. Tänk på att i vissa fall, till exempel på jobbet hos Emma, ​​Inc., kan fjärrkontroll betyda "i nästa rum". På Emma kan vi kontrollera statusen för våra system, snabbt hämta kunddata och många andra användbara uppgifter som gör vårt arbete enklare. Många av dessa uppgifter är möjliga med genomförandet av Hubot.


Vad är Hubot?

Plugins är roliga att skriva och ännu roligare att använda.

Hubot är en skriptbar ram skapad av folket på Github; de beskriver den som "en anpassningsbar, kegerator-driven livsförbättringsrobot". Hubot är öppen källkod, skrivd i CoffeeScript på Node.js, och kan enkelt distribueras på plattformar som Heroku. Medan Hubot kan köras inom många olika miljöer, fokuserar jag på att köra Hubot inom ramen för ett kampfire-chattrum.

Förutom att släppa källan till Hubot skapade Github ett litet antal förbyggda skript som skickas med Hubot-källan. Dessa skript tillåter Hubot att göra saker som att enkelt importera bilder / img söta kattungar:

Eller du kan importera videor / youtube breakdancing:

Github skapade också en Hubot-pluginförteckning där användarna kan skicka in nya plugins. Med det här skrivandet finns 294 plugins i det offentliga förvaret, som täcker alla typer av funktionalitet som sträcker sig från det användbara: kontrollerar status för en AWS-tjänst, interagerar med en Travis-CI-server eller base64-kodning; till den humoristiska: spela ett rimshot ljudklipp; Till det absurda: Lägg till en mustasch på ett fotografi. Du kan även kolla in smsnamn generator plugin som jag skrev!

Himlen är gränsen med Hubot. Om något kan göras inom Node.js, kan det automatiseras med hjälp av Hubot. Med bara en liten bit av CoffeeScript-kunskap kan du skriva nästa stora Hubot-plugin. Tala om, låt oss ta en snabb uppfriskningskurs i CoffeeScript innan vi skriver vårt första Hubot-plugin. Om du redan är bekant med CoffeeScript kan du gärna hoppa vidare till nästa avsnitt.


Vad är CoffeeScript?

CofeeeScript beskriver sig som ett "litet språk som kompilerar till JavaScript" och "ett försök att exponera de bra delarna av JavaScript på ett enkelt sätt". CoffeeScripts mål är att avlägsna kedjans tedium (alla de irriterande häftiga häftklammerna, semikolonerna och parenteserna) från utvecklarnas liv och destillera JavaScript till dess kala. Som ett resultat blir din kod lättare att läsa, och det är mindre att starta. Låt oss ta en titt på några enkla exempel och jämföra den resulterande JavaScript som du komponerar CoffeeScript.

Åh vänta, sa jag "kompilera"?

Det gjorde jag säkert, och hur gör du det? Jag är glad att du frågade ... det finns ett antal verktyg som erbjuder denna tjänst. Min personliga favorit är CodeKit, men var noga med att kolla in kommandoraden Drivs Yeoman. Du kan också kompilera CoffeeScript direkt om du har installerat Node.js, och du kan även använda ett realtidsomvandlingsverktyg som JS2Coffee, vilket låter dig konvertera fram och tillbaka mellan CoffeeScript och JavaScript.

strängar

Så, hur ser CoffeeScript ut? Låt oss börja med en rad JavaScript:

varförfattare = 'Ernest Cline';

CofeeScript motsvarigheten är:

författare = "Ernest Cline"

Objekt

Det är ett enkelt exempel, men det börjar visa vad CoffeeScript gör för dig ... att ta bort verbositet. Observera abscence av var nyckelord och semikolon. Du behöver aldrig dem när du skriver i CoffeScript. Vad sägs om en objektreferens i JavaScript?

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

Här är CoffeeScript-versionen:

bok: titel: "Ready Player One" datum: "10/16/2011" referenser: spel: ["Street Fighter", "Pac-Man"] musik: ["Oingo Boingo", "Men Without Hats"] filmer: ["Back To The Future", "The Last Starfighter"]

En viktig sak att komma ihåg om CoffeeScript är att din kod fortfarande finns där, men den extra fluffen på vissa avgränsare, terminatorer och nyckelord är borta. CoffeeScript går ett extra steg (eller tre) och antar de karaktärerna för dig.

funktioner

Vad sägs om funktioner du kanske frågar? De är likaledes snygga och städa, tar bort hängslen och returordet. Som tidigare, här är JavaScript:

funktion openGate (key) var grind = 'Koppar': 'Du öppnade kopparporten', 'Jade': 'Du öppnade Jade Gate', 'Crystal': 'Du öppnade Crystal Gate'; returportar [nyckel] || 'Din nyckel är ogiltig' openGate ('Jade')

Och här är det samma i CoffeeScript:

opengate = (nyckel) -> grindar = koppar: "Du öppnade kopparporten" Jade: "Du öppnade Jade Gate" Crystal: "Du öppnade Crystal Gate" -portarna [nyckel] | "Din nyckel är ogiltig" openGate "Jade"

CoffeeScript har ett antal andra extremt användbara funktioner som gör det till ett övertygande val. Funktioner som förståelser (i grunden enstaka loopar), "sanna" klasser, praktisk strängbyte, kedjiga jämförelser och mer. Du kan läsa mer om CoffeeScript på sin webbplats på CoffeeScript.org.


Fixar scenen

Vi måste installera några saker innan vi kan börja arbeta med vårt plugin. Vi behöver Node.js, NPM och Hubot - tillsammans med deras olika beroenden.

Installation

Himlen är gränsen med Hubot.

Låt oss först installera Node.js. Öppna ett terminalfönster och typ vilken nod. Om du får tillbaka en filsystemväg kan du hoppa över det här avsnittet. Om du ser nod inte hittad eller något liknande, måste du installera det. Gå vidare till Node.js hemsida och ladda ner (och installera) lämplig binär för ditt operativsystem. Om du inte nyligen installerat Node är det nog en bra idé att fortsätta och installera den senaste versionen. Nyare versioner av Node Ship med NPM (eller Node Package Manager) som vi ska använda för att installera vår programvara.

Nästa upp måste vi installera Hubot. Typ npm installera hubot -g in i ditt terminalfönster och låta NPM göra sitt arbete. Jag föredrar att installera plugins så här globalt, så -g-flaggan.

Använda Hubot lokalt

När installationen är klar kommer vi att CD till hubot-installationskatalogen och kör den för första gången. Den katalogen kan skilja sig beroende på din parikulära maskin, men den är på / Usr / local / lib / node_modules / hubot på min maskin. Släng upp hubot med följande kommando . bin / hubot. Testa sedan det med kommandot hubot ping. Hubot ska genast reagera med PONG. Låt oss ta en snabb titt på det plugin innan du skriver vårt eget. Dess tre kodkod är tarmarna i nästan alla andra Hubot-plugin. Här är det i all sin härlighet:

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

När Hubot först startar, går det igenom alla plugin i skriptkatalogen. Varje plugin är skrivet med det vanliga module.exports Nodmönster, vilket gör det möjligt för plugin att identifiera sig för Hubot, och det gör det också möjligt för Hubot att få tillgång till plugins inre funktioner. Också i en plugin finns en eller flera svara funktionssamtal. Vart och ett av dessa samtal hör ihop med en händelse-lyssnare som väntar på att höra ett specifikt sökord eller mönster. Slutligen sänder detta plugin tillbaka ett värde med msg.send, återvänder någon godtycklig msg du föredrar.

Förresten, om du är nyfiken (som jag var) för att bara se vad roboten, eller msg, innehåller argument, lägg helt enkelt till en console.log uttalande var som helst i koden. Till exempel lägger till console.log (robot) strax efter module.exports uttalanden visar följande information:

name: 'Hubot', kommandon: [], version: '2.3.4', server:  dokumentation: , lyssnare: [robot: [Circular], regex: / ^ Hubot [:,]? s * (?: PING $) / jag, återuppringning: [Funktion], matchare: [Funktion]], [fler saker]

Nu är du redo att börja arbeta med vårt första Hubot-plugin.


Din första Hubot-plugin

Okej, tillräckligt redan. Jag vet att du är redo att skriva din egen plugin, så vi kan göra en snabb en av våra egna. Skapa en ny fil inom SCR / skript katalog över din Hubot-installation. Namnge det deepthoughts.coffee, öppna den i valfri redigerare och skriv sedan in följande rader:

# Configures plugin module.exports = (robot) -> # väntar på strängen "hubot deep" för att förekomma robot.respond / deep / i, (msg) -> # Konfigurerar webbadressen för en fjärrserver msg.http (' http://andymatthews.net/code/deepthoughts/get.cfm ') # och gör ett http-telefonsamtal .get () (fel, svar, kropp) -> # skickar tillbaka hela meddelandet msg.send body

Du är redan bekant med de två första raderna så vi kommer inte att granska dem. Den tredje raden börjar inrätta en HTTP-begäran; i det här fallet är det en GET som inte skickar några parametrar till fjärrsidan. Den fjärde raden kör HTTP-förfrågan och ställer in en återuppringningsfunktion som tar emot eventuella fel, det rada svaret och kroppen på den returnerade sidan. I det här fallet har den laddade sidans kropp inte ens någon HTML ... det är helt enkelt en sträng. Detta gör det möjligt för oss att returnera det direkt till användaren genom msg.send. Spara den filen, starta om Hubot med a hubot dö och a bin / hubot, och sedan få dig en slumpmässig djup tanke med a hubot djupt. Förhoppningsvis är det något djupt, djupt tankeväckande och inte det om trampolinförsäljaren eller den gyllene skunken.

Din Hubot läxa

Nu när du har skrivit din första plugin, här är koden för en annan. Se om du kan ta reda på vad det gör och hur du använder det.

QS = kräver "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) (fel, res, kropp) -> msg.send kropp
  • Lägg märke till att importen sker överst.
  • Vad lyder svarmetoden på?
  • Vad är msg.match?
  • Se till att plugin kan också göra efterfrågningar?

Gå framåt och gör på samma sätt

Som du kan se från dessa få exempel är att skriva Hubot-plugins en ganska enkel uppgift. Plugins kan vara användbara eller nyckfulla, men de är roliga att skriva och ännu roligare att använda. Vilken typ av plugin kommer du att skapa för världen?

.