From cbe2e007de082c23293d4e37ab9bd07f0ebf5758 Mon Sep 17 00:00:00 2001 From: Sebastian Mark Date: Tue, 5 Nov 2024 23:29:24 +0100 Subject: [PATCH 01/24] break: drop "v" from version string const - removes "v" from the ProtocolVersion in the ServerMessage - remove "v" prefix from GoTomatoVersion constant - re-add "v" for for human readable output (`-version`) - update README --- README.md | 10 +++++----- cmd/server/main.go | 4 ++-- internal/metadata/version.go | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 15e4f08..c2d9e51 100644 --- a/README.md +++ b/README.md @@ -67,11 +67,11 @@ The server periodically (every second) sends JSON-encoded messages to all connec | Message Type | Example | | --- | --- | -| Welcome Message | {"mode":"Idle", "settings":{"work":1500, "shortBreak":300, "longBreak":900, "sessions":4}, "session":0, "time_left":1500, "ongoing":false, "paused":false, "version":"v0"} | -| Session Running | {"mode":"Work", "settings":{"work":1500, "shortBreak":300, "longBreak":900, "sessions":4}, "session":1, "time_left":900, "ongoing":true, "paused":false, "version":"v0"} | -| Session Running | {"mode":"ShortBreak", "settings":{"work":1500, "shortBreak":300, "longBreak":900, "sessions":4}, "session":2, "time_left":50, "ongoing":true, "paused":false, "version":"v0"} | -| Session Paused | {"mode":"Work", "settings":{"work":1500, "shortBreak":300, "longBreak":900, "sessions":4}, "session":2, "time_left":456, "ongoing":true, "paused":true, "version":"v0"} | -| Session End/Reset | {"mode":"End", "settings":{"work":1500, "shortBreak":300, "longBreak":900, "sessions":4}, "session":0, "time_left":0, "ongoing":false, "paused":false, "version":"v0"} | +| Welcome Message | {"mode":"Idle", "settings":{"work":1500, "shortBreak":300, "longBreak":900, "sessions":4}, "session":0, "time_left":1500, "ongoing":false, "paused":false, "version":"0"} | +| Session Running | {"mode":"Work", "settings":{"work":1500, "shortBreak":300, "longBreak":900, "sessions":4}, "session":1, "time_left":900, "ongoing":true, "paused":false, "version":"0"} | +| Session Running | {"mode":"ShortBreak", "settings":{"work":1500, "shortBreak":300, "longBreak":900, "sessions":4}, "session":2, "time_left":50, "ongoing":true, "paused":false, "version":"0"} | +| Session Paused | {"mode":"Work", "settings":{"work":1500, "shortBreak":300, "longBreak":900, "sessions":4}, "session":2, "time_left":456, "ongoing":true, "paused":true, "version":"0"} | +| Session End/Reset | {"mode":"End", "settings":{"work":1500, "shortBreak":300, "longBreak":900, "sessions":4}, "session":0, "time_left":0, "ongoing":false, "paused":false, "version":"0"} | ## Testing diff --git a/cmd/server/main.go b/cmd/server/main.go index a109f38..29241f0 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -28,8 +28,8 @@ func Start() { // show server and protocl version and exit if *showVersionFlag { - fmt.Println("Server-Version:", metadata.GoTomatoVersion) - fmt.Println("Protocol-Version:", metadata.ProtocolVersion) + fmt.Printf("Server-Version: v%s\n", metadata.GoTomatoVersion) + fmt.Printf("Protocol-Version: v%s\n", metadata.ProtocolVersion) os.Exit(0) } diff --git a/internal/metadata/version.go b/internal/metadata/version.go index 8968337..f05a892 100644 --- a/internal/metadata/version.go +++ b/internal/metadata/version.go @@ -2,5 +2,5 @@ package metadata import "strings" -const GoTomatoVersion = "v0.0.8" // The GoTomato version +const GoTomatoVersion = "0.0.8" // The GoTomato version var ProtocolVersion = strings.Split(GoTomatoVersion, ".")[0] // The protocol version From b15324f6f8ca32c3ee196e23f7792d3724f22db7 Mon Sep 17 00:00:00 2001 From: Sebastian Mark Date: Wed, 6 Nov 2024 08:27:12 +0100 Subject: [PATCH 02/24] feat: bump version to v0.1.0 --- internal/metadata/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/metadata/version.go b/internal/metadata/version.go index f05a892..9b7f4f7 100644 --- a/internal/metadata/version.go +++ b/internal/metadata/version.go @@ -2,5 +2,5 @@ package metadata import "strings" -const GoTomatoVersion = "0.0.8" // The GoTomato version +const GoTomatoVersion = "0.1.0" // The GoTomato version var ProtocolVersion = strings.Split(GoTomatoVersion, ".")[0] // The protocol version From f346cbbcaa78a69979c413cadcf98f19b421d32e Mon Sep 17 00:00:00 2001 From: Sebastian Mark Date: Wed, 6 Nov 2024 18:11:37 +0100 Subject: [PATCH 03/24] feat: add initial configuration for GoReleaser MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 --- .gitignore | 2 ++ .goreleaser.yaml | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 .goreleaser.yaml diff --git a/.gitignore b/.gitignore index 2201ae4..5ee2497 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ GoTomato + +dist/ diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 0000000..aa2e879 --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,41 @@ +# vim: set ts=2 sw=2 tw=0 fo=cnqoj + +version: 2 + +before: + hooks: + - rm -fr ./dist + - go mod tidy + +builds: + - goos: + - linux + goarch: + - amd64 + - arm64 + env: + - CGO_ENABLED=0 + +upx: + - enabled: true + compress: best + lzma: true + +changelog: + sort: desc + filters: + exclude: + - "bump version to" + +archives: + - format: binary + +release: + gitea: + owner: pomodoro + name: GoTomato + mode: replace + +gitea_urls: + download: http://git.smsvc.net + api: http://git.smsvc.net/api/v1 From 783d158e9231a4e95276c50decb17ecb427a4234 Mon Sep 17 00:00:00 2001 From: Sebastian Mark Date: Wed, 6 Nov 2024 20:44:44 +0100 Subject: [PATCH 04/24] feat: bump version to 0.1.1 --- internal/metadata/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/metadata/version.go b/internal/metadata/version.go index 9b7f4f7..22e394e 100644 --- a/internal/metadata/version.go +++ b/internal/metadata/version.go @@ -2,5 +2,5 @@ package metadata import "strings" -const GoTomatoVersion = "0.1.0" // The GoTomato version +const GoTomatoVersion = "0.1.1" // The GoTomato version var ProtocolVersion = strings.Split(GoTomatoVersion, ".")[0] // The protocol version From 93f39507c1477cd7b8853be0d40d7b441b60ccfd Mon Sep 17 00:00:00 2001 From: Sebastian Mark Date: Thu, 7 Nov 2024 11:38:45 +0100 Subject: [PATCH 05/24] feat(gorleaser): set version from git tag on build - make `GoTomatoVersion` a variable and default it to "devel" - add ldflags to `.goreleaser.yaml` for version tagging - remove "v" from output of `-version` --- .goreleaser.yaml | 2 ++ cmd/server/main.go | 4 ++-- internal/metadata/version.go | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index aa2e879..4b315c5 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -15,6 +15,8 @@ builds: - arm64 env: - CGO_ENABLED=0 + ldflags: + - -s -w -X git.smsvc.net/pomodoro/GoTomato/internal/metadata.GoTomatoVersion={{.Version}} upx: - enabled: true diff --git a/cmd/server/main.go b/cmd/server/main.go index 29241f0..a109f38 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -28,8 +28,8 @@ func Start() { // show server and protocl version and exit if *showVersionFlag { - fmt.Printf("Server-Version: v%s\n", metadata.GoTomatoVersion) - fmt.Printf("Protocol-Version: v%s\n", metadata.ProtocolVersion) + fmt.Println("Server-Version:", metadata.GoTomatoVersion) + fmt.Println("Protocol-Version:", metadata.ProtocolVersion) os.Exit(0) } diff --git a/internal/metadata/version.go b/internal/metadata/version.go index 22e394e..ecac17b 100644 --- a/internal/metadata/version.go +++ b/internal/metadata/version.go @@ -2,5 +2,6 @@ package metadata import "strings" -const GoTomatoVersion = "0.1.1" // The GoTomato version +// This will be overwritten by goreleaser on build +var GoTomatoVersion = "devel" // The GoTomato version var ProtocolVersion = strings.Split(GoTomatoVersion, ".")[0] // The protocol version From 467d90065c43d9384da3ba3da63d98435171b01b Mon Sep 17 00:00:00 2001 From: Sebastian Mark Date: Thu, 7 Nov 2024 19:29:48 +0100 Subject: [PATCH 06/24] feat(goreleaser): update changelog configuration - uses the compare Gitea API - drop `sort` setting - remove the filter that excludes version bump entries --- .goreleaser.yaml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 4b315c5..a3190f6 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -24,10 +24,7 @@ upx: lzma: true changelog: - sort: desc - filters: - exclude: - - "bump version to" + use: gitea archives: - format: binary From 9852f80461172d23230000420272c48f0cce0c89 Mon Sep 17 00:00:00 2001 From: Sebastian Mark Date: Fri, 8 Nov 2024 14:23:54 +0100 Subject: [PATCH 07/24] fix: restore filter that excludes version bump entries --- .goreleaser.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index a3190f6..48ad016 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -25,6 +25,9 @@ upx: changelog: use: gitea + filters: + exclude: + - "chore: bump version to" archives: - format: binary From 2032688c1f9ce981d1f8675a33339783ad472cf3 Mon Sep 17 00:00:00 2001 From: Sebastian Mark Date: Sat, 9 Nov 2024 15:59:30 +0100 Subject: [PATCH 08/24] feat!: always retrieve version from `runtime/debug.Main.Version` or latest git tag - set version from runtime/debug.Main.Version - use latest git tag as fallback - allow GoTomatoVersion to be overwritten via ldflags - this will break `go build .` and `go install .` --- internal/metadata/version.go | 38 ++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/internal/metadata/version.go b/internal/metadata/version.go index ecac17b..1d76b3e 100644 --- a/internal/metadata/version.go +++ b/internal/metadata/version.go @@ -1,7 +1,37 @@ package metadata -import "strings" +import ( + "os/exec" + "runtime/debug" + "strings" +) -// This will be overwritten by goreleaser on build -var GoTomatoVersion = "devel" // The GoTomato version -var ProtocolVersion = strings.Split(GoTomatoVersion, ".")[0] // The protocol version +var ( + GoTomatoVersion = "" // The GoTomato version + ProtocolVersion = "" // The protocol version +) + +func stripVersionPrefix(version string) string { + return strings.TrimLeft(version, "v") +} + +func getLatestTag() string { + bytes, _ := exec.Command("git", "describe", "--tags").Output() + output := strings.TrimSpace(string(bytes)) + return stripVersionPrefix(output) +} + +// set GoTomatoVersion from runtime/debug.Main.Version +// use latest git tag as fallback +// can be overwritten via ldflags (e,g. by goreleaser) +func init() { + if GoTomatoVersion == "" { + info, _ := debug.ReadBuildInfo() + if info.Main.Version != "(devel)" { + GoTomatoVersion = stripVersionPrefix(info.Main.Version) + } else { + GoTomatoVersion = getLatestTag() + } + } + ProtocolVersion = strings.Split(GoTomatoVersion, ".")[0] +} From 05a8701a263e063a6d4fa134638b91952c2f99a8 Mon Sep 17 00:00:00 2001 From: Sebastian Mark Date: Fri, 8 Nov 2024 14:22:54 +0100 Subject: [PATCH 09/24] feat: update `-version` output --- cmd/server/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/server/main.go b/cmd/server/main.go index a109f38..2024fa2 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -28,8 +28,8 @@ func Start() { // show server and protocl version and exit if *showVersionFlag { - fmt.Println("Server-Version:", metadata.GoTomatoVersion) - fmt.Println("Protocol-Version:", metadata.ProtocolVersion) + fmt.Printf("GoTomato v%s\n", metadata.GoTomatoVersion) + fmt.Printf("Protocol-Version: %s\n", metadata.ProtocolVersion) os.Exit(0) } From 2f337bb9d69842c92f2af2c3525758b4c8943d88 Mon Sep 17 00:00:00 2001 From: Sebastian Mark Date: Fri, 8 Nov 2024 15:13:46 +0100 Subject: [PATCH 10/24] feat: add release management via `Task` - create `Taskfile.yml` - initial tasks - add new version tag - push to remote and run goreleaser - create snapshot via goreleaser --- Taskfile.yml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 Taskfile.yml diff --git a/Taskfile.yml b/Taskfile.yml new file mode 100644 index 0000000..77dfff5 --- /dev/null +++ b/Taskfile.yml @@ -0,0 +1,32 @@ +# github.com/go-task/task/v3/cmd/task@latest +# Requirements: +# github.com/caarlos0/svu@latest +# github.com/goreleaser/goreleaser/v2@latest + +version: '3' + +tasks: + + release: + desc: Create and publish an new release + vars: + RELEASE: + sh: svu next + BRANCH: + sh: git branch --show-current + COMMIT: + sh: git rev-parse --short --verify {{.BRANCH}} + preconditions: + - sh: test "{{.BRANCH}}" == "main" + msg: "You must be on the main branch to release" + prompt: Create new release {{.RELEASE}} from {{.COMMIT}}@{{.BRANCH}}? + cmds: + - git tag {{.RELEASE}} + - git push + - git push origin tag {{.RELEASE}} + - goreleaser release --clean + + snapshot: + desc: Create a local snapshot release + cmds: + - goreleaser release --clean --snapshot From 13e2c2d0e406eb2fbb37b4d72a8643ac304c62d8 Mon Sep 17 00:00:00 2001 From: Sebastian Mark Date: Sat, 9 Nov 2024 09:51:07 +0100 Subject: [PATCH 11/24] fix(goreleaser): don't force-remove `./dist` --- .goreleaser.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 48ad016..22dc0d9 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -4,7 +4,6 @@ version: 2 before: hooks: - - rm -fr ./dist - go mod tidy builds: From 8683cb2a6b21d4d82b217453f18988b684243675 Mon Sep 17 00:00:00 2001 From: Sebastian Mark Date: Sat, 9 Nov 2024 10:42:26 +0100 Subject: [PATCH 12/24] chore: add yaml schemas to `Taskfile.yml` and `.goreleaser.yaml` --- .goreleaser.yaml | 1 + Taskfile.yml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 22dc0d9..9bdad83 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -1,4 +1,5 @@ # vim: set ts=2 sw=2 tw=0 fo=cnqoj +# yaml-language-server: $schema=https://goreleaser.com/static/schema.json version: 2 diff --git a/Taskfile.yml b/Taskfile.yml index 77dfff5..8efbf3a 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -1,3 +1,5 @@ +# yaml-language-server: $schema=https://taskfile.dev/schema.json +# # github.com/go-task/task/v3/cmd/task@latest # Requirements: # github.com/caarlos0/svu@latest From 64f790bf90cb31b74d2fa9f2636e6af829236f4d Mon Sep 17 00:00:00 2001 From: Sebastian Mark Date: Sat, 9 Nov 2024 22:37:52 +0100 Subject: [PATCH 13/24] feat(goreleaser): update build command to use `.ModulePath` variable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - change hardcoded module path to dynamic reference 🤖 --- .goreleaser.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 9bdad83..77a3e60 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -16,7 +16,7 @@ builds: env: - CGO_ENABLED=0 ldflags: - - -s -w -X git.smsvc.net/pomodoro/GoTomato/internal/metadata.GoTomatoVersion={{.Version}} + - -s -w -X {{.ModulePath}}/internal/metadata.GoTomatoVersion={{.Version}} upx: - enabled: true From b3f403cf1afc2ee4c68866731bbfd18b1df8cded Mon Sep 17 00:00:00 2001 From: Sebastian Mark Date: Sun, 10 Nov 2024 16:47:57 +0100 Subject: [PATCH 14/24] fix(renovate): make Go deps always a "chore" - add package rules to set semantic commit type for gomod --- .renovaterc.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.renovaterc.json b/.renovaterc.json index ff27ef5..aceb001 100644 --- a/.renovaterc.json +++ b/.renovaterc.json @@ -2,5 +2,11 @@ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ "local>infrastructure/renovate-config" + ], + "packageRules": [ + { + "matchManagers": ["gomod"], + "semanticCommitType": "chore" + } ] } From 31179d4af4fbfe0b7a8f0c41460b489224091609 Mon Sep 17 00:00:00 2001 From: Sebastian Mark Date: Mon, 18 Nov 2024 08:11:39 +0100 Subject: [PATCH 15/24] break: update terminology from "Work" to "Focus" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - change mode from "Work" to "Focus" in server messages - modify pomodoro configuration to use "Focus" instead of "Work" - adjust default settings to reflect new terminology - ensure all references to work duration are updated to focus duration - update variable names in HTML and JavaScript for clarity 🤖 --- README.md | 26 +++++++++++++------------- cmd/server/main.go | 10 +++++----- index.html | 8 ++++---- internal/pomodoro/pomodoro.go | 12 ++++++------ internal/shared/configDefaults.go | 2 +- internal/shared/state.go | 2 +- internal/websocket/client_commands.go | 2 +- pkg/models/config.go | 4 ++-- pkg/models/server.go | 2 +- 9 files changed, 34 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index c2d9e51..596cb46 100644 --- a/README.md +++ b/README.md @@ -34,17 +34,17 @@ Here are the available commands: | `pause` | Pauses the current session | `{"command": "pause", "password": ""}` | | `resume` | Resumes a paused session | `{"command": "resume", "password": ""}` | | `reset` | Stops and resets the current session | `{"command": "reset", "password": ""}` | -| `updateSettings` | Update Pomodoro settings | `{"command": "updateSettings", "password": "", "settings": {"work": 600, "shortBreak": 60, "longBreak": 300, "sessions": 2}}` | +| `updateSettings` | Update Pomodoro settings | `{"command": "updateSettings", "password": "", "settings": {"focus": 600, "shortBreak": 60, "longBreak": 300, "sessions": 2}}` | #### Update Settings Command (`updateSettings`) -The `updateSettings` command allows clients to modify the Pomodoro timer configuration, including the length of work sessions, short breaks, long breaks, and the total number of sessions in a cycle. This command must include a valid password to be accepted by the server. The updateSettings command can be used when the timer is stopped. +The `updateSettings` command allows clients to modify the Pomodoro timer configuration, including the length of focus sessions, short breaks, long breaks, and the total number of sessions in a cycle. This command must include a valid password to be accepted by the server. The updateSettings command can be used when the timer is stopped. - Fields in the `settings` Object: - - `work`: Length of the work session (in seconds). + - `focus`: Length of the focus session (in seconds). - `shortBreak`: Length of the short break (in seconds). - `longBreak`: Length of the long break (in seconds). - - `sessions`: Total number of work/break sessions in the Pomodoro cycle. + - `sessions`: Total number of focus/break sessions in the Pomodoro cycle. All fields are mandatory and may not be ommitted. @@ -52,14 +52,14 @@ All fields are mandatory and may not be ommitted. The server periodically (every second) sends JSON-encoded messages to all connected clients to update them on the current state of the Pomodoro session. These messages contain the following fields: -- mode: Indicates the current phase of the Pomodoro session ("Work", "ShortBreak", "LongBreak", "End" or "Idle"). +- mode: Indicates the current phase of the Pomodoro session ("Focus", "ShortBreak", "LongBreak", "End" or "Idle"). - "End" is send only once, after all sessions are finished - settings: Contains the current Pomodoro settings: - - work: Length of the work session in seconds (e.g., 1500 for 25 minutes). + - focus: Length of the focus session in seconds (e.g., 1500 for 25 minutes). - shortBreak: Length of the short break in seconds (e.g., 300 for 5 minutes). - longBreak: Length of the long break in seconds (e.g., 900 for 15 minutes). - - sessions: The total number of work/break sessions (e.g., 4). -- session: The current session number (e.g., 1 for the first work session). + - sessions: The total number of focus/break sessions (e.g., 4). +- session: The current session number (e.g., 1 for the first focus session). - time_left: The remaining time for the current mode, in seconds (e.g., 900 for 15 minutes). - ongoing: Whether a Pomodoro session is currently ongoing. - paused: Whether the timer is paused. @@ -67,11 +67,11 @@ The server periodically (every second) sends JSON-encoded messages to all connec | Message Type | Example | | --- | --- | -| Welcome Message | {"mode":"Idle", "settings":{"work":1500, "shortBreak":300, "longBreak":900, "sessions":4}, "session":0, "time_left":1500, "ongoing":false, "paused":false, "version":"0"} | -| Session Running | {"mode":"Work", "settings":{"work":1500, "shortBreak":300, "longBreak":900, "sessions":4}, "session":1, "time_left":900, "ongoing":true, "paused":false, "version":"0"} | -| Session Running | {"mode":"ShortBreak", "settings":{"work":1500, "shortBreak":300, "longBreak":900, "sessions":4}, "session":2, "time_left":50, "ongoing":true, "paused":false, "version":"0"} | -| Session Paused | {"mode":"Work", "settings":{"work":1500, "shortBreak":300, "longBreak":900, "sessions":4}, "session":2, "time_left":456, "ongoing":true, "paused":true, "version":"0"} | -| Session End/Reset | {"mode":"End", "settings":{"work":1500, "shortBreak":300, "longBreak":900, "sessions":4}, "session":0, "time_left":0, "ongoing":false, "paused":false, "version":"0"} | +| Welcome Message | {"mode":"Idle", "settings":{"focus":1500, "shortBreak":300, "longBreak":900, "sessions":4}, "session":0, "time_left":1500, "ongoing":false, "paused":false, "version":"0"} | +| Session Running | {"mode":"Focus", "settings":{"focus":1500, "shortBreak":300, "longBreak":900, "sessions":4}, "session":1, "time_left":900, "ongoing":true, "paused":false, "version":"0"} | +| Session Running | {"mode":"ShortBreak", "settings":{"focus":1500, "shortBreak":300, "longBreak":900, "sessions":4}, "session":2, "time_left":50, "ongoing":true, "paused":false, "version":"0"} | +| Session Paused | {"mode":"Focus", "settings":{"focus":1500, "shortBreak":300, "longBreak":900, "sessions":4}, "session":2, "time_left":456, "ongoing":true, "paused":true, "version":"0"} | +| Session End/Reset | {"mode":"End", "settings":{"focus":1500, "shortBreak":300, "longBreak":900, "sessions":4}, "session":0, "time_left":0, "ongoing":false, "paused":false, "version":"0"} | ## Testing diff --git a/cmd/server/main.go b/cmd/server/main.go index 2024fa2..330afec 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -16,10 +16,10 @@ import ( var ( // define CLI flags - listenAddress = flag.String("listenAddress", shared.DefaultServerConfig.ListenAddress, "IP address to listen on") - listenPort = flag.Int("listenPort", shared.DefaultServerConfig.ListenPort, "Port to listen on") - password = flag.String("password", "", "Control password for pomodoro session (optional)") - showVersionFlag = flag.Bool("version", false, "Output version") + listenAddress = flag.String("listenAddress", shared.DefaultServerConfig.ListenAddress, "IP address to listen on") + listenPort = flag.Int("listenPort", shared.DefaultServerConfig.ListenPort, "Port to listen on") + password = flag.String("password", "", "Control password for pomodoro session (optional)") + showVersion = flag.Bool("version", false, "Output version") ) // Start the pomodoro server @@ -27,7 +27,7 @@ func Start() { flag.Parse() // show server and protocl version and exit - if *showVersionFlag { + if *showVersion { fmt.Printf("GoTomato v%s\n", metadata.GoTomatoVersion) fmt.Printf("Protocol-Version: %s\n", metadata.ProtocolVersion) os.Exit(0) diff --git a/index.html b/index.html index f04bf34..a75e885 100644 --- a/index.html +++ b/index.html @@ -40,8 +40,8 @@

