From c1f8cbd2f5e16eade2f0d9ef0a16f31076a318b1 Mon Sep 17 00:00:00 2001 From: trafficlunar Date: Thu, 24 Jul 2025 11:46:11 +0100 Subject: [PATCH] feat: computer data uptime total --- internal/handler/computer.go | 24 +++++++++++++++++++++++- internal/model/computer.go | 1 + internal/service/computer.go | 10 +++++++++- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/internal/handler/computer.go b/internal/handler/computer.go index df7370a..420bc81 100644 --- a/internal/handler/computer.go +++ b/internal/handler/computer.go @@ -22,20 +22,24 @@ var upgrader = websocket.Upgrader{ } func HandleComputerWebSocket(w http.ResponseWriter, r *http.Request) { + // Check if user is authorized if r.Header.Get("Authorization") != os.Getenv("WEBSOCKET_PASSWORD") { w.WriteHeader(http.StatusUnauthorized) w.Write([]byte("Unauthorized")) return } + // Upgrade to WebSocket connection conn, err := upgrader.Upgrade(w, r, nil) if err != nil { - slog.Error("Error when upgrading websocket connection", slog.Any("error", err)) + slog.Error("Error when upgrading WebSocket connection", slog.Any("error", err)) return } defer conn.Close() slog.Info("WebSocket connection established") + + // Mark computer online and record the start time for uptime tracking service.ComputerData.Online = true service.ComputerData.UptimeStart = int(time.Now().Unix()) @@ -43,7 +47,23 @@ func HandleComputerWebSocket(w http.ResponseWriter, r *http.Request) { _, message, err := conn.ReadMessage() if err != nil { slog.Error("WebSocket connection closed by client", slog.Any("error", err)) + + // Mark computer offline service.ComputerData.Online = false + + // Calculate uptime + sessionUptime := int(time.Now().Unix()) - service.ComputerData.UptimeStart + + totalUptimeData := storage.GlobalDataStore.Get("uptime") + var totalUptime float64 + if totalUptimeData != nil { + totalUptime = totalUptimeData.(float64) + } + + // Add to totals + service.ComputerData.Totals.Uptime = totalUptime + float64(sessionUptime) + storage.GlobalDataStore.Set("uptime", service.ComputerData.Totals.Uptime) + service.ComputerData.UptimeStart = 0 break } @@ -64,6 +84,7 @@ func HandleComputerWebSocket(w http.ResponseWriter, r *http.Request) { var keys float64 var clicks float64 + // Convert values (if any) to float64 if keysData != nil { keys = keysData.(float64) } @@ -71,6 +92,7 @@ func HandleComputerWebSocket(w http.ResponseWriter, r *http.Request) { clicks = clicksData.(float64) } + // Add counts from current message to the totals storage.GlobalDataStore.Set("keys", keys+float64(clientMessage.Keys)) storage.GlobalDataStore.Set("clicks", clicks+float64(clientMessage.Clicks)) diff --git a/internal/model/computer.go b/internal/model/computer.go index 0bd95c9..cd36523 100644 --- a/internal/model/computer.go +++ b/internal/model/computer.go @@ -17,6 +17,7 @@ type ComputerData struct { } type ComputerTotals struct { + Uptime float64 `json:"uptime"` Keys float64 `json:"keys"` Clicks float64 `json:"clicks"` } diff --git a/internal/service/computer.go b/internal/service/computer.go index ca283b3..e60be44 100644 --- a/internal/service/computer.go +++ b/internal/service/computer.go @@ -7,8 +7,10 @@ import ( ) var ComputerData model.ComputerData = model.ComputerData{ - Online: false, + Online: false, + UptimeStart: 0, Totals: model.ComputerTotals{ + Uptime: 0, Keys: 0, Clicks: 0, }, @@ -16,12 +18,17 @@ var ComputerData model.ComputerData = model.ComputerData{ } func LoadComputerStatTotals() { + uptimeData := storage.GlobalDataStore.Get("uptime") keysData := storage.GlobalDataStore.Get("keys") clicksData := storage.GlobalDataStore.Get("clicks") + var uptime float64 var keys float64 var clicks float64 + if uptimeData != nil { + uptime = uptimeData.(float64) + } if keysData != nil { keys = keysData.(float64) } @@ -30,6 +37,7 @@ func LoadComputerStatTotals() { } ComputerData.Totals = model.ComputerTotals{ + Uptime: uptime, Keys: keys, Clicks: clicks, }