サイコロトークで遊べるslackBotをRubyで作ってみた

#はじめに
『サイコロトーク』とはサイコロを転がして、出た目のテーマにそってトークを楽しむというゲームです。 
これからの時期はオンライン会議システムを使ってリモート飲み会をしようって方も結構いらっしゃる様ですが、そんな場で盛り上がる話題が欲しい時に役立てば、ということで以前あるサロン向けにRubyで作ったサイコロトーク用のslack-botを紹介します。

#環境
OS:Ubuntu 16.04.3 LTS(さくらVPS)
Ruby:ruby 2.3.1p112

#slack側の設定
slackへログイン後、下記のリンクをクリックするとボットの新規作成画面が開きます。
[Bots](https://my.slack.com/services/new/bot)
![001.png](https://qiita-image-store.s3.amazonaws.com/0/13048/1b73d43b-5f87-b9e1-4f2e-58bdcb839001.png)

「ユーザー名」に名前を設定したら 「ボットインテグレーションを追加する」で追加しましょう。
追加したら以下のような画面に遷移します。
![002.png](https://qiita-image-store.s3.amazonaws.com/0/13048/97e6f497-579f-4702-5b00-9cba32b237d9.png)
**APIトークン**：プログラム上で使用するのでメモしてください。
**名前をカスタマイズする**：ボットのユーザー名です。先程入力したものが表示されていますので、これもメモします。
**アイコンをカスタマイズする**：お好きな画像をアップロードして設定してください。
**氏名**：スラック上に表示される名前です。私は「サイコロトークbot」にしました。

最低限以上を設定したら「インテグレーションの保存」で保存しましょう。
ここまで出来るとチャットのメンバーリストに、設定した氏名でボットが追加されていると思います。今はまだプログラム本体と紐付いていませんが、botを使いたいチャンネルに招待しておきましょう。

#プログラムの準備
###ImageMagickのインストール
本プログラムでは、画像とテキストを合成する為に mini_magic という gem を使いますが、これにはOSに ImageMagick というアプリケーションがインストールされている必要があります。下記のようにして確認してみましょう。

```
~% convert --version
Version: ImageMagick 6.8.9-9 Q16 x86_64 2017-07-31 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2014 ImageMagick Studio LLC
Features: DPC Modules OpenMP
Delegates: bzlib cairo djvu fftw fontconfig freetype jbig jng jpeg lcms lqr ltdl lzma openexr pangocairo png rsvg tiff wmf x xml zlib

```
上記がOKなら次に進みます。入っていなかったら何らかの手段でインストールしておきましょう。

###プログラム本体の入手
下記のリポジトリから Git でプログラム本体を取得してください。

[rattcv/slackbot_dicetalk](https://github.com/rattcv/slackbot_dicetalk)

slack-ruby-bot という比較的簡単にbotが作れる便利な gem を使っています。
他のものも含め必要な gem については Gemfile を同梱しているので bundle install で導入しますが、普通に gem コマンドでインストールしてもいいと思います。

###コードの修正
テキストを出力するためのフォントだけは用意して頂く必要があるので、お好みのものをプログラムと同じディレクトリに置いてください。
フォントの名称とslack 側の bot の設定でメモした情報をもとに、プログラムを一部修正します。

- TOKEN
- OUTPUT_IMAGE_PATH
- DISPLAY_IMAGE_URL
- FONT
- BOT_NAME

上記の定数で定義してある部分の値を変えてください。設定値の内容はコメントしてあります。
それとサイコロを振る時にボットのアイコンが変化するんですが、そのアイコン用画像を OUTPUT_IMAGE_PATH に定義するディレクトリに置きましょう。私はこんな画像を使いました。
![throw.png](https://qiita-image-store.s3.amazonaws.com/0/13048/c59b3cee-e23d-0aeb-8256-bc9418febf27.png)


#Botの起動
さて、ここまで出来たらあとは起動するのみです。プログラムがあるディレクトリ上で以下の様にコマンドを打ちましょう。

` bundle exec ruby bot.rb `

slackの画面を見ると、作成したBotがログイン状態になっている筈です。

#使い方
Botを招待済みのチャンネルで、`dice help`とメッセージを送信すると、使用方法が表示されます。
![dice_help.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13048/d339208d-cc48-fc26-cbc2-5fca2017fa6a.gif)

多分これで使い方は分かると思うのですが、初回は必ず`dice update`を実行してください。
slackの絵文字も使えます。
![dice_update.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13048/dd6178b8-cb55-458e-1b9e-b41e9f2b0316.gif)


`dice go`で、こんな感じでサイコロが回ります。



![dice.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13048/65735547-959e-8601-dcbc-bd6aabb03aee.gif)




#仕組みについて

slackにGif動画を貼った場合に自動再生される仕組みを使っているだけです。
内部ではこんな処理をしています。

- `dice update`
   - 入力されたテキストをもとにトークテーマのリストを作成し、テキストファイルに保存。
   - テキストを１行ずつ読み込み、枠の画像と合成してテーマの数分の静止画像を作る。
   - 上記の静止画像をつなぎ合わせたGifアニメーションを作成し保存(gif1)。
- `dice go`
   - 作成済みのテーマ入りの静止画像をランダムに５枚選択し、つなぎ合わせてGifアニメーションを作成(gif2)。
   - gif1は素早く、gif2はゆっくり再生される様に設定した上で、両者をつなぐ(gif3)。
   - gif3をWebサーバ上の画像表示用のディレクトリに設置し、参照可能なURLをBotのメッセージとしてslackに送信。
   - サイコロが回ってテーマを決めている様に見える。

URLを貼るんじゃなくて、作成したGifをslack上にアップロードする方法も試したんですが、速度が遅かったのでこちらの方法になりました。

以上となります。ではでは是非試してみてください！

#####参考にさせて頂いたサイト
- [How to Build a Ruby SlackBot](https://revs.runtime-revolution.com/how-to-build-a-ruby-slackbot-bc7115b4eeaf)
- [slack-ruby-bot gemを使ってみる](https://hoshinotsuyoshi.com/post/slack_ruby_bot/)
- [Ruby:mini_magickを使って画像に文字(テキスト)を合成する](http://madogiwa0124.hatenablog.com/entry/2018/07/21/170019)