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

本記事について

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

本記事では、Mattermost上で任意のタイミングで特定の処理を実行できるSlash Command機能について紹介します。

Slash Command概要

Slash Commandは、Mattermostの投稿入力欄で / で始まるコマンドを入力することで、特定の処理を実行できる機能です。 Slash Commandには、Mattermostにデフォルトで搭載されている**Built-in Slash Command(内蔵スラッシュコマンド)と、ユーザーが独自にカスタマイズできるCustom Slash Command(カスタムスラッシュコマンド)**があります。

投稿入力欄に何も入力していない状態で/を入力すると、利用できるスラッシュコマンドの一覧が表示されます。

slash command

Slash Commandに関する公式ドキュメントは下記になります。

一つ目の公式ドキュメントはSlash Command機能の概要について記述しており、二つ目のDeveloper Documentにはより細かい開発者向けの情報が書かれています。

Built-in Slash Command

Built-in Slash Commandとして使用できるスラッシュコマンドは、下記のドキュメントに記載されています。

https://docs.mattermost.com/developer/slash-commands.html#built-in-commands

数が多いので全ては紹介しませんが、個人的には /shortcut/shrug をよく使います。

/shortcutはMattermost上で使用できるショートカットを表示するコマンドです。ショートカットの中では、Ctrl + kによるチャンネル切り替えをよく使います。

shortcut

/shrugは、¯\_(ツ)_/¯ を簡単に入力するためのコマンドです。なんだかよく分からないけど上手くいかなかった時などに使います。

Custom Slash Command

Custom Slash Commandは、ユーザーが独自のSlash Commandを作成できる機能です。Custom Slash Commandが実行されると、Custom Slash Command作成時に指定したURLへコマンド実行情報が送信されます。

overview

Custom Slash Commandは、外部アプリケーションにリクエストを送信するという点でOutgoing WebHookと似ていますが、ユーザーが明示的にコマンドを実行できる点や、Outgoing WebHookでは利用できなかった非公開チャンネルやダイレクトメッセージチャンネル内でも利用できるという点が異なります。

設定

Custom Slash Commandを利用するには、システムコンソール > 統合機能管理 > カスタムスラッシュコマンドを有効にする の設定が有効になっている必要があります。

system console

また、統合機能はデフォルトではシステム管理者とチーム管理者しか作成することができませんが、誰でも作成できるようにしたい場合、システムコンソール > 統合機能管理 > 統合機能の管理を管理者のみに制限するの設定を無効してください。

作成

メインメニュー > 統合機能から統合機能の画面を開き、

main menu

スラッシュコマンド > スラッシュコマンドを追加するから、新たなSlash Commandを追加します。

menu

Slash Commandの作成画面で入力する情報は下記の通りです。

Slash Commandの作成が完了すると、トークンが表示されます。このトークンは、Outgoing WebHookのトークンと同様、リクエストがMattermostから送信されたことを検証するために使われます。

complete

実行

Slash Commandを実行する前に、リクエスト送信先サーバーを立ち上げておく必要があります。 Outgoing WebHookの時と同様、送信されたリクエストのJSONボディをログ出力する簡単なサーバーを立ち上げておきます。Outgoing WebHookの時との違いは、送信されるリクエストボディの形式が異なるのと、エンドポイントを変更している点です。

package main

import (
	"log"
	"net/http"
)

func main() {
	http.HandleFunc("/command", func(w http.ResponseWriter, r *http.Request) {
		// (1) Formデータの読み込み
		r.ParseForm()
		log.Printf("Request: %#v", r.Form)
	})
	http.ListenAndServe(":8080", nil)
}

(1) Slash Commandにより送信されるリクエストは、application/x-www-form-urlencoded形式で送信されるため、Formデータとして読み出しています。

上記コードをmain.goとして保存し、go run main.goを実行してサーバーを立ち上げます。もし、MattermostサーバーとSlashCommandリクエスト受付用のサーバを同じマシン上で起動し、Outgoing WebHook作成時のコールバックURLlocalhostのサーバーを指定している場合、システムコンソール > 開発者 > 信頼されていない内部接続を許可するlocalhostを追加しておく必要があります。

config allow internal

上記の設定が完了した後、Slash Commandを実行すると下記のようなリクエストの情報がコンソールに出力されます。

execute

$ go run main.go 
2020/11/03 15:04:24 Request: url.Values{"channel_id":[]string{"xxyu9xoref8mjgy3s9i5y7776y"}, "channel_name":[]string{"slash-command"}, "command":[]string{"/サンプルコマンド"}, "response_url":[]string{"http://localhost:8065/hooks/commands/5xthz8jf67ggx8heopn1ay1tqe"}, "team_domain":[]string{"test"}, "team_id":[]string{"9d1xf4gg7fnibxs8fdw6fo5fre"}, "text":[]string{""}, "token":[]string{"8w7foap4ufrsfczda8uez51yxo"}, "trigger_id":[]string{"bm1udGhmOGs3ZmJmeGpmb3dnODZnY2NzaWU6ODd4OTN1bzhwZm56ZHJvOWt0Y21vYnBhMXI6MTYwNDM4MzQ2NDI4MTpNRVVDSUZ5Vjc0NmwrWWt3UVUrUkwrUzFaYWlTMStnYTZPa2ZsSzJtSTBBL2wzNThBaUVBOFpTY2hjblZLa05scVU0MVNmc2l0cEdGanpXWE9tREdKK2NTeUFiRURHYz0="}, "user_id":[]string{"87x93uo8pfnzdro9ktcmobpa1r"}, "user_name":[]string{"kaakaa"}}

このように、Slash Commandを実行することで外部アプリケーションへリクエストを送信することができます。外部アプリケーション側で、送信されたリクエストに応じた処理を実装することで、Mattermostから処理を起動したりすることができます。動作的にはOutgoing WebHookと似ていますが、Slash Commandはチーム内のどのチャンネルからも実行することができ、チャンネルやトリガーワードの設定も存在しないため作成者でなくても使いやすいという利点があります。 また、レスポンスによる投稿作成時に利用できる機能もOutgoing WebHookよりも多いですが、その辺りは明日の記事で紹介します。

さいごに

本日は、Slash Commandの基本的な使い方について紹介しました。 明日は、Slash Commandのレスポンスとして利用できるパラメータについて紹介します。

comments powered by Disqus