break: add updateSettings command to modify Pomodoro settings

- add `updateSettings` command to modify Pomodoro configuration
- remove ability to set Pomodoro configuration in `start` command
- update demo client
- update README

🤖
This commit is contained in:
Sebastian Mark 2024-10-22 08:51:22 +02:00
parent a0dba673a2
commit cb6616f400
5 changed files with 75 additions and 59 deletions

View file

@ -29,29 +29,24 @@ If the client sends a command with an incorrect password it will not be allowed
Here are the available commands: Here are the available commands:
| Command | Action | Example Sent by Client | | Command | Action | Example Sent by Client |
|----------|-------------------------------------|-----------------------------------| | ---------- | ------------------------------------- | ----------------------------------- |
| `start` | Starts a new Pomodoro session | `{"command": "start", "password": ""}` | | `start` | Starts a new Pomodoro session | `{"command": "start", "password": ""}` |
| `pause` | Pauses the current session | `{"command": "pause", "password": ""}` | | `pause` | Pauses the current session | `{"command": "pause", "password": ""}` |
| `resume` | Resumes a paused session | `{"command": "resume", "password": ""}` | | `resume` | Resumes a paused session | `{"command": "resume", "password": ""}` |
| `reset` | Stops and resets the current session| `{"command": "reset", "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}}` |
#### Optional Start Parameters #### Update Settings Command (`updateSettings`)
The Start-Command may contain an optional Pomodoro-Config, which allows you to customize the length of the work session, short break, long break, and the number of sessions. If no configuration is provided, the server will use default values. 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.
Example: - Fields in the `settings` Object:
```json - `work`: Length of the work session (in seconds).
{ - `shortBreak`: Length of the short break (in seconds).
command: "start", - `longBreak`: Length of the long break (in seconds).
password: "foobar", - `sessions`: Total number of work/break sessions in the Pomodoro cycle.
config: {
"work": 10, // Length of the work session in seconds All fields are mandatory and may not be ommitted.
"shortBreak": 5, // Length of the short break in seconds
"longBreak": 10, // Length of the long break in seconds
"sessions": 2 // Number of total sessions
}
}
```
### Server Messages ### Server Messages

View file

