=priority save status

This commit is contained in:
Miki 2024-01-07 14:18:05 +00:00
parent 066b72385e
commit a6fa324295
4 changed files with 142 additions and 91 deletions

View file

@ -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

View file

@ -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)

View file

@ -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"})
}

View file

@ -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'}