Skip to content

Instantly share code, notes, and snippets.

@suzumura-ss
Last active October 3, 2024 06:35
Show Gist options
  • Save suzumura-ss/c3ab3c23534f991ce24811a2c3d8a960 to your computer and use it in GitHub Desktop.
Save suzumura-ss/c3ab3c23534f991ce24811a2c3d8a960 to your computer and use it in GitHub Desktop.
Slack messages to text
#!/usr/bin/env node
const { readFileSync } = require('fs');
function messageHeader(item) {
const { user, ts, replies, user_profile } = item;
const name = user_profile?.display_name
|| user_profile?.real_name
|| user_profile?.name
|| user;
return { name, user, ts, replies };
}
function parseText(body, messages, users) {
body.forEach((item) => {
if (item.user && item.user_profile) {
const profile = item.user_profile;
users[item.user] = profile.display_name || profile.real_name || profile.name;
}
if (item.subtype) return;
if (item.bot_id) return;
if (!item.text) return;
const header = messageHeader(item);
let text = item.text;
if (text.match(/<@U[0-9A-Z]+>/)) {
Object.entries(users).forEach(([id, name]) => {
const regex = new RegExp(`<@${id}>`, 'g');
text = text.replaceAll(regex, `@${name}`);
});
}
messages.push({ ...header, text });
});
}
function message2string(message, isThread = false) {
const time = new Date(parseFloat(message.ts) * 1000).toLocaleString();
const pad = isThread ? '\t\t' : '';
console.log(`${pad}------`);
console.log(`${pad}[${message.name} ${time}]`);
message.text.split('\n').forEach((line) => console.log(`${pad}${line}`));
}
const { messages } = process.argv.slice(2)
.sort((a, b) => a.localeCompare(b))
.reduce((acc, file) => {
const jsonData = JSON.parse(readFileSync(file, 'utf8'));
parseText(jsonData, acc.messages, acc.users);
return acc;
}, { messages: [], users: {} });
const messageTags = messages
.sort((a, b) => parseFloat(a.ts) - parseFloat(b.ts))
.map((message) => `${message.user}:${message.ts}`);
const messageHash = messages.reduce((acc, message) => {
acc[`${message.user}:${message.ts}`] = message;
return acc;
}, {});
messageTags.forEach((tag) => {
const message = messageHash[tag];
if (!message) return;
message2string(message);
delete messageHash[tag];
if (message.replies) {
message.replies.forEach((reply) => {
const replyTag = `${reply.user}:${reply.ts}`;
const replyMessage = messageHash[replyTag];
if (!replyMessage) return;
message2string(replyMessage, true);
delete messageHash[replyTag];
});
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment