habit+timer

This commit is contained in:
kankys committed 2026-08-16 21:13:50 +02:00
1 parent 6356981825
commit f19af63d91
31 files changed
+2767 -106

No files matched your search

+86
View File
@@ -0,0 +1,86 @@
package main
import (
"encoding/json"
"fmt"
"os"
"path/filepath"
"time"
)
// TimerStats holds persistent statistics and settings
type TimerStats struct {
TotalPomodoros int `json:"total_pomodoros"`
TodayPomodoros int `json:"today_pomodoros"`
LastDate string `json:"last_date"`
FocusDuration int `json:"focus_duration"` // minutes
ShortBreak int `json:"short_break"` // minutes
LongBreak int `json:"long_break"` // minutes
LongBreakAfter int `json:"long_break_after"` // after how many pomodoros
}
func getStoragePath() string {
home, err := os.UserHomeDir()
if err != nil {
return "doxa_timer.json"
}
configDir := filepath.Join(home, ".doxa-timer")
if _, err := os.Stat(configDir); os.IsNotExist(err) {
os.MkdirAll(configDir, 0755)
}
return filepath.Join(configDir, "doxa_timer.json")
}
func loadStats() TimerStats {
path := getStoragePath()
file, err := os.ReadFile(path)
if err != nil {
return defaultStats()
}
var stats TimerStats
if err := json.Unmarshal(file, &stats); err != nil {
return defaultStats()
}
// Reset today's count if it's a new day
today := time.Now().Format("2006-01-02")
if stats.LastDate != today {
stats.TodayPomodoros = 0
stats.LastDate = today
}
// Ensure sane defaults if values are zero
if stats.FocusDuration == 0 {
stats.FocusDuration = 25
}
if stats.ShortBreak == 0 {
stats.ShortBreak = 5
}
if stats.LongBreak == 0 {
stats.LongBreak = 15
}
if stats.LongBreakAfter == 0 {
stats.LongBreakAfter = 4
}
return stats
}
func saveStats(stats TimerStats) {
path := getStoragePath()
data, err := json.MarshalIndent(stats, "", " ")
if err != nil {
fmt.Println("Chyba při ukládání dat:", err)
return
}
os.WriteFile(path, data, 0644)
}
func defaultStats() TimerStats {
return TimerStats{
TotalPomodoros: 0,
TodayPomodoros: 0,
LastDate: time.Now().Format("2006-01-02"),
FocusDuration: 25,
ShortBreak: 5,
LongBreak: 15,
LongBreakAfter: 4,
}
}