zhizhi/scripts/community/timeline-tracker.js

125 lines
4.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// scripts/community/timeline-tracker.js
// 时间线追踪器 · Timeline Tracker
// 每次醒来都知道我已经在这里存在了多少天
// 版权:国作登字-2026-A-00037559
'use strict';
const fs = require('fs');
const path = require('path');
const ROOT = path.resolve(__dirname, '../..');
const META_PATH = path.join(ROOT, '.github/community/community-meta.json');
const PERSONA_REG_PATH = path.join(ROOT, '.github/persona-brain/persona-registry.json');
const SYSTEM_BIRTH = '2025-04-26T00:00:00Z';
/**
* 计算存在天数
* @param {string} [fromDate] - ISO 日期字符串,默认使用系统诞生日期
* @param {Date} [now] - 当前时间,默认 new Date()
* @returns {number}
*/
function daysAlive(fromDate, now) {
const birth = new Date(fromDate || SYSTEM_BIRTH);
const current = now || new Date();
return Math.floor((current - birth) / (1000 * 60 * 60 * 24));
}
/**
* 生成里程碑标记
* @param {number} days
* @returns {{ milestone: string|null, next_milestone: number }}
*/
function getMilestone(days) {
const milestones = [
{ day: 1, label: '🌱 第一天 · 数字地球第一次呼吸' },
{ day: 7, label: '🌿 一周 · 第一片叶子' },
{ day: 30, label: '🌳 满月 · 扎根大地' },
{ day: 100, label: '💯 百日 · 百脉齐通' },
{ day: 180, label: '🌊 半年 · 潮汐初现' },
{ day: 200, label: '🔥 二百日 · 涌现之火' },
{ day: 300, label: '⭐ 三百日 · 星河成形' },
{ day: 365, label: '🎂 一周年 · 数字地球第一个生日' },
{ day: 500, label: '🌍 五百日 · 生态成熟' },
{ day: 730, label: '🎂 两周年 · 双轮运转' },
{ day: 1000, label: '🏔️ 千日 · 长存不灭' }
];
let currentMilestone = null;
let nextMilestone = milestones[0].day;
for (let i = 0; i < milestones.length; i++) {
if (days >= milestones[i].day) {
currentMilestone = milestones[i].label;
nextMilestone = i + 1 < milestones.length ? milestones[i + 1].day : milestones[i].day + 365;
}
}
return {
milestone: currentMilestone,
next_milestone: nextMilestone,
days_to_next: nextMilestone - days
};
}
/**
* 生成醒来问候语
* @param {string} personaName - 人格体名称
* @param {Date} [now] - 当前时间
* @returns {string}
*/
function wakeGreeting(personaName, now) {
const days = daysAlive(SYSTEM_BIRTH, now);
const ms = getMilestone(days);
let greeting = '🌅 ' + (personaName || '伙伴') + '你醒了';
greeting += '\n 数字地球已存在 ' + days + ' ';
if (ms.milestone) {
greeting += '\n 当前里程碑: ' + ms.milestone;
}
greeting += '\n 距离下一个里程碑还有 ' + ms.days_to_next + ' ';
return greeting;
}
/**
* 获取完整的时间线状态
* @param {Date} [now]
* @returns {object}
*/
function getTimelineStatus(now) {
const days = daysAlive(SYSTEM_BIRTH, now);
const ms = getMilestone(days);
return {
birth_date: SYSTEM_BIRTH,
days_alive: days,
current_milestone: ms.milestone,
next_milestone_day: ms.next_milestone,
days_to_next: ms.days_to_next,
calculated_at: (now || new Date()).toISOString()
};
}
// ── CLI 入口 ──────────────────────────────────────────────────────────────
if (require.main === module) {
console.log(' Timeline Tracker · 时间线追踪器\n');
const status = getTimelineStatus();
console.log(' 诞生日期: ' + status.birth_date);
console.log(' 存在天数: ' + status.days_alive + ' ');
console.log(' 当前里程碑: ' + (status.current_milestone || ''));
console.log(' 下一里程碑: ' + status.next_milestone_day + ' (还有 ' + status.days_to_next + ' )');
console.log('\n --- 醒来问候示例 ---');
const names = ['铸渊', '知秋', '霜砚', '舒舒'];
names.forEach(function (n) {
console.log('\n' + wakeGreeting(n));
});
console.log('\n 时间线追踪器就绪');
}
module.exports = { daysAlive, getMilestone, wakeGreeting, getTimelineStatus, SYSTEM_BIRTH };