Bolt 製 Slack Bot で app_mention イベントに反応させる
Bolt のチュートリアル には app.message()
しか取り上げられていないが、app.message()
だと app_mention
イベントに反応させることができない。
Bot 宛のメンションにだけ反応させたいとか、スコープを app_mentions:read
だけに絞りたいときに、わざわざ message
イベントまで 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 送ろうと思う。
2020-05-28 追記:PR が master にマージされた。