Files
wechat-radar/lib/demo-data.ts
T
2026-05-24 13:42:56 +08:00

80 lines
3.7 KiB
TypeScript

import { db } from './db';
import { writeConfig } from './config';
const GROUPS = [
{ id: 'demo-ai@chatroom', name: 'AI 产品讨论群' },
{ id: 'demo-coding@chatroom', name: 'Vibe Coding 交流群' },
{ id: 'demo-tools@chatroom', name: '效率工具分享群' },
{ id: 'demo-business@chatroom', name: 'AI 商业增长群' },
{ id: 'demo-life@chatroom', name: '生活与阅读群' },
];
const SENDERS = ['Alex', 'Ming', 'Luna', 'Kai', 'River', 'Yuki', 'Chen'];
const CONTENTS = [
'有没有适合团队知识库的 AI 工具?最好支持飞书和 Notion,同步成本低一点。',
'实测 Codex 处理中型前端改版很稳,关键是先给它足够清楚的验收标准。',
'分享一个开源项目 https://github.com/example/agent-workflow 可以把多 Agent 编排可视化。',
'这篇文章值得读:AI Agent 落地为什么卡在组织流程 https://mp.weixin.qq.com/s/demo-agent-org',
'下周有一个 AI 工具内测名额,想找 20 个真实团队试用,感兴趣可以报名。',
'GEO 和 SEO 的差别今天讨论很多,核心不是关键词,而是结构化证据和可信来源。',
'有没有人熟悉 Chrome Extension 上架流程?需要一个 checklist。',
'@你的微信名 这个话题你可能有经验:如何把群聊素材整理成公众号选题?',
'新的语音转文字工具体验不错 https://example.com/voice-note 支持批量导出 Markdown。',
'今天最值得关注的是 AI 工具开始从个人效率走向团队工作流。',
];
function ymd(d: Date) {
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
}
export function seedDemoData() {
const database = db();
const now = new Date();
const insertMessage = database.prepare(`
INSERT OR IGNORE INTO messages
(chatroom_id, local_id, sender, content, time, timestamp, type, date)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
`);
const insertStats = database.prepare(`
INSERT INTO daily_stats (chatroom_id, date, total, top_senders, by_hour, refreshed_at)
VALUES (?, ?, ?, ?, ?, ?)
ON CONFLICT(chatroom_id, date) DO UPDATE SET
total = excluded.total,
top_senders = excluded.top_senders,
by_hour = excluded.by_hour,
refreshed_at = excluded.refreshed_at
`);
database.transaction(() => {
for (let dayOffset = 0; dayOffset < 14; dayOffset++) {
const d = new Date(now);
d.setDate(now.getDate() - dayOffset);
const date = ymd(d);
for (let gi = 0; gi < GROUPS.length; gi++) {
const group = GROUPS[gi];
const count = Math.max(8, 42 - dayOffset * 2 + gi * 5);
const byHour = Array.from({ length: 24 }, (_, hour) => ({ hour, count: hour >= 9 && hour <= 23 ? Math.floor(count / 15) + ((hour + gi) % 3) : 0 }));
const topSenders = SENDERS.slice(0, 3).map((sender, index) => ({ sender, count: Math.max(1, Math.floor(count / (index + 2))) }));
insertStats.run(group.id, date, count, JSON.stringify(topSenders), JSON.stringify(byHour), Date.now());
for (let i = 0; i < Math.min(count, 18); i++) {
const localId = dayOffset * 10000 + gi * 1000 + i + 1;
const hour = 9 + ((i + gi) % 12);
const minute = (i * 7) % 60;
const time = `${date} ${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}:00`;
const timestamp = Math.floor(new Date(time).getTime() / 1000);
insertMessage.run(group.id, localId, SENDERS[(i + gi) % SENDERS.length], CONTENTS[(i + gi + dayOffset) % CONTENTS.length], time, timestamp, 'text', date);
}
}
}
})();
writeConfig({
demoMode: true,
setupCompleted: true,
privacyConfirmed: true,
myNicknames: ['你的微信名'],
});
return { groups: GROUPS.length, days: 14 };
}