=priority save status
This commit is contained in:
parent
066b72385e
commit
a6fa324295
4 changed files with 142 additions and 91 deletions
|
@ -1,10 +1,13 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
scribble "github.com/nanobox-io/golang-scribble"
|
||||
|
@ -93,37 +96,44 @@ func (app *App) DeleteHeat(c *gin.Context) {
|
|||
c.JSON(http.StatusOK, gin.H{"status": "deleted"})
|
||||
}
|
||||
|
||||
// func (app *App) StartHeatTimer(c *gin.Context) {
|
||||
// var msg Message
|
||||
// var err error
|
||||
// var timer time.Duration
|
||||
func (app *App) StartHeatTimer(c *gin.Context) {
|
||||
var msg Message
|
||||
var err error
|
||||
var timer time.Duration
|
||||
|
||||
// if app.Stream.Start {
|
||||
// c.JSON(http.StatusOK, app.Stream.Duration)
|
||||
// return
|
||||
// }
|
||||
if app.Stream.HeatRunning {
|
||||
c.JSON(http.StatusOK, "running")
|
||||
return
|
||||
}
|
||||
|
||||
// err = c.ShouldBind(&msg)
|
||||
// if err != nil {
|
||||
// log.Printf("req error: %+v", err)
|
||||
// c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
// return
|
||||
// }
|
||||
err = c.ShouldBind(&msg)
|
||||
if err != nil {
|
||||
log.Printf("req error: %+v", err)
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
// timer, err = time.ParseDuration(msg.Duration)
|
||||
// if err != nil {
|
||||
// log.Printf("req error: %+v", err)
|
||||
// c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
// return
|
||||
// }
|
||||
// app.Stream.Duration = timer
|
||||
// app.Stream.Start = true
|
||||
heat := &Heat{}
|
||||
|
||||
// startHeat(app.DB, *app.Stream.Heat)
|
||||
json.Unmarshal([]byte(msg.Data), heat)
|
||||
|
||||
// log.Printf("start timer %s - received %s", app.Stream.Duration, msg.Duration)
|
||||
// c.JSON(http.StatusOK, app.Stream.Duration)
|
||||
// }
|
||||
log.Printf("msg: %+v", msg)
|
||||
log.Printf("heat: %+v", heat)
|
||||
|
||||
timer, err = time.ParseDuration(strconv.Itoa(heat.Timer) + "m")
|
||||
if err != nil {
|
||||
log.Printf("req error: %+v", err)
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
app.Stream.HeatTimer = timer
|
||||
app.Stream.HeatRunning = true
|
||||
|
||||
// app.startHeat()
|
||||
|
||||
log.Printf("start timer %s - received %s", app.Stream.HeatTimer, heat.Timer)
|
||||
c.JSON(http.StatusOK, app.Stream.HeatRunning)
|
||||
}
|
||||
|
||||
// func (app *App) StopHeatTimer(c *gin.Context) {
|
||||
// if !app.Stream.Start {
|
||||
|
@ -139,12 +149,12 @@ func (app *App) DeleteHeat(c *gin.Context) {
|
|||
// c.JSON(http.StatusOK, app.Stream.Duration)
|
||||
// }
|
||||
|
||||
func startHeat(db *scribble.Driver, heat Heat) error {
|
||||
func (app *App) startHeat(heat Heat) error {
|
||||
log.Printf("heat: %+v", heat)
|
||||
|
||||
heat.Status = "running"
|
||||
|
||||
err := db.Write("Heat", heatName(heat), heat)
|
||||
err := app.DB.Write("Heat", heatName(heat), heat)
|
||||
if err != nil {
|
||||
log.Printf("set error: %+v", err)
|
||||
return err
|
||||
|
|
|
@ -85,7 +85,8 @@ func (app *App) RegisterApiRoutes() {
|
|||
// api.POST("/priority", app.SetPriority)
|
||||
|
||||
api.GET("/sse", app.Stream.SseHeadersMiddleware(), app.Stream.Stream)
|
||||
// api.POST("/startheat", app.StartHeatTimer)
|
||||
api.POST("/msg", app.Stream.SendMsg)
|
||||
api.POST("/startheat", app.StartHeatTimer)
|
||||
// api.GET("/stopheat", app.StopHeatTimer)
|
||||
api.POST("/saveheat", app.SaveHeat)
|
||||
api.POST("/deleteheat", app.DeleteHeat)
|
||||
|
|
|
@ -3,13 +3,15 @@ package main
|
|||
import (
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"slices"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
var events = []string{"message", "timer", "priority"}
|
||||
var events = []string{"message", "timer", "priority", "cmd"}
|
||||
|
||||
type Message struct {
|
||||
Event string `json:"event"`
|
||||
|
@ -28,17 +30,27 @@ type Client struct {
|
|||
}
|
||||
|
||||
type SseStream struct {
|
||||
Clients []Client `json:"clients"`
|
||||
MsgId map[string]int `json:"msgid"`
|
||||
Events []string `json:"events"`
|
||||
Clients []Client `json:"clients"`
|
||||
MsgId map[string]int `json:"msgid"`
|
||||
Events []string `json:"events"`
|
||||
HeatRunning bool `json:"heat_running"`
|
||||
HeatTimer time.Duration `json:"heat_timer"`
|
||||
}
|
||||
|
||||
func InitSse() *SseStream {
|
||||
return &SseStream{
|
||||
Clients: make([]Client, 0),
|
||||
MsgId: map[string]int{},
|
||||
Events: events,
|
||||
sse := &SseStream{
|
||||
Clients: make([]Client, 0),
|
||||
MsgId: map[string]int{},
|
||||
Events: events,
|
||||
HeatRunning: false,
|
||||
HeatTimer: 0,
|
||||
}
|
||||
|
||||
for i := range events {
|
||||
sse.MsgId[events[i]] = 0
|
||||
}
|
||||
|
||||
return sse
|
||||
}
|
||||
|
||||
func (sse *SseStream) SseHeadersMiddleware() gin.HandlerFunc {
|
||||
|
@ -101,6 +113,14 @@ func (sse *SseStream) Send(msg Message) {
|
|||
for _, client := range sse.Clients {
|
||||
if slices.Contains(client.Events, msg.Event) || slices.Contains(client.Events, "*") {
|
||||
client.Chan <- msg
|
||||
log.Printf("sent: %+v -> %+v", msg, client.Ip)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (sse *SseStream) SendMsg(c *gin.Context) {
|
||||
var msg Message
|
||||
c.ShouldBind(&msg)
|
||||
sse.Send(msg)
|
||||
c.JSON(http.StatusOK, gin.H{"status": "msg"})
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
<script>
|
||||
heat;
|
||||
// import { page } from '$app/stores';
|
||||
import { onMount } from 'svelte';
|
||||
import { dev } from '$app/environment';
|
||||
|
@ -12,7 +13,7 @@
|
|||
console.log('Not dev mode');
|
||||
}
|
||||
|
||||
const events = ["priority","time"];
|
||||
const events = ['priority', 'time'];
|
||||
|
||||
let saved = false;
|
||||
|
||||
|
@ -25,10 +26,10 @@
|
|||
let heat;
|
||||
$: heats = [];
|
||||
|
||||
$: surfers = [];
|
||||
// $: surfers = [];
|
||||
$: min = 0;
|
||||
$: sec = 0;
|
||||
$: end = false;
|
||||
// $: end = false;
|
||||
// $: start = false;
|
||||
|
||||
function resetHeat() {
|
||||
|
@ -59,7 +60,7 @@
|
|||
}
|
||||
|
||||
async function loadHeats() {
|
||||
resetHeat();
|
||||
// resetHeat();
|
||||
const res = await fetch(`/api/loadheats`);
|
||||
const data = await res.json();
|
||||
for (let i in data) {
|
||||
|
@ -71,9 +72,9 @@
|
|||
}
|
||||
|
||||
function Subscribe() {
|
||||
let url = "/api/sse?";
|
||||
let url = '/api/sse?';
|
||||
for (let e in events) {
|
||||
url += `event=${events[e]}&`;
|
||||
url += `event=${events[e]}&`;
|
||||
}
|
||||
console.log(`sse url: ${url}`);
|
||||
const sse = new EventSource(url);
|
||||
|
@ -83,8 +84,8 @@
|
|||
console.log(`received: ${JSON.stringify(Msg)}`);
|
||||
if (Msg.mode === 'priority') {
|
||||
console.log(`priority: ${Msg.priority}`);
|
||||
for (let i in surfers) {
|
||||
surfers[i].priority = Msg.priority[i];
|
||||
for (let i in $priority.surfers) {
|
||||
$priority.surfers[i].priority = Msg.priority[i];
|
||||
}
|
||||
} else if (Msg.mode === 'time') {
|
||||
// console.log(`duration: ${Msg.duration}`);
|
||||
|
@ -108,11 +109,11 @@
|
|||
}
|
||||
|
||||
async function dblclick(id) {
|
||||
console.log(`dblclick = ${surfers[id]}`);
|
||||
if (surfers[id] === 'P') {
|
||||
console.log(`dblclick = ${$priority.surfers[id]}`);
|
||||
if ($priority.surfers[id] === 'P') {
|
||||
console.log('pressed P');
|
||||
} else {
|
||||
console.log(`pressed: [${id}] ${surfers[id].priority}`);
|
||||
console.log(`pressed: [${id}] ${$priority.surfers[id].priority}`);
|
||||
}
|
||||
const res = await fetch(`/api/stopheat`);
|
||||
const data = await res.json();
|
||||
|
@ -124,8 +125,9 @@
|
|||
const res = await fetch(`/api/startheat`, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({
|
||||
duration: min + 'm',
|
||||
mode: 'time'
|
||||
data: JSON.stringify(heat),
|
||||
cmd: 'start',
|
||||
event: 'timer'
|
||||
}),
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
|
@ -133,75 +135,93 @@
|
|||
});
|
||||
console.log(`retval: ${JSON.stringify(res)}`);
|
||||
$priority.start = true;
|
||||
end = false;
|
||||
$priority.end = false;
|
||||
}
|
||||
|
||||
async function stopHeat() {
|
||||
const res = await fetch(`/api/stopheat`, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({
|
||||
data: JSON.stringify(heat),
|
||||
cmd: 'stop',
|
||||
event: 'timer'
|
||||
}),
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
console.log(`retval: ${JSON.stringify(res)}`);
|
||||
$priority.start = false;
|
||||
$priority.end = true;
|
||||
}
|
||||
|
||||
function setHeat(h) {
|
||||
console.log(`setHeat: ${h}`);
|
||||
min = heat.timer;
|
||||
surfers = heat.surfers;
|
||||
$priority.surfers = surfers;
|
||||
$priority.min = min;
|
||||
$priority.surfers = heat.surfers;
|
||||
$priority.min = heat.timer;
|
||||
$priority.sec = 0;
|
||||
}
|
||||
|
||||
async function click(id) {
|
||||
let max = surfers.length;
|
||||
console.log(surfers[id]);
|
||||
if (surfers[id].priority === 'P') {
|
||||
for (let i in surfers) {
|
||||
let max = $priority.surfers.length;
|
||||
console.log($priority.surfers[id]);
|
||||
if ($priority.surfers[id].priority === 'P') {
|
||||
for (let i in $priority.surfers) {
|
||||
if (i != id) {
|
||||
let pos = parseInt(surfers[i].priority) - 1;
|
||||
let pos = parseInt($priority.surfers[i].priority) - 1;
|
||||
if (pos === 1) {
|
||||
surfers[i].priority = 'P';
|
||||
$priority.surfers[i].priority = 'P';
|
||||
} else {
|
||||
surfers[i].priority = pos.toString();
|
||||
$priority.surfers[i].priority = pos.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
surfers[id].priority = max.toString();
|
||||
} else if (surfers[id].priority === '') {
|
||||
console.log(`priority empty; pressed: [${id}] ${surfers[id].priority}`);
|
||||
for (let i in surfers) {
|
||||
console.log(`looping(${id}): ${i} - ${surfers[i].priority}`);
|
||||
$priority.surfers[id].priority = max.toString();
|
||||
} else if ($priority.surfers[id].priority === '') {
|
||||
console.log(`priority empty; pressed: [${id}] ${$priority.surfers[id].priority}`);
|
||||
for (let i in $priority.surfers) {
|
||||
console.log(`looping(${id}): ${i} - ${$priority.surfers[i].priority}`);
|
||||
if (i != id) {
|
||||
if (surfers[i].priority === '') {
|
||||
console.log(`empty: [${i}] ${surfers[i].priority}`);
|
||||
if ($priority.surfers[i].priority === '') {
|
||||
console.log(`empty: [${i}] ${$priority.surfers[i].priority}`);
|
||||
continue;
|
||||
} else {
|
||||
console.log(`not empty: [${i}] ${surfers[i].priority}`);
|
||||
let pos = parseInt(surfers[i].priority) - 1;
|
||||
console.log(`not empty: [${i}] ${$priority.surfers[i].priority}`);
|
||||
let pos = parseInt($priority.surfers[i].priority) - 1;
|
||||
if (pos === 1) {
|
||||
surfers[i].priority = 'P';
|
||||
$priority.surfers[i].priority = 'P';
|
||||
} else {
|
||||
surfers[i].priority = pos.toString();
|
||||
$priority.surfers[i].priority = pos.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
surfers[id].priority = max.toString();
|
||||
$priority.surfers[id].priority = max.toString();
|
||||
} else {
|
||||
console.log(`pressed: [${id}] ${surfers[id].priority}`);
|
||||
let oldpos = parseInt(surfers[id].priority);
|
||||
for (let i in surfers) {
|
||||
console.log(`pressed: [${id}] ${$priority.surfers[id].priority}`);
|
||||
let oldpos = parseInt($priority.surfers[id].priority);
|
||||
for (let i in $priority.surfers) {
|
||||
if (i != id) {
|
||||
console.log(`pos: [${i}] ${surfers[i].priority} ${surfers[i].priority > oldpos}`);
|
||||
if (surfers[i].priority != 'P' && surfers[i].priority > oldpos) {
|
||||
let pos = parseInt(surfers[i].priority);
|
||||
console.log(
|
||||
`pos: [${i}] ${$priority.surfers[i].priority} ${$priority.surfers[i].priority > oldpos}`
|
||||
);
|
||||
if ($priority.surfers[i].priority != 'P' && $priority.surfers[i].priority > oldpos) {
|
||||
let pos = parseInt($priority.surfers[i].priority);
|
||||
if (pos > oldpos) {
|
||||
surfers[i].priority = (pos - 1).toString();
|
||||
console.log(`newpos: ${surfers[i].priority}`);
|
||||
$priority.surfers[i].priority = (pos - 1).toString();
|
||||
console.log(`newpos: ${$priority.surfers[i].priority}`);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
surfers[i].priority = max.toString();
|
||||
console.log(`last: [${i}] ${surfers[i].priority}`);
|
||||
$priority.surfers[i].priority = max.toString();
|
||||
console.log(`last: [${i}] ${$priority.surfers[i].priority}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
const res = await fetch(`/api/priority`, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({
|
||||
priority: surfers.map((obj) => obj.priority),
|
||||
priority: $priority.surfers.map((obj) => obj.priority),
|
||||
mode: 'priority'
|
||||
}),
|
||||
headers: {
|
||||
|
@ -210,7 +230,7 @@
|
|||
});
|
||||
console.log(
|
||||
JSON.stringify({
|
||||
priority: surfers.map((obj) => obj.priority),
|
||||
priority: $priority.surfers.map((obj) => obj.priority),
|
||||
mode: 'priority'
|
||||
})
|
||||
);
|
||||
|
@ -230,13 +250,13 @@
|
|||
label="Heats"
|
||||
id="heats"
|
||||
/>
|
||||
{#if !end}
|
||||
<div class="timer">{pad2(min)}:{pad2(sec)}</div>
|
||||
{#if !$priority.end}
|
||||
<div class="timer">{pad2($priority.min)}:{pad2($priority.sec)}</div>
|
||||
{:else}
|
||||
<div class="timer" style="color: red">{pad2(min)}:{pad2(sec)}</div>
|
||||
<div class="timer" style="color: red">{pad2($priority.min)}:{pad2($priority.sec)}</div>
|
||||
{/if}
|
||||
{#if $priority.start}
|
||||
<Button handleClick={() => startHeat()} label="STOP" />
|
||||
<Button handleClick={() => stopHeat()} label="STOP" />
|
||||
{:else}
|
||||
<Button handleClick={() => startHeat()} label="START" />
|
||||
{/if}
|
||||
|
@ -244,7 +264,7 @@
|
|||
</div>
|
||||
|
||||
<div class="container">
|
||||
{#each surfers || [] as surfer, id}
|
||||
{#each $priority.surfers || [] as surfer, id}
|
||||
<div class="box">
|
||||
{#if surfer.priority != ''}
|
||||
{#if surfer.priority === 'P'}
|
||||
|
|
Loading…
Add table
Reference in a new issue