diff --git a/cmd/client/notification.go b/cmd/client/helper/notification.go similarity index 93% rename from cmd/client/notification.go rename to cmd/client/helper/notification.go index 7e5dfd6..956e6a2 100644 --- a/cmd/client/notification.go +++ b/cmd/client/helper/notification.go @@ -1,4 +1,4 @@ -package client +package helper import ( "fmt" @@ -8,7 +8,7 @@ import ( ) // Send desktop notifications on the start of each segment -func desktopNotifications(pomodoro GoTomato.ServerMessage) { +func DesktopNotifications(pomodoro GoTomato.ServerMessage) { var ( duration int notification string diff --git a/cmd/client/helper/terminal.go b/cmd/client/helper/terminal.go new file mode 100644 index 0000000..06c1713 --- /dev/null +++ b/cmd/client/helper/terminal.go @@ -0,0 +1,51 @@ +package helper + +import ( + "fmt" + + "github.com/alecthomas/colour" + + GoTomato "git.smsvc.net/pomodoro/GoTomato/pkg/models" +) + +// Return terminal output based on the passed ServerMessage +func TerminalOutput(pomodoro GoTomato.ServerMessage) string { + var ( + output string + + modePrefix string + timerOutput string + ) + + // header + output += colour.Sprintf("^D^4Work: %d ◊ Break: %d ◊ Longbreak: %d^R\n\n", + pomodoro.Settings.Work/60, + pomodoro.Settings.ShortBreak/60, + pomodoro.Settings.LongBreak/60, + ) + + //body + switch pomodoro.Mode { + case "Idle": + modePrefix = " " + timerOutput = "" + default: + modePrefix = " " + if pomodoro.Paused { + modePrefix = " " + } + minutes := pomodoro.TimeLeft / 60 + seconds := pomodoro.TimeLeft % 60 + + timerOutput = fmt.Sprintf("⏳ %02d:%02d", minutes, seconds) + } + + output += fmt.Sprintf("Session: %d/%d\n", + pomodoro.Session, + pomodoro.Settings.Sessions, + ) + output += fmt.Sprintf("%s %s\n", modePrefix, pomodoro.Mode) + output += fmt.Sprintf(timerOutput) + + return output +} diff --git a/cmd/client/view.go b/cmd/client/view.go index 0e7d9b9..6189530 100644 --- a/cmd/client/view.go +++ b/cmd/client/view.go @@ -1,93 +1,31 @@ package client import ( - "fmt" "strings" "github.com/alecthomas/colour" + "git.smsvc.net/pomodoro/ChronoTomato/cmd/client/helper" GoTomato "git.smsvc.net/pomodoro/GoTomato/pkg/models" - "github.com/charmbracelet/bubbles/progress" ) -var progressBar = progress.New(progress.WithDefaultGradient(), progress.WithoutPercentage()) - func (a app) View() string { var body string var serverStatus string body = "Waiting for server message..." if a.pomodoro != (GoTomato.ServerMessage{}) { - body = terminalOutput(a.pomodoro) - desktopNotifications(a.pomodoro) + body = helper.TerminalOutput(a.pomodoro) + helper.DesktopNotifications(a.pomodoro) } - serverStatus = colour.Sprintf("^D^1%v^R\n", client.LastErr) - if client.Connected() && client.LastErr == nil { + serverStatus = colour.Sprintf("^D^1disconnected: %v^R\n", client.LastErr) + if client.Connected() { serverStatus = colour.Sprintf("^D^2connected to %s^R\n", client.Server) } helpView := a.help.View(a.keys) - height := 10 - strings.Count(body, "\n") - strings.Count(serverStatus, "\n") - strings.Count(helpView, "\n") + height := 8 - strings.Count(body, "\n") - strings.Count(serverStatus, "\n") - strings.Count(helpView, "\n") return body + strings.Repeat("\n", height) + serverStatus + helpView } - -// Return terminal output based on the passed ServerMessage -func terminalOutput(pomodoro GoTomato.ServerMessage) string { - var ( - output string - - modePrefix string - timerOutput string - ) - - // header - output += colour.Sprintf("^D^4Work: %d ◊ Break: %d ◊ Longbreak: %d^R\n\n", - pomodoro.Settings.Work/60, - pomodoro.Settings.ShortBreak/60, - pomodoro.Settings.LongBreak/60, - ) - - //body - switch pomodoro.Mode { - case "Idle": - modePrefix = " " - timerOutput = "" - default: - modePrefix = " " - if pomodoro.Paused { - modePrefix = " " - } - minutes := pomodoro.TimeLeft / 60 - seconds := pomodoro.TimeLeft % 60 - - timerOutput = fmt.Sprintf("⏱ %02d:%02d", minutes, seconds) + "\n" - timerOutput += progressBar.ViewAs(calc_percentage(pomodoro)) - } - - output += fmt.Sprintf("Session: %d/%d\n", - pomodoro.Session, - pomodoro.Settings.Sessions, - ) - output += fmt.Sprintf("%s %s\n", modePrefix, pomodoro.Mode) + "\n" - output += timerOutput - - return output -} - -func calc_percentage(message GoTomato.ServerMessage) float64 { - var duration float64 - - switch message.Mode { - case "Work": - duration = float64(message.Settings.Work) - case "ShortBreak": - duration = float64(message.Settings.ShortBreak) - case "LongBreak", "End": - duration = float64(message.Settings.LongBreak) - } - - timeLeft := float64(message.TimeLeft) - return 1.0 - (timeLeft / duration) -} diff --git a/go.mod b/go.mod index da5bc03..2b7f407 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,6 @@ require ( require ( github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect - github.com/charmbracelet/harmonica v0.2.0 // indirect github.com/charmbracelet/lipgloss v1.0.0 // indirect github.com/charmbracelet/x/ansi v0.4.5 // indirect github.com/charmbracelet/x/term v0.2.0 // indirect diff --git a/go.sum b/go.sum index 4f15eb3..c95467b 100644 --- a/go.sum +++ b/go.sum @@ -8,8 +8,6 @@ github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQW github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU= github.com/charmbracelet/bubbletea v1.2.1 h1:J041h57zculJKEKf/O2pS4edXGIz+V0YvojvfGXePIk= github.com/charmbracelet/bubbletea v1.2.1/go.mod h1:viLoDL7hG4njLJSKU2gw7kB3LSEmWsrM80rO1dBJWBI= -github.com/charmbracelet/harmonica v0.2.0 h1:8NxJWRWg/bzKqqEaaeFNipOu77YR5t8aSwG4pgaUBiQ= -github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao= github.com/charmbracelet/lipgloss v1.0.0 h1:O7VkGDvqEdGi93X+DeqsQ7PKHDgtQfF8j8/O2qFMQNg= github.com/charmbracelet/lipgloss v1.0.0/go.mod h1:U5fy9Z+C38obMs+T+tJqst9VGzlOYGj4ri9reL3qUlo= github.com/charmbracelet/log v0.4.0 h1:G9bQAcx8rWA2T3pWvx7YtPTPwgqpk7D68BX21IRW8ZM= diff --git a/internal/websocket/receive.go b/internal/websocket/receive.go index 7912de3..4aeb6ad 100644 --- a/internal/websocket/receive.go +++ b/internal/websocket/receive.go @@ -19,7 +19,6 @@ func (c *Client) ProcessServerMessages(channel chan<- GoTomato.ServerMessage) { defer close(Done) for { - c.Conn.SetReadDeadline(time.Now().Add(10 * time.Second)) _, message, err := c.Conn.ReadMessage() if err != nil { // On normal closure exit gracefully @@ -27,18 +26,11 @@ func (c *Client) ProcessServerMessages(channel chan<- GoTomato.ServerMessage) { return } - c.LastErr = err // Try to reconnect on unexpected disconnect for { channel <- prevMessage // send previous ServerMessage to update view - time.Sleep(time.Second) - - // reconnect while preserving password - pw := c.Password *c = Connect(c.Server) - c.Password = pw - if c.Connected() { break }