- - + +
@@ -98,7 +98,7 @@ document.getElementById("saveButton").addEventListener("click", function () { // Get the values from the input fields var password = document.getElementById("password").value; - var work = parseInt(document.getElementById("workDuration").value); + var focus = parseInt(document.getElementById("focusDuration").value); var shortBreak = parseInt(document.getElementById("shortBreakDuration").value); var longBreak = parseInt(document.getElementById("longBreakDuration").value); var sessions = parseInt(document.getElementById("sessions").value); @@ -108,7 +108,7 @@ command: "updateSettings", password: password, settings: { - work: work, + focus: focus, shortBreak: shortBreak, longBreak: longBreak, sessions: sessions diff --git a/internal/pomodoro/pomodoro.go b/internal/pomodoro/pomodoro.go index a7bcc00..1dc0e46 100644 --- a/internal/pomodoro/pomodoro.go +++ b/internal/pomodoro/pomodoro.go @@ -26,7 +26,7 @@ func waitForTimer(t Timer) bool { } } -// RunPomodoro iterates the Pomodoro work/break sessions +// RunPomodoro iterates the Pomodoro focus/break sessions func RunPomodoro() { mu.Lock() shared.State.Ongoing = true @@ -40,9 +40,9 @@ func RunPomodoro() { shared.State.Session = session - // Work - shared.State.Mode = "Work" - timer.StartAsync(pomodoroConfig.Work) + // Focus + shared.State.Mode = "Focus" + timer.StartAsync(pomodoroConfig.Focus) if !waitForTimer(timer) { break } @@ -74,7 +74,7 @@ func RunPomodoro() { shared.State.Mode = "Idle" shared.State.Session = 0 - shared.State.TimeLeft = shared.State.Settings.Work + shared.State.TimeLeft = shared.State.Settings.Focus } func ResetPomodoro() { @@ -111,6 +111,6 @@ func IsPomodoroPaused() bool { func UpdateSettings(settings models.PomodoroConfig) { if settings != (models.PomodoroConfig{}) { shared.State.Settings = settings - shared.State.TimeLeft = settings.Work + shared.State.TimeLeft = settings.Focus } } diff --git a/internal/shared/configDefaults.go b/internal/shared/configDefaults.go index e125da8..5b668cc 100644 --- a/internal/shared/configDefaults.go +++ b/internal/shared/configDefaults.go @@ -10,7 +10,7 @@ var DefaultServerConfig = models.ServerConfig{ // The default pomodoro config if nothing else is set var DefaultPomodoroConfig = models.PomodoroConfig{ - Work: 25 * 60, + Focus: 25 * 60, ShortBreak: 5 * 60, LongBreak: 15 * 60, Sessions: 4, diff --git a/internal/shared/state.go b/internal/shared/state.go index e21d4d3..00934f5 100644 --- a/internal/shared/state.go +++ b/internal/shared/state.go @@ -10,7 +10,7 @@ var State = models.ServerMessage{ Mode: "Idle", Settings: DefaultPomodoroConfig, Session: 0, - TimeLeft: DefaultPomodoroConfig.Work, + TimeLeft: DefaultPomodoroConfig.Focus, Ongoing: false, Paused: false, ProtocolVersion: metadata.ProtocolVersion, diff --git a/internal/websocket/client_commands.go b/internal/websocket/client_commands.go index bdb6e7a..7149faa 100644 --- a/internal/websocket/client_commands.go +++ b/internal/websocket/client_commands.go @@ -10,7 +10,7 @@ import ( ) func checkSettings(settings models.PomodoroConfig) bool { - return settings.Work > 0 && settings.ShortBreak > 0 && settings.LongBreak > 0 && settings.Sessions > 0 + return settings.Focus > 0 && settings.ShortBreak > 0 && settings.LongBreak > 0 && settings.Sessions > 0 } // Listens for commands from a client and handles them diff --git a/pkg/models/config.go b/pkg/models/config.go index 1852165..b1a41ac 100644 --- a/pkg/models/config.go +++ b/pkg/models/config.go @@ -4,7 +4,7 @@ import "fmt" // Represents the configuration of a pomodoro type PomodoroConfig struct { - Work int `json:"work"` // Length of work sessions in seconds + Focus int `json:"focus"` // Length of focus sessions in seconds ShortBreak int `json:"shortBreak"` // Length of short break in seconds LongBreak int `json:"longBreak"` // Length of long break in seconds Sessions int `json:"sessions"` // Number of total sessions @@ -12,7 +12,7 @@ type PomodoroConfig struct { // Stringer interface for the PomodocoConfig model func (c PomodoroConfig) String() string { - return fmt.Sprintf("{work: %d, short: %d, long: %d, sessions: %d}", c.Work, c.ShortBreak, c.LongBreak, c.Sessions) + return fmt.Sprintf("{focus: %d, short: %d, long: %d, sessions: %d}", c.Focus, c.ShortBreak, c.LongBreak, c.Sessions) } // Represents the server configuration diff --git a/pkg/models/server.go b/pkg/models/server.go index 6aa914a..f495505 100644 --- a/pkg/models/server.go +++ b/pkg/models/server.go @@ -2,7 +2,7 @@ package models // Represents the data sent to the client via WebSocket type ServerMessage struct { - Mode string `json:"mode"` // "Idle", "Work", "ShortBreak", "LongBreak" or "End" + Mode string `json:"mode"` // "Idle", "Focus", "ShortBreak", "LongBreak" or "End" Settings PomodoroConfig `json:"settings"` // The currrent pomodoro settings Session int `json:"session"` // Current session number TimeLeft int `json:"time_left"` // Remaining time in seconds From 256837c1302032516e2d4eed1ca210a7062932bd Mon Sep 17 00:00:00 2001 From: Sebastian Mark Date: Mon, 18 Nov 2024 08:57:32 +0100 Subject: [PATCH 16/24] feat: add client instructions to usage output MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - add custom usage message - include instructions for WebSocket client connection 🤖 --- cmd/server/main.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cmd/server/main.go b/cmd/server/main.go index 330afec..25fc443 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -24,6 +24,13 @@ var ( // Start the pomodoro server func Start() { + // Update usage output + flag.Usage = func() { + fmt.Fprintf(flag.CommandLine.Output(), "Usage of %s:\n", "GoTomato") + flag.PrintDefaults() + fmt.Println("\nPoint your client to 'ws://:/ws'") + } + flag.Parse() // show server and protocl version and exit From e8e65c4f3a036c1aaf2d744190fb79ae72db6569 Mon Sep 17 00:00:00 2001 From: Sebastian Mark Date: Mon, 18 Nov 2024 17:43:49 +0100 Subject: [PATCH 17/24] break: remove `/ws` from websocket path --- cmd/server/main.go | 4 ++-- index.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/server/main.go b/cmd/server/main.go index 25fc443..d8eb8f6 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -28,7 +28,7 @@ func Start() { flag.Usage = func() { fmt.Fprintf(flag.CommandLine.Output(), "Usage of %s:\n", "GoTomato") flag.PrintDefaults() - fmt.Println("\nPoint your client to 'ws://:/ws'") + fmt.Println("\nPoint your client to 'ws://:'") } flag.Parse() @@ -52,7 +52,7 @@ func Start() { // start connection handler and broadcast r := http.NewServeMux() - r.HandleFunc("/ws", websocket.HandleConnection) + r.HandleFunc("/", websocket.HandleConnection) go websocket.SendPermanentBroadCastMessage() helper.Logger.Info("GoTomato started", "version", metadata.GoTomatoVersion) diff --git a/index.html b/index.html index a75e885..1de404b 100644 --- a/index.html +++ b/index.html @@ -64,7 +64,7 @@