Node.js
TypeScript
Slack

Slack上で動作するチャットシステムの構築

https://qiita.com/advent-calendar/2017/dwango

はじめに

slack-logo-5CFD82DDBE-seeklogo.com.png
皆様、Slack、活用されているでしょうか。
表題の通り、Slackを用いて、Slack上でメッセージをやりとりできるシステムを作ります。
もともと、Slack上で動作するゲームを作ろうと思っていて、その習作を兼ねたものになります。
SlackのAPIを用いて状態を受け取り各種メソッドにPostすることで状態を更新していきます。

リポジトリ

https://github.com/orzngo/slack-chat

作る機能

チャットに入室する

ニックネームを指定してチャットに入室する機能です。これが無いと始まりませんね。
BotのいるSlackチャンネルにて、joinコマンドを発行してチャットに入室します。

ユーザーに対して画面を表示する

Slackは優れたプラットフォームですが、Canvas描画をサポートしていないため、基本的にテキストと絵文字でユーザーに対して情報を伝える必要があります。定期的な再描画もサポートする必要があるでしょう。
一度に大量の画面を更新しようとすると、その数だけAPIにPostする必要があり、APIのRate Limitに触れてしまうため、更新間隔は参加者同士でばらばらになるように配慮します。

動作デモ

接続

スクリーンショット 2017-12-18 16.08.46.png

Botが居るチャンネルでBotに大して接続コマンドと使用するニックネームを伝えると入室できます。
この状態でBotに対してメンションするとそれが発言となるのですが、このままでは画面が表示されていないためあまり意味がありません

チャットの表示

スクリーンショット 2017-12-18 16.09.01.png

Botに対して screen コマンドを発行することで、Botからメッセージが返ります。
裏ではメッセージのTimestampと、発言を返したチャンネルを覚えており、この二つの情報で、メッセージに対して定期的な編集をかけます。
人間が行う場合と違い、なぜかAPI経由で編集する場合、時間制限が無いようです。

発言

スクリーンショット 2017-12-18 16.09.15.png

Botにsayコマンドで発言すると、それがチャットログとして保存され、全ユーザーに送信されます。

接続済みの全ユーザーの画面は定期的に更新され、その時の最新のチャットログ10件が表示されます。

emoji対応

スクリーンショット 2017-12-18 16.09.43.png

Slackというプラットフォームそのものが絵文字に対応しているため特に意識せずとも対応できます。
名前にも使うことができます。自分で作ると大変にだるいのですごいラクです。

チャンネルの移動

Botがいる別のチャンネルでscreenコマンドを実行すると、今までの画面は放棄され、新しい画面が表示されます。

便利な使い方

匿名で発言する

チャットの画面はそのチャンネルにいる全員に見える一方、Botに対して発言するチャンネルはどこでもよいため、匿名で発言が可能になります。悪いことが出来そうな気がしますが、結局ログは残っている為出来ないです。

議論を公開する

チャットの画面はSlackのチャンネルにいる全ユーザーに見えているため、まずそのチャンネルでScreenを表示した後、別のチャンネルで発言することにより、横槍の入れられない公開討論が可能になります

まとめと今後の課題

まとめ

Slackのユーザー同士でスレッドを共有し、それを操作し、それを表示する、という、基本的な仕組みが作れました。
Slack上で複数人で遊べるゲームとかを作りたかったので、だいたいの目的は達したかなと思います。
Slack上でメッセージのやりとりができるようになったのは非常に便利だと感じました。

Slackというプラットフォームは非常に優秀で各種APIも充実しており、ゲームやコミュニケーションを行う上での基本的な機能はすべて実装されていると思います。
認証周りもSlackが受け持っているので、その辺を考えることなく、必要な機能の実装だけに注力できたため、数日でこのチャットを作ることができました。
マジで簡単なので、皆さんもSlackのAPIとにらめっこしながら年末年始をゆっくり過ごしてみてはいかがでしょうか。

今後の課題

  • チャットルームが一つしか作れないので引数でルーム番号を受け取るようにする
  • 一度作ったscreenを破棄出来ないのでexitコマンドを実装する
  • 発言ログをDBに積んだりしてないのでその辺作ったり
  • なんか面白いゲームを考える
  • Slackにはそもそもチャット機能がある