package websocket import ( "encoding/json" "git.smsvc.net/pomodoro/GoTomato/internal/helper" "git.smsvc.net/pomodoro/GoTomato/internal/pomodoro" "git.smsvc.net/pomodoro/GoTomato/internal/shared" "git.smsvc.net/pomodoro/GoTomato/pkg/models" ) func checkSettings(settings models.PomodoroConfig) bool { return settings.Focus > 0 && settings.ShortBreak > 0 && settings.LongBreak > 0 && settings.Sessions > 0 } // Listens for commands from a client and handles them func handleClientCommands(c models.WebsocketClient) { ws := c.Conn for { var clientCommand models.ClientCommand _, message, err := ws.ReadMessage() if err != nil { // remove client on error/disconnect mu.Lock() delete(Clients, ws.LocalAddr()) mu.Unlock() helper.Logger.Info("Client disconnected:", "msg", err, "host", c.RealIP, "clients", len(Clients)) break } // Handle incoming commands err = json.Unmarshal(message, &clientCommand) if err != nil { helper.Logger.Error("Error unmarshalling command:", "msg", err) continue } // Process the command if pomodoro password matches if clientCommand.Password == shared.PomodoroPassword { switch clientCommand.Command { case "start": if !pomodoro.IsPomodoroOngoing() { go pomodoro.RunPomodoro() // Start the timer with the list of clients } case "stop": if pomodoro.IsPomodoroOngoing() { pomodoro.ResetPomodoro() // Reset Pomodoro } case "pause": if pomodoro.IsPomodoroOngoing() && !pomodoro.IsPomodoroPaused() { pomodoro.PausePomodoro() // Pause the timer } case "resume": if pomodoro.IsPomodoroOngoing() && pomodoro.IsPomodoroPaused() { pomodoro.ResumePomodoro() // Resume the timer } case "updateSettings": if !pomodoro.IsPomodoroOngoing() { if !checkSettings(clientCommand.Settings) { helper.Logger.Warn("Ignoring invalid config:", "msg", clientCommand.Settings, "host", c.Conn.RemoteAddr()) break } helper.Logger.Info("Client send config", "config", clientCommand.Settings, "host", c.Conn.RemoteAddr()) pomodoro.UpdateSettings(clientCommand.Settings) } } } } }