From 43628a1a665e121776a265d6a4f9caf99661f80a Mon Sep 17 00:00:00 2001 From: trafficlunar Date: Sat, 30 Nov 2024 00:01:01 +0000 Subject: [PATCH] feat: add timestamps to computer graph data --- internal/handler/computer.go | 4 ++-- internal/model/computer.go | 15 +++++++++++---- internal/service/computer.go | 33 +++++++++++++++++++++++++-------- internal/worker/computer.go | 20 ++++++++++++++------ 4 files changed, 52 insertions(+), 20 deletions(-) diff --git a/internal/handler/computer.go b/internal/handler/computer.go index a958fb0..a94de35 100644 --- a/internal/handler/computer.go +++ b/internal/handler/computer.go @@ -3,6 +3,7 @@ package handler import ( "backend/internal/model" "backend/internal/service" + "backend/internal/worker" "encoding/json" "log/slog" "net/http" @@ -35,7 +36,6 @@ func HandleComputerWebSocket(w http.ResponseWriter, r *http.Request) { slog.Info("WebSocket connection established!") service.ComputerData.Online = true - // Read messages for { _, message, err := conn.ReadMessage() if err != nil { @@ -50,7 +50,7 @@ func HandleComputerWebSocket(w http.ResponseWriter, r *http.Request) { continue } - service.AddComputerData(clientMessage) + worker.QueuedClientMessage = clientMessage slog.Info("Recieved message", slog.Any("message", clientMessage)) } } diff --git a/internal/model/computer.go b/internal/model/computer.go index 1a9d1c1..1fc3481 100644 --- a/internal/model/computer.go +++ b/internal/model/computer.go @@ -1,12 +1,19 @@ package model +import "time" + type ComputerWebSocketMessage struct { Cpu uint8 `json:"cpu"` Ram uint8 `json:"ram"` } -type ComputerGraphData struct { - Online bool `json:"online"` - Cpu []int `json:"cpu"` - Ram []int `json:"ram"` +type ComputerData struct { + Online bool `json:"online"` + Graph []ComputerGraphData `json:"graph"` +} + +type ComputerGraphData struct { + Timestamp time.Time `json:"timestamp"` + Cpu int `json:"cpu"` + Ram int `json:"ram"` } diff --git a/internal/service/computer.go b/internal/service/computer.go index 0ed536b..ffb4db6 100644 --- a/internal/service/computer.go +++ b/internal/service/computer.go @@ -2,19 +2,36 @@ package service import ( "backend/internal/model" + "time" ) -var ComputerData model.ComputerGraphData = model.ComputerGraphData{ - Cpu: make([]int, 50), - Ram: make([]int, 50), +var ComputerData model.ComputerData = model.ComputerData{ + Online: false, + Graph: initializeGraphData(), +} + +func initializeGraphData() []model.ComputerGraphData { + graphData := make([]model.ComputerGraphData, 50) + + for i := 0; i < 50; i++ { + graphData[i] = model.ComputerGraphData{ + Timestamp: time.Now().Truncate(1 * time.Minute).Add(time.Duration(-50+i) * time.Minute), + Cpu: 0, + Ram: 0, + } + } + + return graphData } func AddComputerData(clientMessage model.ComputerWebSocketMessage) { - ComputerData.Cpu = append(ComputerData.Cpu, int(clientMessage.Cpu)) - ComputerData.Ram = append(ComputerData.Ram, int(clientMessage.Ram)) + ComputerData.Graph = append(ComputerData.Graph, model.ComputerGraphData{ + Timestamp: time.Now().Truncate(time.Minute).Add(-time.Minute), + Cpu: int(clientMessage.Cpu), + Ram: int(clientMessage.Ram), + }) - if len(ComputerData.Cpu) > 50 { - ComputerData.Cpu = ComputerData.Cpu[1:] - ComputerData.Ram = ComputerData.Ram[1:] + if len(ComputerData.Graph) > 50 { + ComputerData.Graph = ComputerData.Graph[1:] } } diff --git a/internal/worker/computer.go b/internal/worker/computer.go index ff54b0b..b9c7b60 100644 --- a/internal/worker/computer.go +++ b/internal/worker/computer.go @@ -7,15 +7,23 @@ import ( "time" ) +var QueuedClientMessage model.ComputerWebSocketMessage + func StartComputerWorker() { slog.Info("Starting computer worker...") - for range time.Tick(1 * time.Minute) { - if !service.ComputerData.Online { - service.AddComputerData(model.ComputerWebSocketMessage{ - Cpu: 0, - Ram: 0, - }) + for range time.Tick(1 * time.Second) { + now := time.Now() + + if now.Second() == 0 { + if !service.ComputerData.Online { + service.AddComputerData(model.ComputerWebSocketMessage{ + Cpu: 0, + Ram: 0, + }) + } else { + service.AddComputerData(QueuedClientMessage) + } } } }