-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathindex.js
63 lines (59 loc) · 3.2 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
const { App } = require('@slack/bolt');
const parseDuration = require('parse-duration')
const app = new App({
token: process.env.HM_SLACK_BEARER_TOKEN,
signingSecret: process.env.HM_SLACK_SIGNING_SECRET
});
const sendMessage = process.env.HM_SEND_MESSAGE;
const archiveChannels = process.env.HM_ARCHIVE_CHANNELS;
const channelRegex = process.env.HM_CHANNEL_REGEX;
const lastMessageMaxAge = parseDuration(process.env.HM_LAST_MESSAGE_MAX_AGE);
console.log(`Archiving channels matching ${channelRegex} with no activity for ${lastMessageMaxAge}ms`);
const now = Date.now();
(async () => {
const channels = [];
const listOptions = {exclude_archived: true, types: "public_channel", limit: 200}
let result = await app.client.conversations.list(listOptions);
result.channels.forEach(c => channels.push(c));
while (result.response_metadata.next_cursor) {
console.log(`Fetched ${channels.length} channels so far, but there are more to fetch.`)
result = await app.client.conversations.list({...listOptions, cursor: result.response_metadata.next_cursor});
result.channels.forEach(c => channels.push(c));
}
const matchingChannels = channels.filter(c => c.name.match(channelRegex) != null);
console.log(`Found ${matchingChannels.length} matching channels.`);
await Promise.all(matchingChannels.map(async (c) => {
const channelName = `${c.name} (${c.id})`;
if (c.is_channel) {
if (!c.is_member) {
console.log(`Joining channel ${channelName}`);
await app.client.conversations.join({channel: c.id});
}
console.log(`Getting latest message from channel ${channelName}`);
const messages = await app.client.conversations.history({channel: c.id, limit: 2});
let lastMessage = messages.messages[0];
if (lastMessage.subtype === 'channel_join' && messages.messages.length > 1) {
// If the most recent message is someone joining, it might be us, so we look at the last but one message
lastMessage = messages.messages[1]
}
const lastMessageTs = lastMessage.ts * 1000; // we want ms precision
const lastMessageAge = now - lastMessageTs;
if (lastMessageAge > lastMessageMaxAge) {
console.log(`In channel ${channelName}, the last message is ${lastMessageAge}ms old (max age = ${lastMessageMaxAge}ms)`);
if (sendMessage === 'true') {
console.log(`Sending message to channel ${channelName}`);
await app.client.chat.postMessage({
channel: c.id,
text: `I am archiving #${c.name} because it has been inactive for a while. Please unarchive the channel and reach out to my owner if this was a mistake!`
})
}
if (archiveChannels === 'true') {
console.log(`Archiving channel ${channelName}`);
await app.client.conversations.archive({channel: c.id});
}
} else {
console.log(`Not doing anything with ${channelName}, as there is still recent activity`)
}
}
}));
})();