Closed motoki317 closed 3 years ago
traQ-S WebSocket Bot - traP HackMD
Milestones
Bot のイベントの受け取り方に従来の HTTP Mode に加えて WebSocket Mode を追加する。 Mode は作成時、また作成後に開発者によって変更可能。 WebSocket Mode では、Bot がイベントを受け取るための static IP を用意する必要が無く、例えば Firewall の内側でもホスト可能 (Intro to Socket Mode | Slack を参照)。
また、WebSocket の Bot → traQ の通信で通常のクライアントのように Qall session の同期が可能になる。
WebSocket Mode では繋いでいないときにはイベントを送らないで済むため、長期的にはサーバー側の負荷軽減にも繋がる... かもしれない。
HTTP
Mode と WebSocket
Mode のいずれかが選択可能。従来の Bot は HTTP
Mode に自動的に移行される。
HTTP
Mode
WebSocket
Mode
HTTP
Mode で必要である verification token は、必要無い。WebSocket BOT は GET /api/v3/bots/ws
に接続する。
通常ユーザーが traQ-S_UI クライアントを通じて使用する GET /api/v3/ws
とは異なるエンドポイントであり、当然仕様も異なるため注意。
Mode によって形式がやや異なる。 HTTP Mode では Header で送っている情報があるため。
HTTP
Moderef: traQ BOT Console
...
Content-Type: application/json
X-TRAQ-BOT-REQUEST-ID: RequestID(UUID)
X-TRAQ-BOT-TOKEN: VerificationToken
X-TRAQ-BOT-EVENT: PING
...
{"eventTime":"2019-05-07T04:50:48.582586882Z"}
WebSocket
Mode{"type":"PING","reqId":"requestId","body":{"eventTime":"2019-05-07T04:50:48.582586882Z"}}
WebSocket Mode では、WebSocket を通じてイベントを受け取るだけでなく、Bot から traQ 側に情報を送信することができる。 便宜上 WebSocket command と呼ぶ。
Command が成功した場合、サーバーからの返信は無い。 失敗した場合、以下の Message が送られる。
{"type":"ERROR","body":"message"}
rtcstate
CommandQall の session 同期をする。 Qall に参加する Bot は session を同期することが望ましい。必須ではないが、しない場合は Qall ユーザー一覧として表示されなくなる。
通常クライアントと同じ動作。
rtcstate
コマンドでRTC状態を通知する
rtcstate:{channelId}:({state}:{sessionId}:)*
null
もしくは空文字を設定するか、stateにnull
もしくは空文字を設定すると、rtcstateをリセットする
rtcstate:
, rtcstate:null
rtcstate:{channelId}:
, rtcstate:{channelId}:null
マイクミュートの場合、state
に.micmuted
を追加する。
e.g.
チャンネルAで行われているQall(sessionId1)に参加
↑ bot1 rtcstate:channelA:qall:sessionId1
チャンネルAで行われているQall(sessionId1)にてマイクをミュート
↑ bot1 rtcstate:channelA:qall.micmuted:sessionId1
メジャーな各言語で WebSocket Mode 用 SDK を用意できると良いかもしれない。
イメージ: Intro to Socket Mode | Slack
const { App } = require('@slack/bolt');
const app = new App({
token: process.env.BOT_TOKEN,
appToken: process.env.SLACK_APP_TOKEN,
socketMode: true,
});
(async () => {
await app.start();
console.log('⚡️ Bolt app started');
})();
NOTE:
/ws
とは別に、BOT用のWebSocketエンドポイントを作る BOT用のWebSocketエンドポイントを実装するにあたって、BOTのイベントも現在のWebhook通知とWebSocketのリアルタイム送受信の2種類を実装すると良いかもしれない