Hubot-plugins schrijven met CoffeeScript

In het geval dat je je onder een steen hebt verstopt, is Campfire een realtime chattoepassing, geschreven door onze vrienden op 37 signalen. Campfire heeft een krachtige API, waarmee u tools kunt vastzetten om de teamomgeving te verbeteren.

Kampvuur wordt veel gebruikt door bedrijven met externe werknemers en zorgt voor een snelle samenwerking tussen verspreide teams. Houd er rekening mee dat, in sommige gevallen, zoals bij mijn werk bij Emma, ​​Inc., afstandsbediening kan betekenen 'in de volgende kamer'. Bij Emma kunnen we de status van onze systemen controleren, snel klantgegevens ophalen en vele andere nuttige taken die ons werk vergemakkelijken. Veel van deze taken worden mogelijk gemaakt door de implementatie van Hubot.


Wat is Hubot?

Plug-ins zijn leuk om te schrijven en nog leuker om te gebruiken.

Hubot is een scriptbaar raamwerk dat is gemaakt door de mensen van Github; ze beschrijven het als "een aanpasbare, kegerator-aangedreven life embetterment robot". Hubot is open source, geschreven in CoffeeScript op Node.js en eenvoudig geïmplementeerd op platforms zoals Heroku. Hoewel Hubot in veel verschillende omgevingen kan worden gebruikt, zal ik me concentreren op het uitvoeren van Hubot binnen de grenzen van een chatruimte op Campfire.

Naast het vrijgeven van de bron voor Hubot, heeft Github een klein aantal vooraf gebouwde scripts gemaakt die worden geleverd met de Hubot-bron. Met deze scripts kan Hubot dingen doen zoals eenvoudig afbeeldingen importeren / img schattige kittens:

Of je kunt video's importeren / youtube breakdancing:

Github heeft ook een Hubot-pluginrepository gemaakt waar gebruikers nieuwe plug-ins kunnen indienen. Op het moment van schrijven zijn er 294 plug-ins in de openbare repository, die alle soorten functionaliteit omvatten, variërend van het nuttige: controle van de status van een AWS-service, interactie met een Travis-CI-server of base64-codering; voor de humor: een rimshot-audioclip afspelen; tot het absurde: voeg een snor toe aan een foto. Je kunt zelfs de bijnaamgenerator-plug-in die ik heb geschreven bekijken!

De lucht is de limiet met Hubot. Als iets vanuit Node.js kan worden gedaan, kan het worden geautomatiseerd met behulp van Hubot. Met slechts een klein beetje kennis van CoffeeScript, kunt u de volgende geweldige Hubot-plug-in schrijven. Nu we het toch over hebben, laten we eerst een korte opfriscursus volgen in CoffeeScript voordat we onze eerste Hubot-plug-in schrijven. Als u al vertrouwd bent met CoffeeScript, dan kunt u gerust naar het volgende gedeelte gaan.


Wat is CoffeeScript?

