Hubot のインストール

これは [Hubot Advent Calendar 2014][hubot-adventar-2014] の 2 日目の記事です。

前回は [Hubot / ChatOps の概要][hubot-adventar-2014-1] について紹介しました。今回は [Hubot][github/hubot] をインストールしてみましょう。

また @bouzuya の Hubot 連載の第 2 回です。[目次は、第 1 回の記事にある][hubot-adventar-2014-bouzuya-index]ので、そちらをどうぞ。

# Hubot のインストール

Hubot のインストール方法は 2.9.x とそれ以前とで大きく変わっています。今回は 2.9.3 を対象としているので、新しいインストール方法を紹介していきます。

ちなみにこんな Qiita 記事を読むより、[公式のドキュメント ( というか README ) ][getting-started-with-hubot]を読むのが確実です。

# yo および generator-hubot のインストール

Hubot 2.9.x は Yeoman ジェネレーターでインストールするようになっています。

Hubot にも Yeoman にも **Node.js** が必要です。事前に Node.js がインストールされているものとします。Node.js をインストールすれば **npm** も使える状態になっていると思います。npm で Yeoman (**yo**) と Hubot のための Yeoman ジェネレーター (**generator-hubot**) をインストールします。

今回は yo が 1.3.3 、generator-hubot が 0.1.4 です。

```bash
# 権限が足りない場合は sudo を付けます。
$ npm install -g yo generator-hubot

$ npm list -g generator-hubot yo   
/usr/local/lib
├── generator-hubot@0.1.4 
└── yo@1.3.3 
```

これで yo, generator-hubot のインストールは完了です。

# あなたの BOT の生成

次は Yeoman ジェネレーターを使って あなたの BOT (Hubot) を生成します。

BOT 名のディレクトリをつくり、そこで `yo hubot` を実行します。あとは質問に答えていけば OK です。

ちなみに今回の例では、 BOT 名にはウラン (uran) を使っています。

```bash
$ mkdir uran
$ cd uran

$ yo hubot
```

![yo-hubot.png](https://qiita-image-store.s3.amazonaws.com/0/3486/427a9c64-4386-d35d-e187-2b4c495df8e8.png)

# shell アダプターで動かす

ひとまず shell アダプターで動かしてみましょう。 shell アダプターが何かは、またそのうち説明します。

```bash
$ ./bin/hubot -a shell -n uran 
```

いろいろな警告と一緒にプロンプト (`uran>`) が出たと思います。`uran help` と話しかけて、コマンド一覧を見てみましょう。

```
uran> uran help
uran> uran adapter - Reply with the adapter
uran animate me <query> - The same thing as `image me`, except adds a few parameters to try to return an animated GIF instead.
uran echo <text> - Reply back with <text>
uran help - Displays all of the help commands that uran knows about.
uran help <query> - Displays all help commands that match <query>.
uran image me <query> - The Original. Queries Google Images for <query> and returns a random top result.
uran map me <query> - Returns a map view of the area returned by `query`.
uran mustache me <query> - Searches Google Images for the specified query and mustaches it.
uran mustache me <url> - Adds a mustache to the specified URL.
uran ping - Reply with pong
uran pug bomb N - get N pugs
uran pug me - Receive a pug
uran the rules - Make sure uran still knows the rules.
uran time - Reply with current time
uran translate me <phrase> - Searches for a translation for the <phrase> and then prints that bad boy out.
uran translate me from <source> into <target> <phrase> - Translates <phrase> from <source> into <target>. Both <source> and <target> are optional
uran youtube me <query> - Searches YouTube for the query and returns the video embed link.
ship it - Display a motivation squirrel
uran>
```

初期でも色々はいっていますね。

ひとまず、Hubot は無事に動いたようです。

# Hubot にもっと話しかける

続けて、いろいろ Hubot に話しかけてみましょう。

## hubot ping

ping で応答確認できます。PONG を返してくれます。名前を間違えていると無視されます。

```
uran> uran ping
uran> PONG
```

## hubot echo

echo で任意のメッセージを返させることができます。

```
uran> uran: echo ワイがウランや！
uran> ワイがウランや！
```

## hubot time

time で現在時刻を返してくれます。

```
uran> @uran time
uran> Server time is: Tue Dec 02 2014 21:28:05 GMT+0900 (JST)
```

## Hubot に話しかけるパターン

Hubot に話しかけるのはいくつかのパターンが許容されています。

具体例を挙げると、先頭が名前からはじまる場合や、名前の前に `@` がついている場合、後ろに `:` がついている場合などです。

正規表現で言うと、だいたい `"^\\s*[@]?#{name}[:,]?\\s*"` こんな感じです。

# Hubot を Heroku にデプロイする

と言いたいところなのですが、もう分量が増えてきたので、今日はこのへんでおしまい。

`Procfile` もきちんと配置されているので、`git init`, `git add -A`, `git commit`, `heroku create` して `git push heroku master` とかやれば、動きそうなものなのですが (Heroku アカウント・ heroku コマンドインストール前提) 、 Heroku にデプロイするとなると shell アダプター以外の、実際のチャットに対応するためのアダプターやその設定が必要です。簡単なものとそうでないものとがあります。

ひとまず、人気の高そうな Slack あたりで、明日、説明したいと思います。

# 最後に

これは対象読者外へのメッセージなのですが、hubot の実行コマンドってアレどう思いますか？ `./node_modules/.bin/hubot` に配置されるアレです。

あの実行コマンドの `#!/usr/bin/env coffee` ってぼくは**ない**と思うんですけど、どうなんですかね？あれのせいで実行するために coffee-script を PATH に含めることが前提になりますし、そのために今回も `./bin/hubot` とかやってますよね (内部で PATH 設定してます) 。イケてないなあ、って思うんですけど……。

では、今日はこのへんで。

[getting-started-with-hubot]: https://github.com/github/hubot/tree/v2.9.3/docs#getting-started-with-hubot
[github/hubot]: https://github.com/github/hubot/
[hubot.github.com]: https://hubot.github.com/
[hubot-adventar-2014]: http://www.adventar.org/calendars/384
[hubot-adventar-2014-1]: http://qiita.com/bouzuya/items/c7d0ad80c357aab6b696
[ops-for-everyone]: https://speakerdeck.com/johndbritton/ops-for-everyone
[hubot-adventar-2014-bouzuya-index]: http://qiita.com/bouzuya/items/c7d0ad80c357aab6b696