Hubot-Plugins mit CoffeeScript schreiben

Falls Sie sich unter einem Felsen versteckt haben, ist Campfire eine Echtzeit-Chat-Anwendung, die von unseren Freunden bei 37 Signals geschrieben wurde. Campfire verfügt über eine robuste API, die es Ihnen ermöglicht, Tools anzuschließen, um die Teamumgebung zu verbessern.

Lagerfeuer wird häufig von Unternehmen mit externen Mitarbeitern eingesetzt und ermöglicht eine schnelle Zusammenarbeit zwischen verteilten Teams. Denken Sie daran, dass remote in einigen Fällen, beispielsweise bei meinem Job bei Emma, ​​Inc., "im nächsten Raum" bedeuten kann. Bei Emma können wir den Status unserer Systeme überprüfen, Kundendaten schnell abrufen und viele andere nützliche Aufgaben, die unsere Arbeit erleichtern. Viele dieser Aufgaben werden durch die Implementierung von Hubot ermöglicht.


Was ist Hubot??

Plugins machen Spaß beim Schreiben und machen noch mehr Spaß.

Hubot ist ein skriptfähiges Framework, das von den Leuten bei Github erstellt wurde. Sie beschreiben es als "anpassbaren, von Kegerator angetriebenen Roboter zur Lebenseinstellung". Hubot ist Open Source, in CoffeeScript auf Node.js geschrieben und auf Plattformen wie Heroku leicht zu implementieren. Während Hubot in vielen verschiedenen Umgebungen ausgeführt werden kann, konzentriere ich mich darauf, Hubot innerhalb eines Campfire-Chatrooms auszuführen.

Neben der Freigabe der Quelle für Hubot erstellte Github eine kleine Anzahl vorgefertigter Skripts, die mit der Hubot-Quelle geliefert werden. Mithilfe dieser Skripts kann Hubot beispielsweise Bilder problemlos importieren / img süße Kätzchen:

Oder Sie können Videos importieren / youtube breakdancing:

Github hat auch ein Hubot-Plugin-Repository erstellt, in dem Benutzer neue Plugins übermitteln können. Zum jetzigen Zeitpunkt gibt es 294 Plugins im öffentlichen Repository, die alle möglichen Funktionen abdecken. Dazu gehören das Überprüfen des Status eines AWS-Services, die Interaktion mit einem Travis-CI-Server oder die base64-Codierung. zum Humor: Abspielen eines Rimshot-Audioclips; zum absurden: Fügen Sie einem Foto einen Schnurrbart hinzu. Sie können sogar das Nickname-Generator-Plugin überprüfen, das ich geschrieben habe!

Der Himmel ist das Limit bei Hubot. Wenn innerhalb von Node.js etwas getan werden kann, kann dies mit Hubot automatisiert werden. Mit ein wenig CoffeeScript-Wissen können Sie das nächste große Hubot-Plugin schreiben. Apropos, lassen Sie uns einen kurzen Auffrischungskurs in CoffeeScript machen, bevor wir unser erstes Hubot-Plugin schreiben. Wenn Sie bereits mit CoffeeScript vertraut sind, können Sie mit dem nächsten Abschnitt fortfahren.


Was ist CoffeeScript??

CofeeeScript beschreibt sich selbst als eine "kleine Sprache, die sich in JavaScript kompiliert" und "ein Versuch, die guten Teile von JavaScript auf einfache Weise darzustellen". CoffeeScripts Ziel ist es, die Langeweile der Boilerplate (all diese lästigen geschweiften Klammern, Semikolons und Klammern) aus dem Leben der Entwickler zu entfernen und JavaScript bis auf das Wesentliche zu destillieren. Infolgedessen lässt sich Ihr Code leichter lesen und es muss weniger davon gestartet werden. Schauen wir uns einige einfache Beispiele an und vergleichen Sie das resultierende JavaScript, das Sie CoffeeScript kompilieren.

Oh warte, habe ich gesagt "kompilieren"?

Ich habe es wirklich getan und wie machst du das? Ich bin froh, dass Sie gefragt haben… Es gibt eine Reihe von Tools, die diesen Service anbieten. Mein persönlicher Favorit ist CodeKit, aber Sie sollten auf jeden Fall das Kommandozeilengesteuerte Yeoman überprüfen. Sie können CoffeeScript auch direkt kompilieren, wenn Sie Node.js installiert haben, und Sie können sogar ein Echtzeit-Konvertierungswerkzeug wie JS2Coffee verwenden, mit dem Sie zwischen CoffeeScript und JavaScript hin und her wechseln können.

Zeichenketten

Wie sieht also CoffeeScript aus? Beginnen wir mit einer JavaScript-Zeile:

