Écrire des plugins Hubot avec CoffeeScript

Au cas où vous vous cacheriez sous un rocher, Campfire est une application de discussion en temps réel, écrite par nos amis de 37 Signals. Campfire dispose d'une API robuste, vous permettant d'intégrer des outils pour améliorer l'environnement d'équipe.

Campfire est largement utilisé par les entreprises de télétravailleurs et permet une collaboration rapide entre des équipes distribuées. Gardez à l'esprit que, dans certains cas, comme dans mon travail chez Emma, ​​Inc., distant peut signifier "dans la pièce à côté". Chez Emma, ​​nous pouvons vérifier l’état de nos systèmes, récupérer rapidement les données client et de nombreuses autres tâches utiles facilitant notre travail. Beaucoup de ces tâches sont possibles avec la mise en œuvre de Hubot.


Qu'est-ce que Hubot??

Les plugins sont amusants à écrire et encore plus amusants à utiliser.

Hubot est un framework scriptable créé par les gens de Github; ils le décrivent comme "un robot personnalisable à vie, doté d'un moteur à base de kegerator". Hubot est open source, écrit en CoffeeScript sur Node.js et facilement déployé sur des plates-formes telles que Heroku. Bien que Hubot puisse fonctionner dans de nombreux environnements différents, je me concentrerai sur son fonctionnement dans les limites d'un forum de discussion Campfire..

En plus de libérer le code source pour Hubot, Github a créé un petit nombre de scripts prédéfinis fournis avec le code source Hubot. Ces scripts permettent à Hubot de faire des choses comme importer facilement des images / img chatons mignons:

Ou vous pouvez importer des vidéos / youtube breakdance:

Github a également créé un référentiel de plugins Hubot où les utilisateurs peuvent soumettre de nouveaux plugins. Au moment de la rédaction de cet article, le référentiel public contient 294 plug-ins, couvrant toutes sortes de fonctionnalités allant de l'utile: vérifier le statut d'un service AWS, interagir avec un serveur Travis-CI ou le codage base64; pour l'humour: jouer un clip audio rimshot; à l'absurde: ajoutez une moustache à une photo. Vous pouvez même consulter le plugin générateur de pseudonymes que j'ai écrit!

Le ciel est la limite avec Hubot. Si quelque chose peut être fait depuis Node.js, il peut être automatisé en utilisant Hubot. Avec juste un peu de connaissance de CoffeeScript, vous pouvez écrire le prochain excellent plugin Hubot. En parlant de, prenons un rapide cours de recyclage en CoffeeScript avant de créer notre premier plugin Hubot. Si vous connaissez déjà CoffeeScript, n'hésitez pas à passer à la section suivante..


Qu'est-ce que CoffeeScript??

CofeeeScript se décrit comme un "petit langage qui compile en JavaScript" et "une tentative pour exposer les bonnes parties de JavaScript de manière simple". L'objectif de CoffeeScript est de supprimer de la vie des développeurs l'ennui de boilerplate (toutes ces accolades, points-virgules et parenthèses) et de distiller le code JavaScript jusqu'à son essence. En conséquence, votre code devient plus facile à lire et il en faut moins pour démarrer. Jetons un coup d'oeil à quelques exemples simples et comparons le code JavaScript résultant, que vous compilez CoffeeScript.

Oh, attends, est-ce que j'ai dit "compiler"?

Je suis sûr, et comment faites-vous cela? Je suis content que vous ayez posé la question… Plusieurs outils offrent ce service. Mon préféré est CodeKit, mais assurez-vous de consulter le moteur de ligne de commande Yeoman. Vous pouvez également compiler directement CoffeeScript si vous avez installé Node.js. Vous pouvez même utiliser un outil de conversion en temps réel tel que JS2Coffee, qui vous permet d'effectuer des conversions entre CoffeeScript et JavaScript..

Les cordes

Alors, à quoi ressemble CoffeeScript? Commençons par une ligne de JavaScript:

var auteur = 'Ernest Cline';

