From 1ab62432050c403d48a06f42d73f90433ec0d1a6 Mon Sep 17 00:00:00 2001 From: Hideaki Terai Date: Sat, 10 Jan 2026 20:59:03 +0900 Subject: [PATCH 1/2] Refresh Slack metadata every 15 minutes --- lib/core.js | 104 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 60 insertions(+), 44 deletions(-) diff --git a/lib/core.js b/lib/core.js index 3567881..d7ad9ca 100644 --- a/lib/core.js +++ b/lib/core.js @@ -422,59 +422,75 @@ core.start = async (commander) => { const {WebClient} = require("@slack/client"); const web = new WebClient(token, {logLevel: "error"}); - let response = await web.conversations.list({ - limit:1000, - types: "public_channel,private_channel,im,mpim" - }); + let isRefreshing = false; + const refreshSlackData = async () => { + if (isRefreshing) { + return; + } + isRefreshing = true; + try { + let response = await web.conversations.list({ + limit:1000, + types: "public_channel,private_channel,im,mpim" + }); - response.channels.forEach((v, i) => { - v.color = colors[i % colors.length]; - util.channels[v.id] = v; - }); + response.channels.forEach((v, i) => { + v.color = colors[i % colors.length]; + util.channels[v.id] = v; + }); - while(response.response_metadata.next_cursor != "") { - response = await web.conversations.list({ - limit: 1000, - types: "public_channel,private_channel,im,mpim", - cursor: response.response_metadata.next_cursor - }); + while(response.response_metadata.next_cursor != "") { + response = await web.conversations.list({ + limit: 1000, + types: "public_channel,private_channel,im,mpim", + cursor: response.response_metadata.next_cursor + }); - response.channels.forEach((v, i) => { - v.color = colors[i % colors.length]; - util.channels[v.id] = v; - }); - } + response.channels.forEach((v, i) => { + v.color = colors[i % colors.length]; + util.channels[v.id] = v; + }); + } - response = await web.users.list(); - - if (response.members && Array.isArray(response.members)) { - response.members.forEach((v, i) => { - v.color = colors[i % colors.length]; - // nameプロパティが存在しない場合の代替案を追加 - if (!v.name) { - v.name = v.real_name || (v.profile && v.profile.display_name) || v.id; + response = await web.users.list(); + + if (response.members && Array.isArray(response.members)) { + response.members.forEach((v, i) => { + v.color = colors[i % colors.length]; + // nameプロパティが存在しない場合の代替案を追加 + if (!v.name) { + v.name = v.real_name || (v.profile && v.profile.display_name) || v.id; + } + util.users[v.id] = v; + }); } - util.users[v.id] = v; - }); - } - while(response.response_metadata && response.response_metadata.next_cursor != "") { - response = await web.users.list({ - limit: 1000, - cursor: response.response_metadata.next_cursor - }); + while(response.response_metadata && response.response_metadata.next_cursor != "") { + response = await web.users.list({ + limit: 1000, + cursor: response.response_metadata.next_cursor + }); - if (response.members && Array.isArray(response.members)) { - response.members.forEach((v, i) => { - v.color = colors[i % colors.length]; - // nameプロパティが存在しない場合の代替案を追加 - if (!v.name) { - v.name = v.real_name || (v.profile && v.profile.display_name) || v.id; + if (response.members && Array.isArray(response.members)) { + response.members.forEach((v, i) => { + v.color = colors[i % colors.length]; + // nameプロパティが存在しない場合の代替案を追加 + if (!v.name) { + v.name = v.real_name || (v.profile && v.profile.display_name) || v.id; + } + util.users[v.id] = v; + }); } - util.users[v.id] = v; - }); + } + } catch (error) { + console.error("Failed to refresh Slack metadata:", error.message || error); + } finally { + isRefreshing = false; } - } + }; + + await refreshSlackData(); + setInterval(refreshSlackData, 15 * 60 * 1000); // complete rtm.start(); From 297b24c5326776fc02f98cfc66a8c33ae52a85c5 Mon Sep 17 00:00:00 2001 From: Hideaki Terai Date: Sat, 10 Jan 2026 21:00:13 +0900 Subject: [PATCH 2/2] Add metadata refresh interval option --- bin/slack-cli-stream | 2 +- lib/core.js | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/bin/slack-cli-stream b/bin/slack-cli-stream index e374269..64c298c 100644 --- a/bin/slack-cli-stream +++ b/bin/slack-cli-stream @@ -21,6 +21,7 @@ program .option("-h, --hook", "Enable realtime messaging hook.") .option("-l, --log ", "Specify the log file path") .option("--no-log", "Do not record logs") + .option("--refresh-interval ", "Refresh Slack metadata interval in minutes (default: 15)") .usage("[options] ") .parse(process.argv); @@ -31,4 +32,3 @@ if (program.rawArgs.length == 2) { } core.start(program); - diff --git a/lib/core.js b/lib/core.js index d7ad9ca..9141903 100644 --- a/lib/core.js +++ b/lib/core.js @@ -423,6 +423,10 @@ core.start = async (commander) => { const web = new WebClient(token, {logLevel: "error"}); let isRefreshing = false; + let refreshIntervalMinutes = parseInt(options.refreshInterval, 10); + if (!Number.isFinite(refreshIntervalMinutes) || refreshIntervalMinutes <= 0) { + refreshIntervalMinutes = 15; + } const refreshSlackData = async () => { if (isRefreshing) { return; @@ -490,7 +494,7 @@ core.start = async (commander) => { }; await refreshSlackData(); - setInterval(refreshSlackData, 15 * 60 * 1000); + setInterval(refreshSlackData, refreshIntervalMinutes * 60 * 1000); // complete rtm.start();