WSL上にRocket.Chatのプライベートグループへ時報をつぶやくHubotを構築しWindowsログイン時に自動起動する方法…

# はじめに
やったことを全部書こうとしたら読みづらいタイトルになってしまいました…
私の会社ではテレワーク中のコミュニケーションとして`Rocket.Chat`を使用しています。テレワーク中は始業やお昼休みのチャイムが鳴らないのでリーダーの私が「お昼ー」とか発言をしているのですが正直めんどくさくなってきました。そこで`Hubot`を使い時報をつぶやくbotを作ったのですが色々と罠があったので備忘録としてまとめてみました。
この記事を見ると以下のようなことができるようになります。

- Hubotの環境構築(基本的な内容)
- `https`なURLへの接続(SSLを使う)
- 時報をつぶやく
- プライベートグループ(チャンネル/ルーム)への発言
- Hubotのデーモン化
- そのデーモンをWindowsログイン時に自動起動する


# 環境
以下の環境で動作させています。

- OS
    - Windows 10 64bit
- WSL
    - Ubuntu 20.04 LTS
- その他バージョンは調査中です…


# Hubotの環境構築
## インストール
まず`node`と`npm`をインストールします。もう記憶にないですがWSLにはインストールされてなかったと思います。

```shell
$ sudo apt install -y nodejs npm
```

次に`yo`と`generator-hubot`をインストールします。デーモン化するための`forever`も入れています。
この辺の詳細は[Hubotのドキュメント](https://hubot.github.com/docs/)に載っていますので参照してください。

```shell
$ sudo npm install -g yo generator-hubot forever
```


## 雛形作成
雛形用のディレクトリを作成しその中でyoを使って雛形を作成します。

```shell
$ mkdir myhubot
$ cd myhubot
$ yo hubot
# adapterに「rocketchat」を指定する以外は適当で大丈夫です

# v3系だとプライベートグループに発言できないので、v2系ダウングレードします
$ sudo npm install hubot@2.19.0

# 併せてhubot-rocketchatもダウングレードします
$ sudo npm install hubot-rocketchat@1.0.12
```

雛形の設定では`node`のバージョンが古いようなので`package.json`を以下のように書き換えます。

```JavaScript
"engines": {
  "node": "10.19.x"
}
```

私の環境ではnodeは`v10.19.0`が入っていました。確認方法は

```shell
$ node --version
```

です。


## 起動スクリプトの編集(SSL・デーモン)
`bin/hubot`を以下のように編集します。

```shell:hubot
#!/bin/sh

set -e

export ROCKETCHAT_URL=https://sample.com
export ROCKETCHAT_USESSL=true
export ROCKETCHAT_ROOM=sample
export ROCKETCHAT_USER=bot_name
export ROCKETCHAT_PASSWORD=bot_password

npm install
export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH"

# exec node_modules/.bin/hubot --name "bot_name" -a rocketchat
forever start -c coffee node_modules/.bin/hubot --name "bot_name" -a rocketchat
```

SSLを使用する場合は`ROCKETCHAT_USESSL=true`とします。
また`forever`を使ってデーモン化しています。
それからRocket.Chatしか使わないのでアダプタオプションを`-a rocketchat`に書き換えています。


## スクリプトの作成(時報・プライベートグループ)
`cron`を使うのでインストールします。

```shell
$ sudo npm install cron time
```

続いて以下のようなスクリプトを作り`scripts`に配置します。

```CoffeeScript:main.coffee
cronJob = require('cron').CronJob


module.exports = (robot) ->

	# フォーマットは '(sec) (min) (hour) (day) (month) (day of the week)'
	new cronJob('00 00 09 * * 1-5', () ->
		robot.messageRoom "Jcq9rbe9754Z9uvqf", "**༼ つ ◕_◕ ༽つ＜仕事始めよっさ**"
	).start()

	new cronJob('00 00 12 * * 1-5', () ->
		robot.messageRoom "Jcq9rbe9754Z9uvqf", "**༼ つ ◕_◕ ༽つ＜お昼にしよっさ**"
	).start()

	new cronJob('00 00 13 * * 1-5', () ->
		robot.messageRoom "Jcq9rbe9754Z9uvqf", "**༼ つ ◕_◕ ༽つ＜再開しよっさ**"
	).start()

	new cronJob('00 00 18 * * 1-5', () ->
		robot.messageRoom "Jcq9rbe9754Z9uvqf", "**༼ つ ◕_◕ ༽つ＜仕事終わろっさ**"
	).start()
```

Rocket.Chatの`/gimme`がいい感じだったのでBOTのキャラに採用しましたｗ
先日チアダンを見たので語尾がチアダンになってます…
それは置いといて時報をつぶやくには`CronJob`を使って定時タスクを動かします。`1-5`というのは`月～金`という意味です。
またプライベートグループに発言するには`robot.messageRoom`の第一引数にプライベートグループの`実際のルームID`を入れます。実際のルームIDの確認方法ですがhubot起動時に

```
[Mon May 25 2020 19:09:28 GMT+0900 (Japan Standard Time)] INFO Looking up Room ID for: sample
[Mon May 25 2020 19:09:28 GMT+0900 (Japan Standard Time)] INFO Joining Room: Jcq9rbe9754Z9uvqf
[Mon May 25 2020 19:09:28 GMT+0900 (Japan Standard Time)] INFO rid:  [ 'Jcq9rbe9754Z9uvqf' ]
```

というようなログが出るので確認できます。デーモン化するとログが出てこなくなるので確認するときは`exec`の方で起動してください。

# Hubotのデーモン化
WSLでは`init.d`のサービスを作成します。
`/etc/init.d`で`sudo nano hubot`等してエディタを開きます。

```shell:hubot
#!/bin/sh

cd /home/user_name/myhubot
./bin/hubot
```

と書きます。`cd`パスはご自身の環境に読み替えてください。
ファイルができたら

```
sudo chmod +x hubot
```

で実行権を追加します。

# Windowsログイン時に自動起動する
以下のようなファイルを作成し

```shell:hubot.bat
@echo off
wsl -u root -- service hubot start
```

スタートアップに登録します。
Windows起動時に自動起動させる場合はタスクに登録する方法もあるようです。


# おわりに
最新版のHubotだとプライベートグループに発言できなくて情報もあまり出てこなくてドハマリしましたがなんとか完成までこぎつけました。もしかしたら来週にはテレワーク解除されるかもしれませんがこれを機に色々遊んでみようと思います。


# 参考
本記事を書くにあたり以下のサイトを参考にしました。

- [HubotでRocket.Chat用Botを作る](https://qiita.com/bibimarujp/items/a03ea58e71fccbbeba7d)
- [hubotでcron風に特定の時間に処理を実行させる方法](https://qiita.com/kon_yu/items/ff884d81f9c1db9b574b)
- [RaspberryPi上でhubotが自動起動するように設定する](https://qiita.com/KeitaMoromizato/items/d9130b3f6c04292c129d)
- [Windows10のWSL上にあるServiceを簡単に自動起動させる](https://qiita.com/nashi2603/items/d0645305b137017b91b0)