📆

[Mattermost Integrations] REST API (WebSocket)

2021/06/19に公開

Mattermost 記事まとめ: https://blog.kaakaa.dev/tags/mattermost/

本記事について

Mattermost の統合機能アドベントカレンダーの第 11 日目の記事です。

本記事では、Mattermost の WebSocket API ついて紹介します。

WebSocket API の概要

Mattermost は WebSocket API を利用することで、Mattermost 上でやり取りされている WebSocket のイベントを取得することもできます。

WebSocket API については REST API のドキュメントに説明があります。
https://api.mattermost.com/#tag/WebSocket

WebSocket イベントの取得

Mattermost の WebSocket Event を取得するために、Mattermost 公式の WebSocket クライアント websocket_client.go を利用します。

package main

import (
	"log"

	"github.com/mattermost/mattermost-server/v5/model"
)

const (
  // (1) Mattermost WebSocket Endpoint
  MattermostWebSocketURL = "ws://localhost:8065"
  // (2) Access Token
	AccessToken            = "4cacdozwn3fndnzobbpha3nnhy"
)

func main() {
  // (3) WebSocket Clientの構築
	client, appErr := model.NewWebSocketClient4(MattermostWebSocketURL, AccessToken)
	if appErr != nil {
		log.Fatal(appErr.Error())
	}

  // (4) 接続
	if appErr = client.Connect(); appErr != nil {
		log.Fatal(appErr.Error())
	}
	client.Listen()

	for {
		select {
    case event := <-client.EventChannel:
      // (5) WebSocket Eventについての処理
			log.Printf("Received: %v", event)
		}
	}
}

(1)で Mattermost WebSocket の URL を宣言しています。プロトコルがhttp(s)ではなくws(s)になります。また、WebSocket API のエンドポイントは/api/v4/websocketですが、この部分は Mattermost の WebSocket Driver が付与してくれます。
(2)では WebSocket API にアクセスするために使用するアクセストークンを宣言しています。REST API 実行用と同じ Token です。

(3)で、Mattermost の WebSocket Driver を利用して WebSocket クライアントを生成し、このクライアントを使って(4)で WebSocket API へ接続しています。

接続が問題なく完了すると、 WebSocket クライアントのEventChannelフィールドに WebSocket Event が流れてきます。(5)で、流れてきたイベントを出力しています。

上記コードを実行しておくと、Mattermost 上で何か操作をした時に WebSocket Event がコンソールに表示されるようになります。

video

Ctrl + cを入力するとプログラムを終了します。

今回は単に受け取ったイベント情報を出力するだけでしたが、受け取ったWebSocketEventの内容に応じた処理を実装することもできます。
WebSocketEvent構造体のDataフィールドの内容はイベントの種類によって異なり、イベントの種類は下記から確認できます。
https://github.com/mattermost/mattermost-server/blob/c54ab6da211af861b25af1364518e549d3a1ed91/model/websocket_message.go#L14

WebSocket API の実行

Mattermost では WebSocket API を通じてリクエストを送信することもできるようですが、現在利用可能なのが下記 3 種類のみのようで、ちょっと用途が今のところ分かりません。

  • user_typing
  • get_statuses
  • get_statuses_by_id

さいごに

Mattermost WebSocket API の使い方について紹介しました。
明日は、Bot アカウントの使い方を紹介します。

Discussion