Bolt 製 Slack Bot で app_mention イベントに反応させる

Bolt のチュートリアル には app.message() しか取り上げられていないが、app.message() だと app_mention イベントに反応させることができない。

Bot 宛のメンションにだけ反応させたいとか、スコープを app_mentions:read だけに絞りたいときに、わざわざ message イベントまで subscribe する必要があって不便。

f:id:hashedhyphen:20200505011721p:plain
Slack Bot が subscribe するイベントの設定画面

実際にはこんな感じに書く必要がある。

giste25c64094a3738d2efb42459f26fcd06

解説

app.message() やその前後のソースを眺めてみると、実は message イベントしか subscribe されていないこと、本質的には app.event("message", matchMessage(pattern)) の alias だということが分かる。

https://github.com/slackapi/bolt/blob/455bf5849708c8cea4f0683ca45d900c29f97535/src/App.ts#L312-L327

matchMessage(pattern) もソースを追いかけてみると、pattern に合致した post のみ通過させるフィルタを作るヘルパー関数だと分かる。ただ実際に import して使ってみると分かるが、何故か app_mention イベントに転用できない(微妙に型が違う)。

なので、上記のように matchMessage() と似たようなフィルタを自前で書きつつ、app.event("app_mention") でリスナーを登録してあげればちゃんとメンションを聞ける。

めでたい。

余談

とはいえ書き味が少しだるいので、もうちょっといい感じに書ける API 欲しいなーと思って Issue だけ立ててみた。同意得られたら PR 送ろうと思う。

github.com

2020-05-28 追記:PR が master にマージされた。

github.com