SlackBot「鳩」を支える技術

3 min読了の目安(約3000字IDEAアイデア記事

この記事は「Unityゲーム開発者ギルド2 Advent Calender 2020」16日目の記事です。

おまえは誰だ

名前:すずきかつーき
年齢:おじさん
職業:地方のプログラマ
経歴:地方のプログラマ→無職→情報系専門学校教員→ゲーム会社プログラマ(札幌)x2→地方のプログラマ

「鳩」ってなんだ馬鹿にしてるのか

いえいえ、そんなことはございません。
「鳩」とはUnityゲーム開発者ギルド(以下UGDGと略します)のSlackに住まうBOTの名前です。

なぜ「鳩」なんだ

話すと長くなるのですが、Slackで有名な この生き物。
実はオウムで、正確に言えば「カカポ」らしいんですが、適当に鳩って呼んでたんですよね。
えぇ、僕が勝手に。
で、コミカルな動きが気に入ってBOTの名前も「鳩」にした次第です。何も間違ってない

なんでそんなものを作ったんだ

UGDGのSlackが作られたのがもう2年も前の 2018年11月になるのですが。

発起人である ないち御大 の影響力や凄まじく、僕が参加させてもらった時には既に100人を超える大所帯になっていました。(なお、12月現在900人を超えているようです)

そして、UGDGのSlackでは times_自分の名前 というチャンネルを作る事が推奨されているのです。

するとチャンネルが並ぶ事並ぶ事。

チャンネルの山やーー!(これでも全然一部です)

僕も自分のチャンネル(times_すずきかつーき)を作りましたが、最初に思ったのは(チャンネル最初のメッセージは)

すずきかつーき
他の人の全チャンネル入るの大変ねー
#times_すずきかつーき への投稿 | 2018年11月13日 |

でした。

もちろんその事態は想定されていて、一括でJOIN出来るJavaScriptのブックマークレットのような1行スクリプトが用意されてはいました。そのJSのスクリプトをChromeなどブラウザの開発者Windowに張り付けて実行すれば全チャンネルに入れる。
というものだったんですが

  • なぜか一度で全部は入れない(何度か実行する必要がある)
  • 開発者Windowに張り付けて実行 もNotプログラマーからするとそれなりのハードル

という問題がありました。

当初はJavaScriptの方を修正したりなんだりしていたんですが
「これ、また参加者が増えてチャンネルが増えたらどうするのかな。またこのスクリプト流すのかな。そしてその新規参加者もスクリプト流すの、厳しいよなぁ」

僕の中の何かが燃え上がり。
そして、翌日には鳩BOTのプロトタイプが出来ていました。

すずきかつーき
このオウムは、特定のメッセージ。 例えば「僕を全部のチャンネルに入れて」みたいなメッセ>ージを検出して、そのメッセージを発言したユーザーを全チャンネルに勝手にJOINしてくれるやーつです。
#times_すずきかつーき への投稿 | 2018年11月13日 |

(あれ・・。 この時は「オウム」って言ってますね。いつから「鳩」になってしまったんでしょう。)

結局その「鳩」は何が出来るんだ

当初チャンネルに招待さえしてくれればよかったのですが、あれよあれよと機能を追加していった結果、今では

  • 既存全チャンネル招待
    • 「:鳩 よろしく」のメッセージを検知して起動
    • 有無を言わさず全チャンネルに招待
  • 新規チャンネル自動招待
    • ユーザーは「:鳩 よしなに」のメッセージで事前登録しておくと前日から当日で新規で増えたチャンネルに自動でログイン
  • 会話機能
    • 定型文応答 + A3RT Talk API による応答
  • 画像検索
    • 「~~画像」のメッセージを検知して、Google CustomSerachApi で得られた画像URLを返却
  • レポート機能
    • 毎日AM1時頃に昨日の全メッセージをクロールしてチャンネル毎の発言数・ユーザー毎の発言数・使用されたリアクションを集計してランキング形式で発表
  • メッセージログバックアップ
    • 1日4回 全メッセージをクロールしてGoogleSpreadSheetにログを保存
  • 過去ログ(鳩ログ)取得サービス
    • 「/log」のスラッシュコマンドから起動
    • 指定したチャンネル、日付を選択し、ログを圧縮して返却

等々が出来るようになっています。(他にも細々とした機能がありますが割愛)


(↑これは、わかりやすくなるかな?と思って作ったけれどよりわけわからなくなった図です。)

なんだか大変そうだが、まあこれからも頑張ってくれたまえ

そうしたいのは山々なのですが・・・。

実は、この鳩に使われている技術のslack側からのhook(outgoing webhook)やSlackAPIを呼び出すためのTOKENほとんどが非推奨なんですよね。
公式が「今に削除するよ」ってアナウンスをだしてたりするのものばかりです。

通常の会話のやり取りなどは改造すればそれなりに今まで通り動きそうですが、本丸である「全チャンネル招待」は無理そうな気がしています(この辺りは 全チャンネルに招待してくれるSlackBotを頼まれてもいないのに作ってみた でも触れています)
本丸を欠いた鳩に価値はあるでしょうか。

なので、鳩はいつか いなくなります。

それが明日なのか数年後なのかはわかりませんが、その時が来るまでは。
鳩は今日もどこかのチャンネルでこう呟くでしょう。