From 7f949070567f3bd99d2c835769b72ec687a89752 Mon Sep 17 00:00:00 2001 From: cv <34649812+cpvalente@users.noreply.github.com> Date: Sun, 2 May 2021 11:03:56 +0200 Subject: [PATCH] bugfix + cleanup + fixed bugs on counting finishing time and event loading + small cleanups on stack --- server/classes/EventTimer.js | 100 +++++++++++++++-------------------- server/classes/Timer.js | 47 +++++++++------- 2 files changed, 73 insertions(+), 74 deletions(-) diff --git a/server/classes/EventTimer.js b/server/classes/EventTimer.js index d7aba23c2..92ac96ab5 100644 --- a/server/classes/EventTimer.js +++ b/server/classes/EventTimer.js @@ -113,12 +113,14 @@ class EventTimer extends Timer { // if there is nothing selected, no nothing if (this.selectedEventId == null) return; super.start(); + this.broadcastState(); } pause() { // if there is nothing selected, no nothing if (this.selectedEventId == null) return; super.pause(); + this.broadcastState(); } _setterManager(action, payload) { @@ -342,14 +344,15 @@ class EventTimer extends Timer { setupWithEventList(eventlist) { // filter only events const events = eventlist.filter((e) => e.type === 'event'); - const numEvents = events.length; - if (numEvents < 1) return; // set general this._eventList = events; this.numEvents = numEvents; + // list may be empty + if (numEvents < 1) return; + // load first event this.loadEvent(0); } @@ -357,10 +360,17 @@ class EventTimer extends Timer { updateEventList(eventlist) { // filter only events const events = eventlist.filter((e) => e.type === 'event'); + const numEvents = events.length; // set general this._eventList = events; - this.numEvents = events.length; + this.numEvents = numEvents; + + // list may be empty + if (numEvents < 1) { + this.unload(); + return; + } // handle reload selected if (this.selectedEventId != null) { @@ -377,7 +387,7 @@ class EventTimer extends Timer { } // Reload data if running - let type = this._startedAt != null ? 'reload' : 'load'; + const type = this._startedAt != null ? 'reload' : 'load'; this.loadEvent(eventIndex, type); } this.broadcastState(); @@ -393,23 +403,23 @@ class EventTimer extends Timer { this._eventList[eventIndex] = { ...e, ...entry }; try { - // check if entry is running - if (e.id === this.selectedEventId) { - // handle reload selected - // Reload data if running - let type = - this.selectedEventId === id && this._startedAt != null - ? 'reload' - : 'load'; - this.loadEvent(this.selectedEvent, type); - } else if ('title' in e || 'subtitle' in e || 'presenter') { - // TODO: should be more selective on the need to load titles - this._loadTitlesNext(); - this._loadTitlesNow(); + // check if entry is running + if (e.id === this.selectedEventId) { + // handle reload selected + // Reload data if running + let type = + this.selectedEventId === id && this._startedAt != null + ? 'reload' + : 'load'; + this.loadEvent(this.selectedEvent, type); + } else if ('title' in e || 'subtitle' in e || 'presenter') { + // TODO: should be more selective on the need to load titles + this._loadTitlesNext(); + this._loadTitlesNow(); + } + } catch (error) { + console.log(error); } - } catch (error) { - console.log(error) - } this.broadcastState(); } @@ -429,6 +439,7 @@ class EventTimer extends Timer { // time stuff changes on wheter we keep the running clock if (type === 'load') { this._resetTimers(); + this.duration = end - start; this.current = this.duration; this.selectedEvent = eventIndex; @@ -451,7 +462,7 @@ class EventTimer extends Timer { _loadTitlesNow() { const e = this._eventList[this.selectedEvent]; - if (e == null) return + if (e == null) return; // private title is always current this.titles.titleNow = e.title; @@ -493,7 +504,7 @@ class EventTimer extends Timer { _loadTitlesNext() { // maybe there is nothing to load - if (this.selectedEvent == null) return + if (this.selectedEvent == null) return; // assume there is no next event this.titles.titleNext = null; @@ -658,14 +669,6 @@ class EventTimer extends Timer { this.broadcastState(); } - goto(eventIndex) { - // load event - this.loadEvent(eventIndex); - - // broadcast current state - this.broadcastState(); - } - roll() { console.log('roll: not yet implemented'); return false; @@ -676,33 +679,27 @@ class EventTimer extends Timer { // check that we have events to run if (this.numEvents < 1) return; - // change playstate - this.state = 'pause'; - // if there is no event running, go to first if (this.selectedEvent == null) { - this.goto(0); + this.loadEvent(0); return; } const gotoEvent = this.selectedEvent > 0 ? this.selectedEvent - 1 : 0; if (gotoEvent === this.selectedEvent) return; - this.goto(gotoEvent); + this.loadEvent(gotoEvent); - // broadcast current state - this.broadcastState(); + // change playstate + this.pause(); } next() { // check that we have events to run if (this.numEvents < 1) return; - // change playstate - this.state = 'pause'; - // if there is no event running, go to first if (this.selectedEvent == null) { - this.goto(0); + this.loadEvent(0); return; } @@ -712,27 +709,21 @@ class EventTimer extends Timer { : this.numEvents - 1; if (gotoEvent === this.selectedEvent) return; - this.goto(gotoEvent); + this.loadEvent(gotoEvent); - // broadcast current state - this.broadcastState(); + // change playstate + this.pause(); } unload() { // reset duration this.duration = null; - // reset timers - this._resetTimers(); - - // reset playstate - this.state = 'stop'; - // reset selected this._resetSelection(); - // broadcast current state - this.broadcastState(); + // reset playstate + this.stop(); } reload() { @@ -740,10 +731,7 @@ class EventTimer extends Timer { this.loadEvent(this.selectedEvent); // reset playstate - this.state = 'pause'; - - // broadcast current state - this.broadcastState(); + this.pause(); } } diff --git a/server/classes/Timer.js b/server/classes/Timer.js index 81ef0a975..c18f18c25 100644 --- a/server/classes/Timer.js +++ b/server/classes/Timer.js @@ -13,8 +13,8 @@ class Timer { _pausedAt = null; _pausedInterval = null; _pausedTotal = null; + _delays = null; state = 'stop'; - showNegative = false; constructor() {} @@ -38,6 +38,7 @@ class Timer { this._pausedInterval = 0; } this._pausedTotal = 0; + this._delays = 0; this.update(); } @@ -51,16 +52,13 @@ class Timer { switch (this.state) { case 'start': // update current timer - if (!this.showNegative) { - this.current = Math.max(this._finishAt + this._pausedTotal - now, 0); - } else { - this.current = this._finishAt + this._pausedTotal - now; - } + this.current = Math.max(this._finishAt + this._pausedTotal - now, 0); break; case 'pause': - if (this.current <= 0) return; // update paused time - this._pausedInterval = now - this._pausedAt; + if (this.current > 0) { + this._pausedInterval = now - this._pausedAt; + } break; case 'stop': // nothing here yet @@ -80,8 +78,8 @@ class Timer { // get current time in epoc _getCurrentTime() { // date today at midnight - let now = new Date(); - let midnight = new Date(now).setHours(0, 0, 0); + const now = new Date(); + const midnight = new Date(now).setHours(0, 0, 0); // return diffence return now - midnight; @@ -92,13 +90,14 @@ class Timer { return this._finishAt + (this._pausedInterval + this._pausedTotal); } - _resetTimers() { + _resetTimers(resetDelay = true) { this.current = this.duration; this._finishAt = null; this._startedAt = null; this._pausedAt = null; this._pausedInterval = null; this._pausedTotal = null; + if (resetDelay) this._delays = null; } // get elapsed time @@ -132,10 +131,15 @@ class Timer { if (this.state === 'start') return; else if (this.duration <= 0) return; else if (this._startedAt == null) { - this._resetTimers(); + // it hasnt started yet const now = this._getCurrentTime(); + // set start time as now this._startedAt = now; + // calculate expected finish time this._finishAt = now + this.duration; + // reset pauses + this._pausedTotal = null; + this._pausedInterval = null; } else { // check if there is paused time if (this._pausedInterval) { @@ -143,6 +147,7 @@ class Timer { this._pausedInterval = null; } } + // change state this.state = 'start'; } @@ -150,35 +155,41 @@ class Timer { pause() { // do we need to change if (this.state === 'pause') return; - else if (this.duration === 0) return; - // update pause time + // if there is already paused time (shouldnt) + if (this._pausedInterval) { + console.log('TIMER: it was not paused and had pausedInterval'); + this._pausedTotal += this._pausedInterval; + this._pausedInterval = null; + } + + // set pause time this._pausedAt = this._getCurrentTime(); // change state this.state = 'pause'; } + stop() { // do we need to change if (this.state === 'stop') return; // clear all timers this._resetTimers(); + this.state = 'stop'; } increment(amount) { - if (amount < 0) { if (Math.abs(amount) > this.current) { - console.log('ot os'); - + this._delays -= this.current; this.current = 0; this._finishAt = this._getCurrentTime(); return; } } - this.current += amount; + this._delays += amount; this._finishAt += amount; } }