var author = 'Ernest Cline';

Das CofeeScript-Äquivalent lautet:

author = 'Ernest Cline'

Objekte

Dies ist ein einfaches Beispiel, aber es beginnt zu zeigen, was CoffeeScript für Sie tut… die Verbosität zu entfernen. Beachten Sie die Abwesenheit der var Stichwort und das Semikolon. Sie werden diese niemals benötigen, wenn Sie in CoffeScript schreiben. Wie wäre es mit einer Objektreferenz in JavaScript??

book = title: 'Ready Player One', Datum: '10 / 16/2011 ', Referenzen: Spiele: [' Street Fighter ',' Pac-Man '], Musik: [' Oingo Boingo ',' Men Without Hats '], Filme: [' Zurück in die Zukunft ',' The Last Starfighter ']

Hier ist die CoffeeScript-Version:

Buch = Titel: "Ready Player One" Datum: "16.10.2011" Verweise: Spiele: ["Street Fighter", "Pac-Man"] Musik: ["Oingo Boingo", "Männer ohne Hut"] Filme: ["Zurück in die Zukunft", "The Last Starfighter"]

Was bei CoffeeScript zu beachten ist, ist, dass Ihr Code immer noch vorhanden ist, aber die zusätzlichen Flusse einiger Trennzeichen, Terminatoren und Schlüsselwörter sind weg. CoffeeScript geht einen zusätzlichen Schritt (oder drei) und übernimmt diese Zeichen für Sie.

Funktionen

Was ist mit Funktionen, die Sie fragen könnten? Sie sind ähnlich ordentlich und aufgeräumt, entfernen Klammern und das Schlüsselwort return. Wie zuvor, hier ist das JavaScript:

function openGate (Taste) var gates = 'Kupfer': 'Sie haben das Kupfertor geöffnet', 'Jade': 'Sie haben das Jadetor geöffnet', 'Kristall': 'Sie haben das Kristalltor geöffnet'; Rücktore [Schlüssel] || 'Ihr Schlüssel ist ungültig' openGate ('Jade')

Und hier ist dasselbe in CoffeeScript:

openGate = (Schlüssel) -> Tore = Kupfer: "Sie haben das Kupfertor geöffnet" Jade: "Sie haben das Jadetor geöffnet" Kristall: "Sie haben das Kristalltor geöffnet" Gatter [Schlüssel] | "Ihr Schlüssel ist ungültig" openGate "Jade"

CoffeeScript bietet eine Reihe weiterer äußerst nützlicher Funktionen, die es zu einer überzeugenden Wahl machen. Funktionen wie Verständnis (im Wesentlichen einzeilige Schleifen), "echte" Klassen, praktischer String-Austausch, verkettete Vergleiche und mehr. Weitere Informationen zu CoffeeScript finden Sie auf der Website von CoffeeScript.org.


Die Bühne vorbereiten

Wir müssen ein paar Elemente installieren, bevor wir mit dem Plugin arbeiten können. Wir brauchen Node.js, NPM und Hubot - zusammen mit ihren verschiedenen Abhängigkeiten.

Installation

Der Himmel ist das Limit bei Hubot.

Lassen Sie uns zuerst Node.js. installieren. Öffnen Sie ein Terminalfenster und geben Sie ein welcher Knoten. Wenn Sie einen Dateisystempfad zurückerhalten, können Sie diesen Abschnitt überspringen. Wenn du siehst Knoten nicht gefunden oder etwas ähnliches, dann müssen Sie es installieren. Gehen Sie zur Node.js-Website und laden Sie die entsprechende Binärdatei für Ihr Betriebssystem herunter (und installieren Sie sie). Wenn Sie Node nicht kürzlich installiert haben, ist es wahrscheinlich eine gute Idee, die neueste Version zu installieren. Neuere Versionen von Node werden mit NPM (oder Node Package Manager) ausgeliefert, mit denen wir unsere Software installieren.

Als nächstes müssen wir Hubot installieren. Art npm install hubot -g in Ihr Terminalfenster und lassen Sie NPM seine Arbeit erledigen. Ich bevorzuge es, solche Plugins global zu installieren, also das Flag -g.

Hubot lokal verwenden

Nachdem die Installation abgeschlossen ist, werden wir CD in das hubot-Installationsverzeichnis und führen Sie es zum ersten Mal aus. Dieses Verzeichnis kann abhängig von Ihrem jeweiligen Computer unterschiedlich sein, liegt jedoch um / usr / local / lib / knotenmodule / hubot auf meinem Rechner Starten Sie Hubot mit dem folgenden Befehl . bin / hubot. Dann testen Sie es mit dem Befehl Hubot Ping. Hubot sollte sofort mit antworten PONG. Werfen wir einen Blick auf dieses Plugin, bevor wir unser eigenes schreiben. Seine drei Codezeilen sind der Kern von fast jedem anderen Hubot-Plugin. Hier ist es in all seiner Herrlichkeit:

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

