Compare commits
3 commits
cb6616f400
...
2aa8163189
Author | SHA1 | Date | |
---|---|---|---|
2aa8163189 | |||
4eedfcb965 | |||
5bf9753dce |
6 changed files with 42 additions and 22 deletions
12
README.md
12
README.md
|
@ -53,6 +53,7 @@ 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:
|
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 ("Work", "ShortBreak", "LongBreak", "End" or "Idle").
|
||||||
|
- "End" is send only once, after all sessions are finished
|
||||||
- settings: Contains the current Pomodoro settings:
|
- settings: Contains the current Pomodoro settings:
|
||||||
- work: Length of the work session in seconds (e.g., 1500 for 25 minutes).
|
- work: Length of the work session in seconds (e.g., 1500 for 25 minutes).
|
||||||
- shortBreak: Length of the short break in seconds (e.g., 300 for 5 minutes).
|
- shortBreak: Length of the short break in seconds (e.g., 300 for 5 minutes).
|
||||||
|
@ -62,14 +63,15 @@ The server periodically (every second) sends JSON-encoded messages to all connec
|
||||||
- time_left: The remaining time for the current mode, in seconds (e.g., 900 for 15 minutes).
|
- 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.
|
- ongoing: Whether a Pomodoro session is currently ongoing.
|
||||||
- paused: Whether the timer is paused.
|
- paused: Whether the timer is paused.
|
||||||
|
* version: The protocol version of the send message (this is always the same as the major app version)
|
||||||
|
|
||||||
| Message Type | Example |
|
| 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} |
|
| 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} |
|
| 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} |
|
| 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} |
|
| 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} |
|
| 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"} |
|
||||||
|
|
||||||
## Testing
|
## Testing
|
||||||
|
|
||||||
|
|
|
@ -3,11 +3,14 @@ package server
|
||||||
import (
|
import (
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"git.smsvc.net/pomodoro/GoTomato/internal/metadata"
|
||||||
"git.smsvc.net/pomodoro/GoTomato/internal/shared"
|
"git.smsvc.net/pomodoro/GoTomato/internal/shared"
|
||||||
"git.smsvc.net/pomodoro/GoTomato/internal/websocket"
|
"git.smsvc.net/pomodoro/GoTomato/internal/websocket"
|
||||||
"git.smsvc.net/pomodoro/GoTomato/pkg/models"
|
"git.smsvc.net/pomodoro/GoTomato/pkg/models"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Start() {
|
func Start() {
|
||||||
|
@ -15,8 +18,16 @@ func Start() {
|
||||||
listenAddress := flag.String("listenAddress", shared.DefaultServerConfig.ListenAddress, "IP address to listen on")
|
listenAddress := flag.String("listenAddress", shared.DefaultServerConfig.ListenAddress, "IP address to listen on")
|
||||||
listenPort := flag.Int("listenPort", shared.DefaultServerConfig.ListenPort, "Port to listen on")
|
listenPort := flag.Int("listenPort", shared.DefaultServerConfig.ListenPort, "Port to listen on")
|
||||||
password := flag.String("password", "", "Control password for pomodoro session (optional)")
|
password := flag.String("password", "", "Control password for pomodoro session (optional)")
|
||||||
|
showVersionFlag := flag.Bool("version", false, "Output version")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
|
shared.Message.GoTomatoVersion = strings.Split(metadata.GoTomatoVersion, ".")[0]
|
||||||
|
if *showVersionFlag {
|
||||||
|
fmt.Printf("App-Version: %s\n", metadata.GoTomatoVersion)
|
||||||
|
fmt.Printf("Protocol-Version: %s\n", shared.Message.GoTomatoVersion)
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
serverConfig := models.GoTomatoServerConfig{
|
serverConfig := models.GoTomatoServerConfig{
|
||||||
ListenAddress: *listenAddress,
|
ListenAddress: *listenAddress,
|
||||||
ListenPort: *listenPort,
|
ListenPort: *listenPort,
|
||||||
|
|
3
internal/metadata/version.go
Normal file
3
internal/metadata/version.go
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
package metadata
|
||||||
|
|
||||||
|
const GoTomatoVersion = "v0.0.1" // The GoTomato Version
|
|
@ -2,8 +2,8 @@ package pomodoro
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.smsvc.net/pomodoro/GoTomato/internal/shared"
|
"git.smsvc.net/pomodoro/GoTomato/internal/shared"
|
||||||
// "git.smsvc.net/pomodoro/GoTomato/pkg/models"
|
|
||||||
"sync"
|
"sync"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
var pomodoroResetChannel = make(chan bool, 1)
|
var pomodoroResetChannel = make(chan bool, 1)
|
||||||
|
@ -41,17 +41,24 @@ func RunPomodoro() {
|
||||||
shared.Message.Mode = "End"
|
shared.Message.Mode = "End"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
time.Sleep(time.Second)
|
||||||
|
|
||||||
mu.Lock()
|
mu.Lock()
|
||||||
shared.Message.Ongoing = false
|
shared.Message.Ongoing = false
|
||||||
shared.Message.Paused = false
|
shared.Message.Paused = false
|
||||||
mu.Unlock()
|
mu.Unlock()
|
||||||
|
|
||||||
|
shared.Message.Mode = "Idle"
|
||||||
|
shared.Message.Session = 0
|
||||||
|
shared.Message.TimeLeft = shared.Message.PomodoroSettings.Work
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResetPomodoro resets the running Pomodoro timer.
|
// Stops and resets the running Pomodoro
|
||||||
func ResetPomodoro() {
|
func ResetPomodoro() {
|
||||||
// Send a reset signal to stop any running timers
|
shared.Message.Mode = "Idle"
|
||||||
|
shared.Message.Session = 0
|
||||||
|
shared.Message.TimeLeft = shared.Message.PomodoroSettings.Work
|
||||||
pomodoroResetChannel <- true
|
pomodoroResetChannel <- true
|
||||||
shared.Message = shared.ResetToDefault()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func PausePomodoro() {
|
func PausePomodoro() {
|
||||||
|
|
|
@ -4,10 +4,7 @@ import (
|
||||||
"git.smsvc.net/pomodoro/GoTomato/pkg/models"
|
"git.smsvc.net/pomodoro/GoTomato/pkg/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
var Message = ResetToDefault()
|
var Message = models.ServerMessage{
|
||||||
|
|
||||||
func ResetToDefault() models.ServerMessage {
|
|
||||||
return models.ServerMessage{
|
|
||||||
Mode: "Idle",
|
Mode: "Idle",
|
||||||
PomodoroSettings: DefaultPomodoroConfig,
|
PomodoroSettings: DefaultPomodoroConfig,
|
||||||
Session: 0,
|
Session: 0,
|
||||||
|
@ -15,6 +12,5 @@ func ResetToDefault() models.ServerMessage {
|
||||||
Ongoing: false,
|
Ongoing: false,
|
||||||
Paused: false,
|
Paused: false,
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
var PomodoroPassword string
|
var PomodoroPassword string
|
||||||
|
|
|
@ -8,4 +8,5 @@ type ServerMessage struct {
|
||||||
TimeLeft int `json:"time_left"` // Remaining time in seconds
|
TimeLeft int `json:"time_left"` // Remaining time in seconds
|
||||||
Ongoing bool `json:"ongoing"` // Ongoing pomodoro
|
Ongoing bool `json:"ongoing"` // Ongoing pomodoro
|
||||||
Paused bool `json:"paused"` // Is timer paused
|
Paused bool `json:"paused"` // Is timer paused
|
||||||
|
GoTomatoVersion string `json:"version"` // Version of the server
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue