Lita chat bot でおみくじを引いてもらうメモ

# 概要

* Lita chat bot をSlack に参加させる
* `omikuji` と発言するとおみくじを引いてくれる(handler の作成)
* Heroku にデプロイ

# 前提

* git
* GitHub などのサイトに`lita-omikuji` の名前でリポジトリ作成済
* heroku toolbelt
* RSpec
* Bundler

# 手順

* Lita 本体を作る - この本体に対してプラグイン(gem) を追加していくことで機能を拡張する
* 振る舞い(Handler) を追加する - 本体の機能を拡張するためのgem(lita-omikuji) を作成する
* omikuji 機能を追加したLita 本体をHeroku にデプロイ

## Lita 本体

```bash
mkcd ~/lita-bot
bundle init
git init
echo "gem 'lita'" >> Gemfile
echo "gem 'lita-slack'" >> Gemfile
bundle install
echo "gem 'lita-omikuji', github: 'gouf/lita-omikuji'" >> Gemfile
git add .; git commit -m 'Initial Commit'
```

### Slack Token の設定

https://**your_team_name**.slack.com/services/new にアクセスして、Lita を選択

```ruby
Lita.configure do |config|
  config.robot.adapter = :slack
  config.adapters.slack.token = "abcd-1234567890-hWYd21AmMH2UHAkx29vb5c1Y"
end
```

上記のような設定の案内が出てくるので、`lita_config.rb` に記述

### アダプタの変更

アダプタをデフォルトの`:shell` から`:slack` に変更する

`lita_config.rb`

```ruby
config.robot.adapter = :slack
```

## Lita Omikuji

`bundle install` で`lita` コマンドが使えるようになったので、`lita handler omikuji` でテンプレートを作ってもらって、おみくじを引いてくれる機能を書いていく

このとき、下記のように本体とは別のディレクトリで作業する

```bash
cd ~/
lita handler omikuji # => lita-omikuji
cd lita-omikuji
git init; git add .; git commit -m 'Initial Commit'
git remote add github git@github.com:my_account_name/lita-omikuji.git
```

`lita handler` のときにCI 利用やテストカバレッジ生成についての質問があるが、今回はパス
(自身でプラグインを作成する際には利用されたい)

### RSpec

ここで おもむろにテストを適当に書く

`lita-omikuji/spec/lita/handlers/omikuji_spec.rb`

```ruby
require 'spec_helper'

describe Lita::Handlers::Omikuji, lita_handler: true do
  it { is_expected.to route('omikuji') }
  it { is_expected.to route('omikuji').to(:omikuji) }
  it 'retrieve message "omikuji"' do
    omikuji_list = %w(大吉 吉 中吉 小吉 半吉 末吉 末小吉 平凶 小凶 半凶 末凶 凶 大凶)
    send_message('omikuji')
    expect(omikuji_list).to include(replies.last)
  end
end
```

### Omikuji 実装

テストにパスするように実装を書く

```ruby
module Lita
  module Handlers
    class Omikuji < Handler
      route(/omikuji/i, :omikuji) # 正規表現にマッチしたら、指定されたメソッド名を呼び出す

      def omikuji(response)
        omikuji_list = %w(
          大吉 吉 中吉 小吉
          半吉 末吉 末小吉
          平凶 小凶 半凶
          末凶 凶 大凶
        ).freeze
        response.reply(omikuji_list.sample)
      end
    end

    Lita.register_handler(Omikuji)
  end
end
```

### GitHub にプッシュ

実装したので予め作っておいたリポジトリにプッシュ

```bash
git push github master
```

## Heroku にデプロイ

* `Procfile` の作成

* redistogo addon の追加

```shell
echo "web: bundle exec lita" > Procfile
heroku addons:add redistogo
```

* `lita_config.rb` にRedis to Go の設定を追記

```ruby
config.redis[:url] = ENV['REDISTOGO_URL']
config.http.port = ENV['PORT']
```

変更点をコミットしておいて、git でHeroku にプッシュ

```bash
heroku create
git push heroku master
```

### 動作確認

Slack にアクセスし、lita に`omikuji` と話しかけると、おみくじを引いてくれる

### 継続利用

Heroku にデプロイした場合、放置されるとアプリが休眠するらしいので、Uptime などのサービスでアプリの監視をさせる

※ http://**my_app_name**.herokuapp.com/lita/info にリクエストを投げると(JSON での)応答が返ってくる

## Links

* [Plugin Authoring: Testing / testing-handlers - Lita.io](http://docs.lita.io/plugin-authoring/testing/#testing-handlers)
* [Plugin Authoring: Handlers - Lita.io](http://docs.lita.io/plugin-authoring/handlers/)
* [Plugin Authoring  / plugin-types - Lita.io](http://docs.lita.io/plugin-authoring/#plugin-types)
* [Getting Started: Deployment - Lita.io](http://docs.lita.io/getting-started/deployment/)
* [Uptime Robot](http://uptimerobot.com/)