L'équivalent CofeeScript est:

auteur = 'Ernest Cline'

Objets

C'est un exemple simple, mais il commence à montrer ce que CoffeeScript fait pour vous… en supprimant la verbosité. Notez l'absence du var mot-clé et le point-virgule. Vous n'en aurez jamais besoin lorsque vous écrivez dans CoffeScript. Que diriez-vous d'une référence d'objet en JavaScript?

book = titre: 'Ready Player One', date: '10 / 16/2011 ', références: jeux: [' Street Fighter ',' Pac-Man '], musique: [' Oingo Boingo ',' Men Without Chapeaux '], films: [' Back To The Future ',' Le Dernier Starfighter ']

Voici la version de CoffeeScript:

book = title: "Ready Player One" date: "10/16/2011" références: jeux: ["Street Fighter", "Pac-Man"] musique: ["Oingo Boingo", "Men Without Hats"] films: ["Retour vers le futur", "Le dernier chasseur de étoiles"]

Un élément clé à retenir à propos de CoffeeScript est que votre code est toujours là, mais que la finesse de certains délimiteurs, terminateurs et mots-clés a disparu. CoffeeScript fait un pas de plus (ou trois) et assume ces caractères pour vous.

Les fonctions

Qu'en est-il des fonctions que vous pourriez demander? Ils sont également propres et ordonnés, supprimant les accolades et le mot-clé return. Comme avant, voici le JavaScript:

function openGate (clé) var gates = 'Copper': 'Vous avez ouvert la porte de cuivre', 'Jade': 'Vous avez ouvert la porte de Jade', 'Crystal': 'Vous avez ouvert la porte de cristal'; portes de retour [clé] || 'Votre clé n'est pas valide' openGate ('Jade')

Et voici la même chose dans CoffeeScript:

openGate = (key) -> gates = Copper: "Vous avez ouvert la porte du cuivre" Jade: "Vous avez ouvert la porte de Jade" Crystal: "Vous avez ouvert la porte de Crystal" gates [key] | "Votre clé n'est pas valide" openGate "Jade"

CoffeeScript dispose de nombreuses autres fonctionnalités extrêmement utiles qui en font un choix convaincant. Des fonctionnalités telles que la compréhension (essentiellement des boucles à une seule ligne), les "vraies" classes, le remplacement pratique des chaînes, les comparaisons chaînées, etc. Vous pouvez en savoir plus sur CoffeeScript sur son site Web à CoffeeScript.org.


La mise en scène

Nous devrons installer quelques éléments avant de pouvoir commencer à travailler sur notre plugin. Nous aurons besoin de Node.js, NPM et Hubot - avec leurs diverses dépendances.

Installation

Le ciel est la limite avec Hubot.

Commençons par installer Node.js. Ouvrez une fenêtre de terminal et tapez quel noeud. Si vous récupérez un chemin de système de fichiers, vous pouvez ignorer cette section. Si tu vois noeud non trouvé ou quelque chose de similaire, alors vous aurez besoin de l'installer. Rendez-vous sur le site Web Node.js et téléchargez (et installez) le binaire approprié pour votre système d'exploitation. Sauf si vous avez récemment installé Node, c'est probablement une bonne idée de continuer et d'installer la version la plus récente. Les versions les plus récentes de Node sont fournies avec NPM (ou Node Package Manager) que nous utiliserons pour installer notre logiciel..

Ensuite, nous devrons installer Hubot. Type npm installer hubot -g dans votre fenêtre de terminal et laissez NPM faire son travail. Je préfère installer des plugins comme celui-ci globalement, donc le drapeau -g.

Utiliser Hubot localement

Une fois l'installation terminée, nous allons CD dans le répertoire d’installation de hubot et exécutez-le pour la première fois. Ce répertoire peut différer en fonction de votre machine particulière, mais c’est au / usr / local / lib / node_modules / hubot sur ma machine. Lancez hubot avec la commande suivante . bin / hubot. Puis testez-le avec la commande hubot ping. Hubot devrait immédiatement répondre avec PONG. Jetons un coup d'œil à ce plugin avant d'écrire le nôtre. Ses trois lignes de code sont les entrailles de presque tous les autres plugins Hubot. Le voici dans toute sa splendeur:

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

