diff --git a/app.js b/app.js
index 769bb92..0a5db0b 100644
--- a/app.js
+++ b/app.js
@@ -35,7 +35,16 @@ app.post('/create',async function(req,res) {
while(rooms[code]) {
code = Math.floor(100000 + Math.random() * 900000).toString();
}
- rooms[code] = {t1: data.time, t2: data.time, m1: true, p: true, t: 0};
+ let buffer = parseInt(data.buffer) || 0
+ rooms[code] = {t1: data.time,
+ t2: data.time,
+ buffer: buffer,
+ activeBuffer: buffer,
+ increment: parseInt(data.increment) || 0,
+ m1: true,
+ p: true,
+ t: 0
+ };
res.send(code);
} catch(e) {
@@ -66,8 +75,16 @@ app.post('/switch',async function(req, res) {
}
var room = rooms[data.code];
if(data.s == 0) {
+ //apply increment
+ if (room.m1) {
+ room.t1 += room.increment;
+ } else {
+ room.t2 += room.increment;
+ }
//switch
room.m1 = !room.m1;
+ //reset buffer TODO: (Should this also happen on unpause?)
+ room.activeBuffer = room.buffer;
} else if(data.s == 1) {
//pause
room.p = false;
@@ -81,6 +98,13 @@ app.post('/switch',async function(req, res) {
//reduce room timer value
function roomTick(delta, room) {
if(room.p) return;
+ if (room.activeBuffer > 0) {
+ room.activeBuffer -= delta;
+ delta = -1* room.activeBuffer;
+ if (delta < 0) {
+ return;
+ }
+ }
if(room.m1 && room.t1 > 0) {
room.t1 -= delta;
} else if(room.t2 > 0) {
diff --git a/index.html b/client/index.html
similarity index 70%
rename from index.html
rename to client/index.html
index 8ab5e63..bba8b25 100644
--- a/index.html
+++ b/client/index.html
@@ -1,40 +1,47 @@
-
-
-
- Chess Timer Online
-
-
-
-
-
Chess Timer Online
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ Chess Timer Online
+
+
+
+
+
Chess Timer Online
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/index.js b/client/js/index.js
similarity index 87%
rename from index.js
rename to client/js/index.js
index ebd082c..d18e704 100644
--- a/index.js
+++ b/client/js/index.js
@@ -1,188 +1,203 @@
-//some of the HTML elements
-var joinDiv = document.getElementById('joinDiv');
-var roomDiv = document.getElementById('roomDiv');
-var codeInput = document.getElementById('code');
-var timeInput = document.getElementById('time');
-var t1h = document.getElementById('t1');
-var t2h = document.getElementById('t2');
-var pauseB = document.getElementById('pauseButton');
-var codeH = document.getElementById('codeH');
-
-//the room id
-var code = 0;
-//the room
-var room = {};
-
-//POST the creation request to server and open room div if successful
-function create() {
- console.log('time: ' + timeInput.value);
- var data = {time: parseInt(timeInput.value)};
- $.post('./create',data,function(data,status) {
- if(data == 'invalid') {
- alert("Time must be between 1 and 740 minutes.");
- return;
- }
- if(data == 'err') {
- alert("Error, please refresh the page and try again.");
- return;
- }
- code = data;
- joinDiv.style.display = "none";
- roomDiv.style.display = "inline-block";
- codeH.innerHTML = "Code: " + code;
- setUpdateInterval();
- });
-}
-
-//try to get initial room info from code in input box
-function join() {
- var id = codeInput.value;
- var data = {code: id};
- $.post('./info',data,function(data,status) {
- if(data == 'invalid') {
- console.log('failed room check with id ' + id)
- alert("Invalid Room Code.");
- console.log("failed room check with code " + code);
- alert('It appears this room no longer exists.');
- } else if(data == 'err') {
- alert("Error, please refresh the page and try again.");
- } else {
- room = data;
- code = id;
- joinDiv.style.display = "none";
- roomDiv.style.display = "inline-block";
- codeH.innerHTML = "Code: " + id;
- setUpdateInterval();
- }
- });
-}
-
-//switch which timer is counting down
-function swap() {
- var data = {code, s: 0};
- $.post('./switch',data,function(data,status) {
- if(data == 'invalid') {
- alert("Invalid Room Code.");
- return false;
- }
- if(data == 'err') {
- alert("Error, please refresh the page and try again.");
- return false;
- }
- room = data;
- return true;
- });
-}
-
-//pause/unpause timer
-function pause() {
- var s = 1;
- if(!room.p) {
- s = 2;
- }
- var data = {code, s};
- $.post('./switch',data,function(data,status) {
- if(data == 'invalid') {
- alert("Invalid Room Code.");
- return false;
- }
- if(data == 'err') {
- alert("Error, please refresh the page and try again.");
- return false;
- }
- room = data;
- return true;
- });
-}
-
-//update the room display
-function updateRoomDisplay() {
- var h1 = Math.floor(room.t1/3600);
- var m1 = Math.floor(room.t1/60)-h1*60;
- var s1 = Math.floor(room.t1)-h1*3600-m1*60;
-
- var hs1 = h1.toString();
- if(h1 < 10) {
- hs1 = "0" + hs1;
- }
- var ms1 = m1.toString();
- if(m1 < 10) {
- ms1 = "0" + ms1;
- }
- var ss1 = s1.toString();
- if(s1 < 10) {
- ss1 = "0" + ss1;
- }
- t1h.innerHTML = hs1 + ":" + ms1 + ":" + ss1;
-
- var h2 = Math.floor(room.t2/3600);
- var m2 = Math.floor(room.t2/60)-h2*60;
- var s2 = Math.floor(room.t2)-h2*3600-m2*60;
- var hs2 = h2.toString();
- if(h2 < 10) {
- hs2 = "0" + hs2;
- }
- var ms2 = m2.toString();
- if(m2 < 10) {
- ms2 = "0" + ms2;
- }
- var ss2 = s2.toString();
- if(s2 < 10) {
- ss2 = "0" + ss2;
- }
- t2h.innerHTML = hs2 + ":" + ms2 + ":" + ss2;
-
-
- if(room.m1) {
- t1h.style["text-decoration"] = "underline";
- t2h.style["text-decoration"] = "none";
- } else {
- t1h.style["text-decoration"] = "none";
- t2h.style["text-decoration"] = "underline";
- }
-
- if(room.t1 <=0 ) {
- t1h.style.color = "red";
- }
- if(room.t2 <= 0) {
- t2h.style.color = "red";
- }
-}
-
-
-//update room info from server every second
-function setUpdateInterval() {
- var roomInfo = setInterval(function() {
- var data = {code};
- $.post('./info',data,function(data,status) {
- if(data == 'invalid') {
- alert("Invalid Room Code.");
- clearInterval(roomInfo);
- console.log("failed room check with code " + code);
- alert('It appears this room no longer exists.');
- } else if(data == 'err') {
- alert("Error, please refresh the page and try again.");
- } else {
- room = data;
- }
- });
- updateRoomDisplay();
- }, 1000);
-}
-
-//update room clock locally between server updates
-var prevTime = performance.now();
-setInterval(function() {
- var time = performance.now();
- var delta = (time-prevTime)/1000;
- prevTime = time;
- if(room && !room.p) {
- if(room.m1 && room.t1 > 0) {
- room.t1 -= delta;
- updateRoomDisplay();
- } else if(!room.m1 && room.t2 > 0) {
- room.t2 -= delta;
- updateRoomDisplay();
- }
- }
+//some of the HTML elements
+var joinDiv = document.getElementById('joinDiv');
+var roomDiv = document.getElementById('roomDiv');
+var codeInput = document.getElementById('code');
+var timeInput = document.getElementById('time');
+var timeBufferInput = document.getElementById('timeBuffer');
+var timeIncrementInput = document.getElementById('timeIncrement');
+var t1h = document.getElementById('t1');
+var t2h = document.getElementById('t2');
+var pauseB = document.getElementById('pauseButton');
+var codeH = document.getElementById('codeH');
+
+//the room id
+var code = 0;
+//the room
+var room = {};
+
+//POST the creation request to server and open room div if successful
+function create() {
+ console.log('time: ' + timeInput.value);
+ var data = {
+ time: parseInt(timeInput.value),
+ buffer: parseInt(timeBufferInput.value),
+ increment: parseInt(timeIncrementInput.value),
+ };
+ $.post('./create',data,function(data,status) {
+ if(data == 'invalid') {
+ alert("Time must be between 1 and 740 minutes.");
+ return;
+ }
+ if(data == 'err') {
+ alert("Error, please refresh the page and try again.");
+ return;
+ }
+ code = data;
+ joinDiv.style.display = "none";
+ roomDiv.style.display = "inline-block";
+ codeH.innerHTML = "Code: " + code;
+ setUpdateInterval();
+ });
+}
+
+//try to get initial room info from code in input box
+function join() {
+ var id = codeInput.value;
+ var data = {code: id};
+ $.post('./info',data,function(data,status) {
+ if(data == 'invalid') {
+ console.log('failed room check with id ' + id)
+ alert("Invalid Room Code.");
+ console.log("failed room check with code " + code);
+ alert('It appears this room no longer exists.');
+ } else if(data == 'err') {
+ alert("Error, please refresh the page and try again.");
+ } else {
+ room = data;
+ code = id;
+ joinDiv.style.display = "none";
+ roomDiv.style.display = "inline-block";
+ codeH.innerHTML = "Code: " + id;
+ setUpdateInterval();
+ }
+ });
+}
+
+//switch which timer is counting down
+function swap() {
+ var data = {code, s: 0};
+ room.activeBuffer = room.buffer; //just to keep the local update smooth
+ $.post('./switch',data,function(data,status) {
+ if(data == 'invalid') {
+ alert("Invalid Room Code.");
+ return false;
+ }
+ if(data == 'err') {
+ alert("Error, please refresh the page and try again.");
+ return false;
+ }
+ room = data;
+ return true;
+ });
+}
+
+//pause/unpause timer
+function pause() {
+ var s = 1;
+ if(!room.p) {
+ s = 2;
+ }
+ var data = {code, s};
+ $.post('./switch',data,function(data,status) {
+ if(data == 'invalid') {
+ alert("Invalid Room Code.");
+ return false;
+ }
+ if(data == 'err') {
+ alert("Error, please refresh the page and try again.");
+ return false;
+ }
+ room = data;
+ return true;
+ });
+}
+
+//update the room display
+function updateRoomDisplay() {
+ var h1 = Math.floor(room.t1/3600);
+ var m1 = Math.floor(room.t1/60)-h1*60;
+ var s1 = Math.floor(room.t1)-h1*3600-m1*60;
+
+ var hs1 = h1.toString();
+ if(h1 < 10) {
+ hs1 = "0" + hs1;
+ }
+ var ms1 = m1.toString();
+ if(m1 < 10) {
+ ms1 = "0" + ms1;
+ }
+ var ss1 = s1.toString();
+ if(s1 < 10) {
+ ss1 = "0" + ss1;
+ }
+ t1h.innerHTML = hs1 + ":" + ms1 + ":" + ss1;
+
+ var h2 = Math.floor(room.t2/3600);
+ var m2 = Math.floor(room.t2/60)-h2*60;
+ var s2 = Math.floor(room.t2)-h2*3600-m2*60;
+ var hs2 = h2.toString();
+ if(h2 < 10) {
+ hs2 = "0" + hs2;
+ }
+ var ms2 = m2.toString();
+ if(m2 < 10) {
+ ms2 = "0" + ms2;
+ }
+ var ss2 = s2.toString();
+ if(s2 < 10) {
+ ss2 = "0" + ss2;
+ }
+ t2h.innerHTML = hs2 + ":" + ms2 + ":" + ss2;
+
+
+ if(room.m1) {
+ t1h.style["text-decoration"] = "underline";
+ t2h.style["text-decoration"] = "none";
+ } else {
+ t1h.style["text-decoration"] = "none";
+ t2h.style["text-decoration"] = "underline";
+ }
+
+ if(room.t1 <=0 ) {
+ t1h.style.color = "red";
+ }
+ if(room.t2 <= 0) {
+ t2h.style.color = "red";
+ }
+}
+
+
+//update room info from server every second
+function setUpdateInterval() {
+ var roomInfo = setInterval(function() {
+ var data = {code};
+ $.post('./info',data,function(data,status) {
+ if(data == 'invalid') {
+ alert("Invalid Room Code.");
+ clearInterval(roomInfo);
+ console.log("failed room check with code " + code);
+ alert('It appears this room no longer exists.');
+ } else if(data == 'err') {
+ alert("Error, please refresh the page and try again.");
+ } else {
+ room = data;
+ }
+ });
+ updateRoomDisplay();
+ }, 1000);
+}
+
+//update room clock locally between server updates
+var prevTime = performance.now();
+setInterval(function() {
+ let time = performance.now();
+ let delta = (time-prevTime)/1000;
+ // Check buffer before for local updates to avoid backwards ticks
+ if (room && room.activeBuffer && room.activeBuffer > 0) {
+ room.activeBuffer -= delta;
+ delta = -1* room.activeBuffer;
+ if (delta < 0) {
+ return;
+ }
+ }
+ prevTime = time;
+ if(room && !room.p) {
+ if(room.m1 && room.t1 > 0) {
+ room.t1 -= delta;
+ updateRoomDisplay();
+ } else if(!room.m1 && room.t2 > 0) {
+ room.t2 -= delta;
+ updateRoomDisplay();
+ }
+ }
}, 100);
\ No newline at end of file