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 3567881..9141903 100644 --- a/lib/core.js +++ b/lib/core.js @@ -422,59 +422,79 @@ 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; + let refreshIntervalMinutes = parseInt(options.refreshInterval, 10); + if (!Number.isFinite(refreshIntervalMinutes) || refreshIntervalMinutes <= 0) { + refreshIntervalMinutes = 15; + } + 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, refreshIntervalMinutes * 60 * 1000); // complete rtm.start();