a fun bot for the hc slack
1import type { PeriodType, TimePeriod } from "../features/takes/types";
2import TakesConfig from "./config";
3
4export function calculateElapsedTime(periods: TimePeriod[]): number {
5 return Math.min(
6 periods.reduce((total, period) => {
7 if (period.type !== "active") return total;
8
9 const endTime = period.endTime || Date.now();
10 return total + (endTime - period.startTime);
11 }, 0),
12 TakesConfig.DEFAULT_SESSION_LENGTH * 60 * 1000,
13 );
14}
15
16export function addNewPeriod(
17 periodsString: string,
18 type: PeriodType,
19): TimePeriod[] {
20 const periods = JSON.parse(periodsString);
21
22 // Close previous period if exists
23 if (periods.length > 0) {
24 const lastPeriod = periods[periods.length - 1];
25 if (!lastPeriod.endTime) {
26 lastPeriod.endTime = Date.now();
27 }
28 }
29
30 // Add new period
31 periods.push({
32 type,
33 startTime: Date.now(),
34 endTime: null,
35 });
36
37 return periods;
38}
39
40export function getRemainingTime(
41 targetDurationMs: number,
42 periods: string,
43): {
44 remaining: number;
45 endTime: Date;
46} {
47 const elapsedMs = calculateElapsedTime(JSON.parse(periods));
48 const remaining = Math.max(0, targetDurationMs - elapsedMs);
49 const endTime = new Date(Date.now() + remaining);
50 return { remaining, endTime };
51}
52
53export function getPausedTimeRemaining(periods: string): number {
54 const parsedPeriods = JSON.parse(periods);
55 const currentPeriod = parsedPeriods[parsedPeriods.length - 1];
56
57 if (currentPeriod.type !== "paused" || !currentPeriod.startTime) {
58 return 0;
59 }
60
61 const now = new Date();
62 const pausedDuration = now.getTime() - currentPeriod.startTime;
63
64 return Math.max(
65 0,
66 TakesConfig.MAX_PAUSE_DURATION * 60 * 1000 - pausedDuration,
67 );
68}
69
70export function getPausedDuration(periods: string): number {
71 const parsedPeriods = JSON.parse(periods);
72 return parsedPeriods.reduce((total: number, period: TimePeriod) => {
73 if (period.type !== "paused") return total;
74
75 const endTime = period.endTime || Date.now();
76 return total + (endTime - period.startTime);
77 }, 0);
78}