Lorsque Hubot démarre pour la première fois, il parcourt tous les plug-ins du répertoire des scripts. Chaque plugin est écrit en utilisant le commun module.exports Le motif de nœud, qui permet au plug-in de s'identifier auprès de Hubot, permet également à Hubot d'accéder au fonctionnement interne du plug-in. On trouve également dans un plugin un ou plusieurs répondre appels de fonction. Chacun de ces appels est corrélé à un écouteur d'événement qui attend d'entendre un mot clé ou un modèle spécifique. Enfin, ce plugin renvoie une valeur en utilisant msg.send, renvoyer les messages arbitraires que vous préférez.

Au fait, si vous êtes curieux (comme moi) de voir ce que le robot, ou le msg, contient, ajoutez simplement un console.log déclaration n'importe où dans le code. Par exemple, ajouter console.log (robot) immédiatement après module.exports instructions affiche les informations suivantes:

name: 'Hubot', commandes: [], version: '2.3.4', serveur:  documentation: , auditeurs: [robot: [Circular], regex: / ^ Hubot [:,]? \ s * (?: PING $) / i, rappel: [Fonction], contrôleur: [Fonction]], [plus de contenu]

Vous êtes maintenant prêt à commencer à travailler sur notre premier plugin Hubot.


Votre premier plugin Hubot

Ok, déjà assez. Je sais que vous êtes prêt à écrire votre propre plugin, alors faisons rapidement un de nos propres. Créer un nouveau fichier dans le scr / scripts répertoire de votre installation Hubot. Nomme le café profond, ouvrez-le dans l'éditeur de votre choix, puis entrez les lignes suivantes:

# Configure le plugin module.exports = (robot) -> # attend que la chaîne "hubot deep" se produise robot.respond / deep / i, (msg) -> # Configure l'URL d'un serveur distant msg.http (' http://andymatthews.net/code/deep Thoughts/get.cfm ') # et effectue un appel http get .get () (erreur, réponse, corps) -> # renvoie la réponse complète du corps msg.send

Vous connaissez déjà les deux premières lignes, nous ne les réviserons donc pas. La troisième ligne commence la configuration d'une requête HTTP. Dans ce cas, il s'agit d'un GET qui n'envoie aucun paramètre au site distant. La quatrième ligne exécute la requête HTTP et configure une fonction de rappel qui reçoit les erreurs éventuelles, la réponse brute et le corps de la page renvoyée. Dans ce cas, le corps de la page chargée ne contient même pas de HTML… c'est simplement une chaîne. Cela nous permet de le renvoyer directement à l'utilisateur par le biais de msg.send. Enregistrez ce fichier, redémarrez Hubot avec un hubot die et un bin / hubot, puis obtenez-vous une pensée profonde au hasard avec un hubot deep. Si tout va bien, c'est quelque chose de profond, provoquant profondément la pensée et pas celui du vendeur de trampoline ou de la skunk dorée.

Vos devoirs Hubot

Maintenant que vous avez écrit votre premier plugin, voici le code d'un autre. Voyez si vous pouvez comprendre ce qu'il fait et comment l'utiliser.

QS = nécessite '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
  • Notez que l'importation se passe en haut.
  • Quelle est la méthode de réponse à l'écoute?
  • Quel est msg.match?
  • Voir que le plugin peut aussi faire des demandes de publication?

Aller de l'avant et faire de même

Comme vous pouvez le constater à partir de ces quelques exemples, écrire des plugins Hubot est une tâche assez simple. Les plugins peuvent être utiles ou fantasques, mais ils sont amusants à écrire et encore plus amusants à utiliser. Quelle sorte de plugin allez-vous créer pour le monde?

.