開発環境
- nodejs12.x
- @slack/bolt": "^2.0.1"
やりたいこと
メッセージやモーダルのやりとりを、
「やりとりの発生したユーザーが居る部屋」という具合に可変にして送りたい。
command
などの場合
body.channel_name
に送信してきたユーザーのチャンネル名が入っているので楽勝。
これをチャンネル指定箇所に引数として渡してあげればOK。
app.command('/aq-help', async ({ ack, body, client }) => {
await ack()
try {
const result = await client.chat.postEphemeral({
channel: body.channel_name, // ここ
user: body.user_id,
blocks: [
{
// omit
モーダルListen時(本題)
これが結構大変だった。
bodyにチャンネルの情報が入っていない。
リファレンスを漁ってもどこにもない!!
色々調べると、
speeeさんの開発している@speee-js/jsx-slackというライブラリを発見。
これはboltのblockをJSXで記述できるという素敵なライブラリだが、不思議な記述を発見。
<Modal title="modal">
<Input type="hidden" name="foo" value="bar" />
<Input type="hidden" name="userId" value={123} />
hiddenだって!?
そんな機能デフォルトでなかったぞ...!🤯
と、色々調べているとどうも private_metadata
という機能を使用して実現している模様。
完全にリファレンス読み落としてた...
見ての通りデータ型がStringで文字数制限があるので要注意。
送信時に取得した body.channel_name
をここに入れてあげます。
app.command('/aq-register', async ({ ack, body, client }) => {
const result = await client.views.open({
trigger_id: body.trigger_id,
private_metadata: body.channel_name, // ここにデータを入れる
callback_id: 'register',
// 略
// モーダルListen側
app.view('register', async ({ ack, body, view, client }) => {
await ack()
/**
* メッセージ送信
*/
try {
await client.chat.postMessage({
channel: view.private_metadata, // ここでprivate_metadataを使用
blocks: [
// 略
まとめ
チャンネル名だけではなく、おそらくprivate_metadata
を駆使すれば送信してきたユーザ情報なども同様に取得できるものと思われます。
なぜStringなんだ。。。。