Wenn Hubot zum ersten Mal gestartet wird, wird es durch jedes Plugin im Skriptverzeichnis durchlaufen. Jedes Plugin wird mit dem Common geschrieben modul.exporte Knotenmuster, mit dem sich das Plugin für Hubot identifizieren kann und Hubot auch Zugriff auf das Innenleben des Plugins hat. In einem Plugin befinden sich auch ein oder mehrere antworten Funktionsaufrufe. Jeder dieser Aufrufe korreliert mit einem Ereignis-Listener, der auf ein bestimmtes Schlüsselwort oder Muster wartet. Zuletzt sendet dieses Plugin einen Wert mit msg.send, Rückgabe einer beliebigen Nachricht, die Sie bevorzugen.

Wenn Sie neugierig sind (wie ich), um genau zu sehen, was der Roboter oder die Argumente von msg enthalten, fügen Sie einfach ein console.log Anweisung irgendwo im Code. Zum Beispiel hinzufügen console.log (Roboter) unmittelbar nach dem modul.exporte Anweisungen zeigt die folgenden Informationen an:

Name: 'Hubot', Befehle: [], Version: '2.3.4', Server:  Dokumentation: , Hörer: [Roboter: [Rundschreiben], Regex: / ^ Hubot [:,]? \ s * (?: PING $) / i, Rückruf: [Funktion], Matcher: [Funktion]], [mehr Zeug]

Jetzt können Sie mit der Arbeit an unserem ersten Hubot-Plugin beginnen.


Dein erstes Hubot-Plugin

Okay, schon genug. Ich weiß, dass Sie bereit sind, Ihr eigenes Plugin zu schreiben, also lassen Sie uns eines schnell machen. Erstellen Sie eine neue Datei in der scr / scripts Verzeichnis Ihrer Hubot-Installation. Nennen Sie es tiefe Gedanken.Kaffee, Öffnen Sie es in Ihrem Editor und geben Sie die folgenden Zeilen ein:

# Konfiguriert das Plugin module.exports = (robot) -> # wartet auf die Zeichenfolge "hubot deep". Robot.respond / deep / i, (msg) -> # Konfiguriert die URL eines Remote-Servers msg.http (' http://andymatthews.net/code/deepthoughts/get.cfm ') # und ruft einen http-Aufruf auf .get () (Fehler, Antwort, Body) -> # gibt die vollständige Antwort zurück msg.send body

Sie sind bereits mit den ersten beiden Zeilen vertraut, sodass wir sie nicht überprüfen. Die dritte Zeile beginnt mit dem Aufbau einer HTTP-Anfrage. In diesem Fall ist es ein GET, der keine Parameter an den Remote-Standort sendet. Die vierte Zeile führt die HTTP-Anforderung aus und richtet eine Rückruffunktion ein, die etwaige Fehler, die unvollständige Antwort und den Hauptteil der zurückgegebenen Seite empfängt. In diesem Fall enthält der Inhalt der geladenen Seite keinen HTML-Code. Es handelt sich lediglich um eine Zeichenfolge. Dies ermöglicht uns die direkte Rückgabe an den Benutzer über msg.send. Speichern Sie diese Datei und starten Sie Hubot mit einem neu Hubot sterben und ein bin / hubot, und dann einen zufälligen tiefen Gedanken mit einem hubot tief. Hoffentlich ist es etwas tiefgreifendes, tief zum Nachdenken anregend und nicht das vom Trampolinverkäufer oder vom goldenen Stinktier.

Ihre Hubot-Hausaufgaben

Nun, da Sie Ihr erstes Plugin geschrieben haben, finden Sie hier den Code für ein anderes. Sehen Sie, ob Sie herausfinden können, was es macht und wie man es benutzt.

QS = "Querystring" erforderlich. 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
  • Beachten Sie den Import oben.
  • Was ist die Antwortmethode, auf die Sie warten??
  • Was ist msg.match?
  • Beachten Sie, dass das Plugin auch Post-Requests ausführen kann?

Geh weiter und mache es genauso

Wie Sie anhand dieser wenigen Beispiele sehen können, ist das Schreiben von Hubot-Plugins eine ziemlich einfache Aufgabe. Plugins können nützlich oder wunderlich sein, aber sie schreiben Spaß und machen noch mehr Spaß. Welche Art von Plugin werden Sie für die Welt erstellen??

.