RubyのFaaSでslackbotをつくる

最近自分の中で話題のサービス`FaaStRuby`を使ってSlack Botを作成します
FaaStRubyって何？って方は[こちら](https://faastruby.io/)をどうぞ

## 環境
faastruby : 0.2.1

## slack側の設定

### webhookの登録
今回はOutgoing Webhooksを使ってbotを作成するので、その設定を行う

https://teamname.slack.com/apps/manage/custom-integrations
ここからoutgoing webhooksのintegrationを作成する

![Screenshot from 2018-10-18 21-59-22.png](https://qiita-image-store.s3.amazonaws.com/0/105198/a67bf0bc-ce1b-1f0c-4677-42e3598382b1.png)

outgoing webhooksが登録されていない場合は、https://teamname.slack.com/apps の検索窓から
「outgoing webhooks」で検索し作成する

![Screenshot from 2018-10-18 22-02-29.png](https://qiita-image-store.s3.amazonaws.com/0/105198/578fc3f7-b21d-b97b-8800-86afc71c5776.png)

![Screenshot from 2018-10-18 22-05-28.png](https://qiita-image-store.s3.amazonaws.com/0/105198/17528e69-e707-f34f-892f-263eaa1a7ccb.png)

![Screenshot from 2018-10-18 22-05-39.png](https://qiita-image-store.s3.amazonaws.com/0/105198/ce9460f1-4608-1fe0-d318-fda52c302449.png)

作成したらIntegration SettingsのchannelとURLに、それぞれBotを入れたいチャンネルとfaastrubyで作ったエンドポイントを入力する
※ エンドポイントについては後述

![Screenshot from 2018-10-18 22-13-15.png](https://qiita-image-store.s3.amazonaws.com/0/105198/84398803-a542-0604-9ec5-38dbae24137f.png)


## FaaStRuby側の設定
こちら側ではbotの中身を作っていく
今回は簡単にユーザー名とユーザーが入力した言葉を返すbotを作る

### Gemのインストール
```
$ gem install faastruby
```

### ワークスペースの作成
今回は`slackbot`という名前でワークスペースを作成した
恐らく重複しなければ好きな名前のものが作成できる

```
$ faastruby create-workspace slackbot
```

### Functionの作成
こちらも`slackbot`で作成している

```
$ faastruby new slackbot
```

上のコマンドを実行すると、以下のファイルが自動生成される

```
workspace(slackbot)
  　├─ function(slackbot)
    　  ├─ Gemfile
　      ├─ handler.rb 
　      ├─ faastruby.yml
      　└─ spec
  　        ├─ handler_spec.rb
  　        ├─ spec_helper.rb
  　        └─ helper
  　            └─ faastruby.rb
```
この中の`handler.rb`がfunctionの中身

botの実装はこんな感じ

```ruby:handler.rb
require 'json'

def handler event
  data = event.body ? JSON.parse(event.body) : {}
  response = {}
  if data['user_name'] != 'slackbot'
    response['text'] = "#{data['user_name']} : #{data['text']}"
  end
  respond_with response
end
```
eventはリクエスト情報を持つもので、event.bodyにリクエストの中身がstringで入っている
outgoing webhookのbotでは、以下のようなデータが渡されてくる

```
token=*********************
team_id=T0001
team_domain=example
channel_id=C2147483705
channel_name=test
timestamp=1355517523.000005
user_id=U2147483697
user_name=Steve
text=googlebot: What is the air-speed velocity of an unladen swallow?
trigger_word=googlebot:
```
`respond_with response`でレスポンスを返す
以下のJSONを返すと、botがチャンネルの中でtextの中身をつぶやいてくれる

```
{
  "text": "African or European?"
}
```
### デプロイ
最後にFaaStRubyのサーバーにデプロイをするが、その前に`faastruby.yml`を少し書き換えておく

```yml:faastruby.yml
---
name: slackbot  # function名
test_command: rspec    # テストコマンド
abort_build_when_tests_fail: false    # テストが失敗したときにビルドをやめるか
abort_deploy_when_tests_fail: false    # テストが失敗したときにデプロイをやめるか
```
そのままだと、後半2つの設定をfalseにしておかないとテストで落ちてデプロイできない
`spec/handler_spec.rb`のテストを、今回用に書き直せばtrueでもデプロイできる

デプロイコマンド

```
$ cd slackbot
$ faastruby deploy-to slackbot
```

デプロイが終わると以下のようなエンドポイントが作成される

```
https://api.faastruby.io/slackbot/slackbot
```
workspaceとfunctionの名前同じにしたの失敗した...
どっちがどっちかわからない:thinking_face:
エンドポイントはこういう形になる

```
https://api.faastruby.io/workspace-name/function-name
```

このエンドポイントを、上のSlack Webhooksの設定に入れることでbotを動かすことができる

## デモ
<img width="691" alt="スクリーンショット 2018-10-19 11.36.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/105198/b82046f6-5322-28c4-3a6a-84b4e79bf267.png">

問題なく動いた

# 結論
FaaStRubyはいいぞ

# 参考URL
[SlackのOutgoing Webhooksを使って投稿に反応するbotを作る](https://qiita.com/chike0905/items/58222a99be460f325ab8)