@ -20,6 +20,13 @@
input { input {
width: 75px; width: 75px;
} }
.settings {
border: 2px solid black;
background: #e7e7e7;
padding: 10px;
display: inline-block;
}
</style> </style>
</head> </head>
@ -27,6 +34,7 @@
<h1>Pomodoro Timer</h1> <h1>Pomodoro Timer</h1>
<!-- Input fields for custom Pomodoro config and control password --> <!-- Input fields for custom Pomodoro config and control password -->
<div class="settings">
<p> <p>
<label for="password">Control Password:</label> <label for="password">Control Password:</label>
<input type="text" id="password" placeholder="Password" /> <input type="text" id="password" placeholder="Password" />
@ -43,7 +51,10 @@
<br /> <br />
<label for="sessions">Number of Sessions:</label> <label for="sessions">Number of Sessions:</label>
<input type="number" id="sessions" placeholder="Number of sessions" value="4" /> <input type="number" id="sessions" placeholder="Number of sessions" value="4" />
<br />
<button id="saveButton">Save Settings</button>
</p> </p>
</div>
<div id="timer">Connting to server...</div> <div id="timer">Connting to server...</div>
@ -83,8 +94,8 @@
return minutes.toString().padStart(2, '0') + ":" + remainingSeconds.toString().padStart(2, '0'); return minutes.toString().padStart(2, '0') + ":" + remainingSeconds.toString().padStart(2, '0');
} }
// Start Button Click Event // saveButton Click Event
document.getElementById("startButton").addEventListener("click", function () { document.getElementById("saveButton").addEventListener("click", function () {
// Get the values from the input fields // Get the values from the input fields
var password = document.getElementById("password").value; var password = document.getElementById("password").value;
var work = parseInt(document.getElementById("workDuration").value); var work = parseInt(document.getElementById("workDuration").value);
@ -94,15 +105,22 @@
// Send the start command with the custom config and password // Send the start command with the custom config and password
ws.send(JSON.stringify({ ws.send(JSON.stringify({
command: "start", command: "updateSettings",
password: password, password: password,
config: { settings: {
work: work, work: work,
shortBreak: shortBreak, shortBreak: shortBreak,
longBreak: longBreak, longBreak: longBreak,
sessions: sessions sessions: sessions
} }
})); }));
});
// Start Button Click Event
document.getElementById("startButton").addEventListener("click", function () {
var password = document.getElementById("password").value;
// Send the start command with the custom config and password
ws.send(JSON.stringify({command: "start", password: password}));
// Hide start button and show pause/resume and reset buttons // Hide start button and show pause/resume and reset buttons
document.getElementById("startButton").style.display = "none"; document.getElementById("startButton").style.display = "none";

View file

@ -2,7 +2,7 @@ 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" // "git.smsvc.net/pomodoro/GoTomato/pkg/models"
"sync" "sync"
) )
@ -13,28 +13,28 @@ var pomodoroResumeChannel = make(chan bool, 1)
var mu sync.Mutex // to synchronize access to shared state var mu sync.Mutex // to synchronize access to shared state
// RunPomodoro iterates the Pomodoro work/break sessions. // RunPomodoro iterates the Pomodoro work/break sessions.
func RunPomodoro(config models.GoTomatoPomodoroConfig) { func RunPomodoro() {
mu.Lock() mu.Lock()
shared.Message.Ongoing = true shared.Message.Ongoing = true
shared.Message.Paused = false shared.Message.Paused = false
mu.Unlock() mu.Unlock()
shared.Message.PomodoroSettings = config pomodoroConfig := shared.Message.PomodoroSettings
for session := 1; session <= config.Sessions; session++ { for session := 1; session <= pomodoroConfig.Sessions; session++ {
shared.Message.Session = session shared.Message.Session = session
shared.Message.Mode = "Work" shared.Message.Mode = "Work"
if !startTimer(config.Work) { if !startTimer(pomodoroConfig.Work) {
break break
} }
if session == config.Sessions { if session == pomodoroConfig.Sessions {
shared.Message.Mode = "LongBreak" shared.Message.Mode = "LongBreak"
if !startTimer(config.LongBreak) { if !startTimer(pomodoroConfig.LongBreak) {
break break
} }
} else { } else {
shared.Message.Mode = "ShortBreak" shared.Message.Mode = "ShortBreak"
if !startTimer(config.ShortBreak) { if !startTimer(pomodoroConfig.ShortBreak) {
break break
} }
} }

View file

@ -9,8 +9,6 @@ import (
"log" "log"
) )
var pomodoroConfig = shared.DefaultPomodoroConfig
// handleClientCommands listens for commands from WebSocket clients // handleClientCommands listens for commands from WebSocket clients
func handleClientCommands(ws *websocket.Conn) { func handleClientCommands(ws *websocket.Conn) {
for { for {
@ -35,10 +33,7 @@ func handleClientCommands(ws *websocket.Conn) {
switch clientCommand.Command { switch clientCommand.Command {
case "start": case "start":
if !pomodoro.IsPomodoroOngoing() { if !pomodoro.IsPomodoroOngoing() {
if clientCommand.Config != shared.UnsetPomodoroConfig { go pomodoro.RunPomodoro() // Start the timer with the list of clients
pomodoroConfig = clientCommand.Config
}
go pomodoro.RunPomodoro(pomodoroConfig) // Start the timer with the list of clients
} }
case "stop": case "stop":
if pomodoro.IsPomodoroOngoing() { if pomodoro.IsPomodoroOngoing() {
@ -52,6 +47,14 @@ func handleClientCommands(ws *websocket.Conn) {
if pomodoro.IsPomodoroOngoing() && pomodoro.IsPomodoroPaused() { if pomodoro.IsPomodoroOngoing() && pomodoro.IsPomodoroPaused() {
pomodoro.ResumePomodoro() // Resume the timer pomodoro.ResumePomodoro() // Resume the timer
} }
case "updateSettings":
if !pomodoro.IsPomodoroOngoing() {
if clientCommand.PomodoroSettings != shared.UnsetPomodoroConfig {
shared.Message.PomodoroSettings = clientCommand.PomodoroSettings
shared.Message.TimeLeft = clientCommand.PomodoroSettings.Work
}
}
} }
} }

View file

@ -10,7 +10,7 @@ import (
type ClientCommand struct { type ClientCommand struct {
Command string `json:"command"` // comman send to the server Command string `json:"command"` // comman send to the server
Password string `json:"password"` // pomodoro control password Password string `json:"password"` // pomodoro control password
Config GoTomatoPomodoroConfig `json:"config"` // pomodoro config PomodoroSettings GoTomatoPomodoroConfig `json:"settings"` // pomodoro config
} }
type Client struct { type Client struct {