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

+ + +
+
+ + +
+ Advanced Time Settings +
+ + +
+
+
+ + + + \ 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