📣

Mattermostで投票機能もどき

2021/06/19に公開

(2017/4/4 Golang Driver についての記述を追加しました)

はじめに

Mattermost のスラッシュコマンドで簡単に投票メッセージを作成できるアプリを作りました。
kaakaa/matterpoll-emoji: Poll server for Mattermost

Mattermost でpollというスラッシュコマンドを作り、下記のようにコマンドを実行

/poll `What do you gys wanna grab for lunch?` :pizza: :sushi: :fried_shrimp: :spaghetti: :apple:

すると、下記のような投票メッセージを投稿してくれます。
matterpoll-emoji.png

べんり。

Bot に定期的に出欠確認メッセージを呟かせるなどすると良いかと思います。
Mattermost v3.7 で動作確認しています。

使い方

  1. git cloneする
  2. config.jsonを書く
  3. matterpoll-emoji を起動する
  4. Mattermost でカスタムスラッシュコマンドを作成する
  5. スラッシュコマンドを実行する

です。
詳細はREADMEを参照ください。

問題

  • Mattermost では 0 票の Reaction を付けられないため、必ず最初に一票は入った状態になってしまう
    • Bot アカウント作成推奨です
  • Mattermost API Version4 未対応
    • API v4 はまだ β バージョンなので、API v3 で作っています。2017/9 月に API v3 が使えなくなるので、それまでに API v4 に対応する必要があります。

スラッシュコマンドについて

Marrermost で/で始まる投稿はスラッシュコマンドだと解釈されます。
Mattermost の投稿画面で/を入力すると、内臓スラッシュコマンドの一覧が表示されます。

slash_command.png

カスタムスラッシュコマンド

ユーザー独自のスラッシュコマンドを作成することもできます。
システムコンソールでカスタムスラッシュコマンドを有効にし、統合機能からスラッシュコマンドを作成できます。

システムコンソール.png

統合機能.png

リクエスパラメータ

Mattermost のスラッシュコマンド実行時に送られるリクエストパラメーターは下記になります。

Creating Integrations with Commands

  1. Your integration should have a function for receiving HTTP POSTs or GETs from Mattermost that look like this example:
Content-Length: 244
User-Agent: Go 1.1 package http
Host: localhost:5000
Accept: application/json
Content-Type: application/x-www-form-urlencoded

channel_id=cniah6qa73bjjjan6mzn11f4ie&
channel_name=town-square&
command=/somecommand&
response_url=not+supported+yet&
team_domain=someteam&
team_id=rdc9bgriktyx9p4kowh3dmgqyc&
text=hello+world&
token=xr3j5x3p4pfk7kk6ck7b4e6ghh&
user_id=c3a4cqe3dfy6dgopqt8ai3hydh&
user_name=somename

---

BodyがURLパラメータ形式で送られてくるので、今回作った`matterpoll-emoji`ではダミーのURLのURLパラメータとして結合し、Goの`url`パッケージで解析する方法を取っています。
[poll_request.go#18](https://github.com/kaakaa/matterpoll-emoji/blob/master/poll/poll_request.go#L18)

### レスポンスパラメータ

[Creating Integrations with Commands](https://docs.mattermost.com/developer/slash-commands.html#creating-integrations-with-commands)

リクエストを受け取ったサーバーは、下記のような`application/json`形式の情報を返す必要があります。

> 3 . If you want your integration to post a message back to the same channel, it can respond to the HTTP POST request from Mattermost with a JSON response body similar to this example:
>
> ```
{
  "response_type": "in_channel",
  "text": "This is some response text.",
  "username": "robot",
  "icon_url": "https://www.mattermost.org/wp-content/uploads/2016/04/icon.png"
}

response_typein_channelの場合、普通の投稿と同じように投稿が作成されます。ephemeralを設定した場合はシステムメッセージのような、スラッシュコマンドを実行した人にしか見えない投稿が作られます。

textには Mattermost に投稿するメッセージテキストを指定しますが、Mattermost での投稿と同じように Markdown や Emoji を利用することができます。

usernameicon_urlは投稿のユーザー名とアイコンを上書きするオプション情報です。

Golang Driver

本来、スラッシュコマンドからリクエストされるサーバーの処理は、上記のレスポンスパラメータを返す形になりますが、それでは投稿に Reaction を付けることなどができないためmatterpoll-emojiではGolang Driverを利用して投稿の作成・Reaction の付与をしています。

model.NewClientによって生成される client オブジェクトに投稿、ユーザー、チャンネルなどに対する操作が定義されています。

matterpoll-emojiでは Golang Driver のログイン、投稿、リアクションの操作を利用しています

開発の背景

弊社では週に一回ゆるい感じで勉強会を行っているのですが、人数があまり多くないため、聴講者が0人の日があるかもしれないという恐怖に常にさらされています。Mattermost や Wiki などで出席・欠席などを報告できる場はあるのです、毎週の報告など面倒であるため報告機能がうまく回っているとは言えず。「ちゃんと出欠入力しましょう」なんて言うのも野暮。

そんな時、Mattermost v3.6 でEmoji リアクションの機能が追加され、Slack のように投稿に絵文字でのリアクションを付けることができるようになりました。これを使って、毎週勉強会の日に Bot に出欠確認メッセージを投稿させれば出欠登録も確認も楽になるのではないか、というのがきっかけです。

また、投票機能は Mattermost の Feature Idea でも人気の高い機能であるため、なるべくにいろいろな用途で使えるようにしました。Polls (like doodle or for decision making) – Mattermost Feature Proposal Forum

結果

前回の勉強会出席者は一人でした。
0 人回避。やったね。

Discussion