CofeeeScript beschrijft zichzelf als een "kleine taal die compileert in JavaScript" en "een poging om de goede delen van JavaScript op een eenvoudige manier bloot te leggen". Het doel van CoffeeScript is om de verveling van boilerplate (al die vervelende accolades, puntkomma's en haakjes) uit het leven van ontwikkelaars te halen en JavaScript tot zijn essentie te destilleren. Het gevolg is dat uw code gemakkelijker te lezen is en dat er minder hoeft te worden opgestart. Laten we een paar eenvoudige voorbeelden bekijken en het resulterende JavaScript vergelijken dat u met CoffeeScript compileert.

Oh wacht, zei ik "compileer"?

Dat deed ik zeker, en hoe doe je dat? Ik ben blij dat je het vroeg ... er zijn een aantal tools die deze service aanbieden. Mijn persoonlijke favoriet is CodeKit, maar vergeet niet om de commandoregelgestuurde Yeoman te bekijken. Je kunt ook direct CoffeeScript compileren als je Node.js hebt geïnstalleerd, en je kunt zelfs een real-time conversietool gebruiken zoals JS2Coffee, waarmee je heen en weer kunt converteren tussen CoffeeScript en JavaScript.

strings

Hoe ziet CoffeeScript eruit? Laten we beginnen met een regel JavaScript:

var author = 'Ernest Cline';

Het CofeeScript-equivalent is:

author = 'Ernest Cline'

Voorwerpen

Dat is een eenvoudig voorbeeld, maar het begint te laten zien wat CoffeeScript voor u doet ... het verwijderen van breedsprakigheid. Let op de afwezigheid van de var zoekwoord en de puntkomma. U hebt deze nooit nodig wanneer u in CoffeScript schrijft. Wat dacht je van een objectreferentie in JavaScript?

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

Dit is de CoffeeScript-versie:

book = title: "Ready Player One" datum: "10/16/2011" referenties: spellen: ["Street Fighter", "Pac-Man"] muziek: ["Oingo Boingo", "Men Without Hats"] films: ["Terug naar de toekomst", "The Last Starfighter"]

Een belangrijk ding om te onthouden over CoffeeScript is dat uw code er nog steeds is, maar de extra pluisjes van sommige scheidingstekens, terminators en zoekwoorden zijn verdwenen. CoffeeScript gaat een extra stap (of drie) en neemt die karakters voor je aan.

functies

Hoe zit het met functies die u misschien vraagt? Ze zijn op dezelfde manier netjes en opgeruimd, en verwijderen accolades en het retourwoord. Zoals hiervoor, hier is de JavaScript:

function openGate (key) var gates = 'Copper': 'You opened the Copper Gate', 'Jade': 'You opened the Jade Gate', 'Crystal': 'You opened the Crystal Gate'; terugkeer poorten [sleutel] || 'Uw sleutel is ongeldig' openGate ('Jade')

En hier is hetzelfde in CoffeeScript:

openGate = (sleutel) -> poorten = Koper: "Je hebt de koperen poort geopend" Jade: "Je hebt de Jadenpoort geopend" Kristal: "Je hebt de poorten van de Kristallen Poort geopend [sleutel] | "Uw sleutel is ongeldig" openGate "Jade"

CoffeeScript heeft een aantal andere bijzonder handige functies die het een aantrekkelijke keuze maken. Functies zoals comprehensions (in feite single line loops), "true" classes, handige stringvervanging, geketende vergelijkingen en meer. Je kunt meer over CoffeeScript lezen op zijn website op CoffeeScript.org.


Het podium opzetten

We moeten een paar items installeren voordat we aan onze plug-in kunnen werken. We hebben Node.js, NPM en Hubot nodig, samen met hun verschillende afhankelijkheden.

Installatie

De lucht is de limiet met Hubot.

Laten we eerst Node.js. installeren Open een terminalvenster en typ welk knooppunt. Als u een bestandssysteempad terugkrijgt, kunt u dit gedeelte overslaan. Als je het ziet knoop niet gevonden of iets dergelijks, dan moet je het installeren. Ga naar de Node.js-website en download (en installeer) het juiste binaire bestand voor uw besturingssysteem. Tenzij u onlangs Knooppunt hebt geïnstalleerd, is het waarschijnlijk een goed idee om door te gaan en de meest recente versie te installeren. Nieuwere versies van Node worden geleverd met NPM (of Node Package Manager) die we zullen gebruiken om onze software te installeren.

Vervolgens moeten we Hubot installeren. Type npm install hubot -g in uw terminalvenster en laat NPM zijn werk doen. Ik geef er de voorkeur aan dergelijke plug-ins wereldwijd te installeren, dus de vlag -g.

Lokaal Hubot gebruiken

Nadat de installatie is voltooid, zullen we CD naar de hubot install-map en voer deze voor de eerste keer uit. Die map kan verschillen afhankelijk van uw paricular machine, maar het is op / Usr / local / lib / node_modules / hubot op mijn machine. Start de hubot met het volgende commando . bin / hubot. Test het vervolgens met het commando hubot ping. Hubot moet onmiddellijk reageren met PONG. Laten we even naar die plug-in kijken voordat we die zelf gaan schrijven. De drie coderegels zijn het lef van bijna elke andere Hubot-plugin. Hier is het in al zijn glorie:

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

Wanneer Hubot voor het eerst wordt opgestart, wordt deze door elke plug-in in de scriptdirectory geleid. Elke plugin is geschreven met behulp van de common module.exports Knooppatroon, waarmee de plug-in zichzelf kan identificeren met Hubot en waarmee Hubot ook toegang heeft tot de interne werking van de plug-in. Ook gevonden in een plug-in zijn een of meer reageren functie-oproepen. Elk van deze gesprekken correleert met een gebeurtenislistener die wacht op een specifiek zoekwoord of patroon. Ten slotte stuurt deze plug-in een waarde terug met behulp van msg.send, het retourneren van willekeurig gekozen berichten.

Trouwens, als je nieuwsgierig bent (zoals ik was) om precies te zien wat de robot, of msg, argumenten bevatten, voeg dan gewoon een console.log verklaring overal in de code. Bijvoorbeeld toevoegen console.log (robot) onmiddellijk na de module.exports statements toont de volgende informatie:

naam: 'Hubot', opdrachten: [], versie: '2.3.4', server:  documentatie: , luisteraars: [robot: [Circular], regex: / ^ Hubot [:,]? \ s * (?: PING $) / i, callback: [Function], matcher: [Function]], [meer dingen]

Nu bent u klaar om aan onze eerste Hubot-plug-in te gaan werken.


Uw eerste Hubot-plug-in

Oké, genoeg al. Ik weet dat je klaar bent om je eigen plug-in te schrijven, dus laten we snel een eigen plugin maken. Maak een nieuw bestand binnen de scr / scripts map van uw Hubot-installatie. Noem maar op deepthoughts.coffee, open het in je editor naar keuze en voer de volgende regels in:

# Configureert de plugin module.exports = (robot) -> # wacht op de string "hubot deep" om te voorkomen robot.respond / deep / i, (msg) -> # Configureert de url van een remote server msg.http (' http://andymatthews.net/code/deepthoughts/get.cfm ') # en maakt een http get call .get () (error, response, body) -> # verstuurt de complete reponse terug msg.send body

U bent al bekend met de eerste twee regels, dus we zullen ze niet beoordelen. De derde regel begint met het instellen van een HTTP-verzoek; in dit geval is het een GET die geen parameters naar de externe site verzendt. De vierde regel voert het HTTP-verzoek uit en stelt een callback-functie in die fouten, de onbewerkte reactie en de hoofdtekst van de geretourneerde pagina ontvangt. In dit geval heeft de body van de geladen pagina zelfs geen HTML ... het is gewoon een string. Dit stelt ons in staat om het rechtstreeks aan de gebruiker te retourneren via msg.send. Sla dat bestand op, herstart Hubot met een hubot sterven en een bin / hubot, en dan krijg je een willekeurige diepe gedachte met een hubot diep. Hopelijk is het iets diepzinnigs, diep nadenkend en niet het een over de trampolineverkoper of het gouden stinkdier.

Je huiswerk bij Hubot

Nu je je eerste plug-in hebt geschreven, hier is de code voor een andere. Kijk of je kunt achterhalen wat het doet en hoe je het moet gebruiken.

QS = vereisen '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
  • Let op de import gebeurt bovenaan.
  • Waarnaar luistert de antwoordmethode??
  • Wat is msg.match?
  • Zie dat de plug-in ook postverzoeken kan doen?

Ga vooruit en doe hetzelfde

Zoals je aan de hand van deze paar voorbeelden kunt zien, is het schrijven van Hubot-plug-ins een redelijk eenvoudige taak. Plug-ins kunnen handig of grillig zijn, maar ze zijn leuk om te schrijven en nog leuker om te gebruiken. Wat voor plug-in creëer je voor de wereld?

.