c49b10e11d
Add all 11 Telegraf command handler files (tasks 12–16): log, skip, status, history, streak, snooze, settings-cmd, progress, next, reschedule, chat, and setup (including multi-step onboarding flow). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
35 lines
1.0 KiB
TypeScript
35 lines
1.0 KiB
TypeScript
import type { Context } from 'telegraf';
|
|
import type { Database } from 'better-sqlite3';
|
|
|
|
function getStreaks(db: Database): { current: number; longest: number } {
|
|
const rows = db.prepare(
|
|
"SELECT date FROM schedule WHERE status = 'completed' ORDER BY date ASC"
|
|
).all() as Array<{ date: string }>;
|
|
|
|
if (rows.length === 0) return { current: 0, longest: 0 };
|
|
|
|
let current = 1, longest = 1, streak = 1;
|
|
|
|
for (let i = 1; i < rows.length; i++) {
|
|
const prev = new Date(rows[i - 1]!.date + 'T12:00:00');
|
|
const curr = new Date(rows[i]!.date + 'T12:00:00');
|
|
const diff = Math.round((curr.getTime() - prev.getTime()) / 86400000);
|
|
if (diff <= 2) {
|
|
streak++;
|
|
if (streak > longest) longest = streak;
|
|
} else {
|
|
streak = 1;
|
|
}
|
|
}
|
|
|
|
current = streak;
|
|
return { current, longest };
|
|
}
|
|
|
|
export function handleStreak(db: Database) {
|
|
return async (ctx: Context) => {
|
|
const { current, longest } = getStreaks(db);
|
|
await ctx.reply(`🔥 Current streak: ${current} sessions\n🏆 Longest streak: ${longest} sessions`);
|
|
};
|
|
}
|