Last active
October 3, 2024 06:35
-
-
Save suzumura-ss/c3ab3c23534f991ce24811a2c3d8a960 to your computer and use it in GitHub Desktop.
Slack messages to text
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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