import {getList, getMessages} from './mod.ts'; import {getUsers} from '../vim-jpのuser情報をscrapbox_json_dataに変換/mod.ts'; import {getChannels} from '../vim-jpのchannel情報をscrapbox_json_dataに変換/mod.ts'; import {throttle} from 'https://scrapbox.io/api/code/takker/promise-parallel-throttle/script.js'; import {parse, getUnixTime} from 'https://deno.land/x/date_fns@v2.15.0/index.js'; const list = (await getList()); let counter = 0; const messages = (await throttle(list.map(({id, date, url}) => async () => { const index = ++counter; console.log(`[${index}/${list.length}] Start fetching...`); const messages = await getMessages(id, date, url); console.log(`[${index}/${list.length}] Fetched.`); return messages; }), {maxInProgress: 100})) .map(({messages, ...rest}) => ({ messages: messages.filter(({subtype}) => !subtype?.includes?.('channel')), ...rest, })) .filter(({messages}) => messages.length > 0); // scrapbox json dataに変換する const users = Object.fromEntries((await getUsers()).map(({id, name}) => [id, name])); const channels = await getChannels(); const messagePages = messages.map(({id, date, messages}) => { const channel = channels[id]; const title = `${channel} ${date}`; const updated = Math.round(Math.max(...messages.map(message => parseFloat(message.ts)))); const created = Math.round(Math.min(...messages.map(message => parseFloat(message.ts)))); return { title, updated, created, lines: [ title, ...messages.flatMap(message => { const username = users[message.user]; const lines = message.text?.split?.('\n') ?? []; const reactions = message.reactions?.map?.(reaction => { const emoji = `[/takker-vim-jp-emoji/${reaction.name}.icon]`; const userIcons = reaction.users.map(user => `[${users[user]}.icon]`).join(''); const count = reaction.count - reaction.users.length; return ` ${emoji}${userIcons}${count > 0 ? `+${count}` : ''}`; }) ?? []; return [ `[${username}.icon]${lines[0]}`, ...lines.slice(1).map(text => ` ${text}`), ...reactions, ]; }), '', `#${date}`, `#${channel}` ], } }); const pages = messagePages; // 2000件づつに分けて格納する const size = 2000; const maxChunk = Math.floor(pages.length / size) + 1; for (let i = 0; i < maxChunk; i++) { console.log(`[${i}/${maxChunk}] Writing a json file...`); await Deno.writeTextFile( `messages-${i}.json`, JSON.stringify({pages: pages.slice(i * size, (i + 1) * size)}) ); console.log(`[${i}/${maxChunk}] Wrote.`); } type Channel = { id: string; name: string; }; async function getChannels() { const res = await fetch('https://raw.githubusercontent.com/vim-jp/slacklog/log-data/slacklog_data/channels.json'); const channels = (await res.json()) as Channel[]; return Object.fromEntries(channels.map(({id, name}) => [id, name])); }