Hubot スクリプトを追加インストールしよう & 自分だけの Hubot スクリプトをつくろう

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

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

前回は [Hubot を Heroku で動かして Slack から話す方法][hubot-adventar-2014-3] について紹介しました。ここまでで Hubot は元気よく動きますし、みんなで `hubot pug bomb` してログもめちゃくちゃ、最高ですね！

……でも、まだまだです。

もっとイカした Hubot にするために、今回は **Hubot スクリプトの追加**を紹介しましょう。

# 前提条件

その前に今回の前提条件を。

- 前回までにつくった Hubot
- GitHub アカウント

今回は GitHub 上にある Hubot スクリプトを fork し、書きかえますので、GitHub アカウントと基本的な操作ができることが前提です。

# Hubot スクリプトを追加してみよう (bouzuya/hubot-hello-world)

さて、まずは @bouzuya のつくった Hubot スクリプトをインストールしてみましょう。

まずは `npm` を使って、 `package.json` に `bouzuya/hubot-hello-world` への依存関係を追加し、`node_modules/hubot-hello-world` にダウンロードしてもらいましょう。妙に日本語で書くと長いですが、コマンドは短いです。

```bash
$ npm install --save bouzuya/hubot-hello-world
```

これで GitHub の [bouzuya/hubot-hello-world][] から取得できます。npm リポジトリに登録しなくてもいいんですね。便利！

次に `external-scripts.json` を編集し、`"hubot-hello-world"` を追記します。

```bash
$ vi external-scripts.json
... (略) ...

$ cat external-scripts.json
[
  "hubot-hello-world",
  "hubot-diagnostics",
  "hubot-help",
  "hubot-heroku-keepalive",
  "hubot-google-images",
  "hubot-google-translate",
  "hubot-pugme",
  "hubot-maps",
  "hubot-redis-brain",
  "hubot-rules",
  "hubot-shipit",
  "hubot-youtube"
]
```

external-scripts.json は JSON ファイルです。ここには Hubot の起動時に読み込む npm パッケージ名を書いておきます。

これで Hubot スクリプトのインストールは完了です。

さっそく試してみましょう。手元で動きを見たいだけなので、shell アダプターを使いましょう。

```bash
$ ./bin/hubot -a shell -n uran
uran> uran hello
uran> World!
```

やりました。

Hubot とふたりで完成させる Hello, World! 。もうひとりじゃない。

# インストールした Hubot スクリプトの解説

[bouzuya/hubot-hello-world][] の `src/hello-world.coffee` を見てください。

```coffeescript:hello-world.coffee
# Description
#   A Hubot script that responds 'World!'
#
# Configuration:
#   None
#
# Commands:
#   hubot hello - responds 'World!'
#
# Author:
#   bouzuya <m@bouzuya.net>

module.exports = (robot) ->
  robot.respond /hello/i, (msg) ->
    msg.send 'World!'
```

本体は 3 行です。 CoffeeScript 苦手な人向けに JavaScript で書くとこんな感じ。

```js
module.exports = function(robot) {
  robot.respond(/hello/i, function(msg) {
    msg.send('World!');
  });
};
```

`robot.respond(pattern, callback)` は listener を登録するメソッドです。Hubot に話しかけるような形 (例えば `/hello/i` という正規表現は `/hubot hello/i` のような形 (厳密には違います) で登録されます) に変換されます。パターンにマッチした場合に callback が呼び出されます。

`msg.send(message)` は `message` を送信するメソッドです。チャットにメッセージを送ります。

なので、`hubot hello` と話しかけると `World!` と返されるわけです。

ちなみに、コメントのうち `Commands:` に書いたものは `hubot help` などで使われるものです (詳細は後日) 。

# メッセージを変えてみよう

じゃあ、メッセージを書き換えて独自のスクリプトにしてみましょう。

まず [bouzuya/hubot-hello-world][] を fork し、`git clone` します。

右上の fork ボタンでも、`hub` コマンドで fork しても好きにしてください。

![fork.png](https://qiita-image-store.s3.amazonaws.com/0/3486/fc1ccfa4-8d8e-5f76-2eee-1a73b25256a4.png)

次は `git clone` して……

```bash
$ git clone git@github.com:<your GitHub user name>/hubot-hello-world.git

$ cd hubot-hello-world

$ vi src/hubot-hello.coffee

```

先ほどの `src/hello-world.coffee` を書き換えます。お好きなメッセージで。

```coffeescript:hello-world.coffee

...

module.exports = (robot) ->
  robot.respond /hello/i, (msg) ->
    msg.send 'こんにちは。あれれー英語ですか？ぷすー'

```

で、`git commit` して `git push`

```bash
$ git commit -am 'change message'

$ git push origin master
```

GitHub に Hubot スクリプト (リポジトリ) を準備できました。

# 新しい Hubot スクリプトをインストール (\<your GitHub user name>/hubot-hello-world)

先ほどの [bouzuya/hubot-hello-world][] と同じようにインストールしていきます。

ただ、今回は既に [bouzuya/hubot-hello-world][] をインストールしてしまっているので、部分的に書き換えていきます。

`package.json` を変更して依存関係を [bouzuya/hubot-hello-world][] から `<your GitHub user name>/hubot-hello-world` に変更します。

```js:package.json
...
  "dependencies": {
    ...
    "hubot-hello-world": "git://github.com/<your GitHub user name>/hubot-hello-world",
    ...
  },

...

```


改めて `npm install`。

```bash
$ rm -rf node_modules/hubot-hello-world

$ npm install
```

`external-script.json` はさきほどのものをそのままで OK です。

では、動かしてみましょう。


```bash
$ ./bin/hubot -a shell -n uran
uran> uran hello
uran> こんにちは。あれれー英語ですか？ぷすー
```

これは腹が立つ。

# 最後に

駆け足ですが、標準以外の Hubot スクリプトのインストールと、Hubot スクリプトの作成 (forkしての作成) をためしました。ゼロからの Hubot スクリプトの作成は、また次回です。

明日は [mako09](https://github.com/mako09) さんが書いてくれるようです。楽しみです。ここまでは Hubot Advent Calendar というより @bouzuya Advent Calendar ですからね。

では。

[getting-started-with-hubot]: https://github.com/github/hubot/tree/v2.9.3/docs#getting-started-with-hubot
[bouzuya/hubot-hello-world]: https://github.com/bouzuya/hubot-hello-world/
[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
[hubot-adventar-2014-2]: http://qiita.com/bouzuya/items/11c0c6da2b3ad54b827f
[hubot-adventar-2014-3]: http://qiita.com/bouzuya/items/2a200c9e8a45e2478bc2
[ops-for-everyone]: https://speakerdeck.com/johndbritton/ops-for-everyone
[hubot-adventar-2014-bouzuya-index]: http://qiita.com/bouzuya/items/c7d0ad80c357aab6b696