Mattermostで投票機能もどき
(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:
すると、下記のような投票メッセージを投稿してくれます。
べんり。
Bot に定期的に出欠確認メッセージを呟かせるなどすると良いかと思います。
Mattermost v3.7 で動作確認しています。
使い方
-
git clone
する -
config.json
を書く - matterpoll-emoji を起動する
- Mattermost でカスタムスラッシュコマンドを作成する
- スラッシュコマンドを実行する
です。
詳細はREADMEを参照ください。
問題
- Mattermost では 0 票の Reaction を付けられないため、必ず最初に一票は入った状態になってしまう
- Bot アカウント作成推奨です
- Mattermost API Version4 未対応
- API v4 はまだ β バージョンなので、API v3 で作っています。2017/9 月に API v3 が使えなくなるので、それまでに API v4 に対応する必要があります。
スラッシュコマンドについて
Marrermost で/
で始まる投稿はスラッシュコマンドだと解釈されます。
Mattermost の投稿画面で/
を入力すると、内臓スラッシュコマンドの一覧が表示されます。
カスタムスラッシュコマンド
ユーザー独自のスラッシュコマンドを作成することもできます。
システムコンソールでカスタムスラッシュコマンドを有効にし、統合機能からスラッシュコマンドを作成できます。
リクエスパラメータ
Mattermost のスラッシュコマンド実行時に送られるリクエストパラメーターは下記になります。
Creating Integrations with Commands
- 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_type
がin_channel
の場合、普通の投稿と同じように投稿が作成されます。ephemeral
を設定した場合はシステムメッセージのような、スラッシュコマンドを実行した人にしか見えない投稿が作られます。
text
には Mattermost に投稿するメッセージテキストを指定しますが、Mattermost での投稿と同じように Markdown や Emoji を利用することができます。
username
とicon_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