|
|
|
|
@@ -86,6 +86,11 @@ function handle(msg){
|
|
|
|
|
room=msg.room;
|
|
|
|
|
if(role==='mod'){renderMod();renderRoundButtons();}
|
|
|
|
|
else{renderPlayerBuzzer();startPlayerTimer();}
|
|
|
|
|
// If timer is enabled and this is a fresh open, load the timer
|
|
|
|
|
if(room.settings.timerSeconds>0 && modTimerRemaining===0 && !modTimerRunning){
|
|
|
|
|
modTimerRemaining=room.settings.timerSeconds;
|
|
|
|
|
renderModTimerDisplay();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'round_closed':
|
|
|
|
|
room=msg.room;
|
|
|
|
|
@@ -96,15 +101,6 @@ function handle(msg){
|
|
|
|
|
room=msg.room;
|
|
|
|
|
if(role==='mod'){renderMod();renderRoundButtons();}else renderPlayerBuzzer();
|
|
|
|
|
break;
|
|
|
|
|
case 'round_closed':
|
|
|
|
|
room=msg.room;
|
|
|
|
|
if(role==='mod')renderMod();
|
|
|
|
|
else{renderPlayerBuzzer();stopPlayerTimer();toast('ROUND CLOSED','warn');}
|
|
|
|
|
break;
|
|
|
|
|
case 'buzzer_reset':
|
|
|
|
|
room=msg.room;
|
|
|
|
|
if(role==='mod')renderMod();else renderPlayerBuzzer();
|
|
|
|
|
break;
|
|
|
|
|
case 'buzz_event':
|
|
|
|
|
room=msg.room;
|
|
|
|
|
if(role==='mod'){renderMod();renderRoundButtons();}else{renderPlayerBuzzer();addFeed(msg);}
|
|
|
|
|
@@ -303,13 +299,11 @@ function modTimerToggle(){
|
|
|
|
|
if(modTimerRunning){
|
|
|
|
|
clearInterval(modTimerInterval);modTimerRunning=false;
|
|
|
|
|
document.getElementById('btn-timer-ss').textContent='START';
|
|
|
|
|
document.getElementById('timer-tog').checked=false;
|
|
|
|
|
broadcastTimerToPlayers(modTimerRemaining,false);
|
|
|
|
|
} else {
|
|
|
|
|
if(modTimerRemaining<=0)modTimerLoad();
|
|
|
|
|
modTimerRunning=true;
|
|
|
|
|
document.getElementById('btn-timer-ss').textContent='PAUSE';
|
|
|
|
|
document.getElementById('timer-tog').checked=true;
|
|
|
|
|
broadcastTimerToPlayers(modTimerRemaining,true);
|
|
|
|
|
modTimerInterval=setInterval(()=>{
|
|
|
|
|
modTimerRemaining--;
|
|
|
|
|
@@ -318,7 +312,37 @@ function modTimerToggle(){
|
|
|
|
|
if(modTimerRemaining<=0){
|
|
|
|
|
clearInterval(modTimerInterval);modTimerRunning=false;
|
|
|
|
|
document.getElementById('btn-timer-ss').textContent='START';
|
|
|
|
|
document.getElementById('timer-tog').checked=false;
|
|
|
|
|
ws_send({type:'close_round'});
|
|
|
|
|
toast('TIME UP — round closed','warn');
|
|
|
|
|
if(typeof gsap!=='undefined'){
|
|
|
|
|
gsap.to('#mod-timer-disp',{scale:1.08,duration:0.1,yoyo:true,repeat:3,ease:'power2.inOut'});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},1000);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function toggleTimer(){
|
|
|
|
|
modTimerToggle();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function modTimerToggle(){
|
|
|
|
|
if(modTimerRunning){
|
|
|
|
|
clearInterval(modTimerInterval);modTimerRunning=false;
|
|
|
|
|
document.getElementById('btn-timer-ss').textContent='START';
|
|
|
|
|
broadcastTimerToPlayers(modTimerRemaining,false);
|
|
|
|
|
} else {
|
|
|
|
|
if(modTimerRemaining<=0)modTimerLoad();
|
|
|
|
|
modTimerRunning=true;
|
|
|
|
|
document.getElementById('btn-timer-ss').textContent='PAUSE';
|
|
|
|
|
broadcastTimerToPlayers(modTimerRemaining,true);
|
|
|
|
|
modTimerInterval=setInterval(()=>{
|
|
|
|
|
modTimerRemaining--;
|
|
|
|
|
renderModTimerDisplay();
|
|
|
|
|
broadcastTimerToPlayers(modTimerRemaining,true);
|
|
|
|
|
if(modTimerRemaining<=0){
|
|
|
|
|
clearInterval(modTimerInterval);modTimerRunning=false;
|
|
|
|
|
document.getElementById('btn-timer-ss').textContent='START';
|
|
|
|
|
ws_send({type:'close_round'});
|
|
|
|
|
toast('TIME UP — round closed','warn');
|
|
|
|
|
if(typeof gsap!=='undefined'){
|
|
|
|
|
@@ -338,23 +362,20 @@ function renderModTimerDisplay(){
|
|
|
|
|
const s=modTimerRemaining;
|
|
|
|
|
el.textContent=fmtTime(s);
|
|
|
|
|
el.className='timer-digits'+(s<=5?' danger':s<=10?' warn':'');
|
|
|
|
|
const tog=document.getElementById('timer-tog');
|
|
|
|
|
if(tog)tog.checked=modTimerRunning;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function modTimerLoad(){
|
|
|
|
|
modTimerRemaining=Math.max(5,parseInt(document.getElementById('mod-timer-set').value)||30);
|
|
|
|
|
const sec=parseInt(document.getElementById('mod-timer-set').value)||30;
|
|
|
|
|
modTimerRemaining=sec;
|
|
|
|
|
modTimerRunning=false;
|
|
|
|
|
clearInterval(modTimerInterval);
|
|
|
|
|
document.getElementById('btn-timer-ss').textContent='START';
|
|
|
|
|
document.getElementById('timer-tog').checked=false;
|
|
|
|
|
renderModTimerDisplay();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function modTimerReset(){
|
|
|
|
|
clearInterval(modTimerInterval);
|
|
|
|
|
modTimerRunning=false;
|
|
|
|
|
document.getElementById('timer-tog').checked=false;
|
|
|
|
|
modTimerRemaining=Math.max(5,parseInt(document.getElementById('mod-timer-set').value)||30);
|
|
|
|
|
renderModTimerDisplay();
|
|
|
|
|
broadcastTimerToPlayers(modTimerRemaining,false);
|
|
|
|
|
@@ -372,19 +393,59 @@ function broadcastTimerToPlayers(sec,running){
|
|
|
|
|
// MOD ROUND CONTROL
|
|
|
|
|
// ══════════════════════════════════════════════════════
|
|
|
|
|
function toggleRound(){
|
|
|
|
|
// Toggle: Open if closed, Close if open
|
|
|
|
|
if(room.buzzerState.roundOpen){
|
|
|
|
|
ws_send({type:'close_round'});
|
|
|
|
|
// If linked (toggle ON) and timer running, pause it
|
|
|
|
|
if(document.getElementById('timer-tog').checked && modTimerRunning){
|
|
|
|
|
modTimerToggle();
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
ws_send({type:'open_round'});
|
|
|
|
|
// If linked (toggle ON) and timer stopped, reset and start it
|
|
|
|
|
if(document.getElementById('timer-tog').checked && !modTimerRunning){
|
|
|
|
|
modTimerLoad();
|
|
|
|
|
modTimerRunning=true;
|
|
|
|
|
document.getElementById('btn-timer-ss').textContent='PAUSE';
|
|
|
|
|
modTimerInterval=setInterval(()=>{
|
|
|
|
|
modTimerRemaining--;
|
|
|
|
|
renderModTimerDisplay();
|
|
|
|
|
broadcastTimerToPlayers(modTimerRemaining,true);
|
|
|
|
|
if(modTimerRemaining<=0){
|
|
|
|
|
clearInterval(modTimerInterval);modTimerRunning=false;
|
|
|
|
|
document.getElementById('btn-timer-ss').textContent='START';
|
|
|
|
|
ws_send({type:'close_round'});
|
|
|
|
|
toast('TIME UP — round closed','warn');
|
|
|
|
|
}
|
|
|
|
|
},1000);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function resumeRound(){
|
|
|
|
|
// Open round WITHOUT clearing existing buzzes (for accidental close recovery)
|
|
|
|
|
ws_send({type:'resume_round'});
|
|
|
|
|
// If linked (toggle ON) and timer stopped, resume it (preserve current value)
|
|
|
|
|
if(document.getElementById('timer-tog').checked && !modTimerRunning){
|
|
|
|
|
modTimerRunning=true;
|
|
|
|
|
document.getElementById('btn-timer-ss').textContent='PAUSE';
|
|
|
|
|
broadcastTimerToPlayers(modTimerRemaining,true);
|
|
|
|
|
modTimerInterval=setInterval(()=>{
|
|
|
|
|
modTimerRemaining--;
|
|
|
|
|
renderModTimerDisplay();
|
|
|
|
|
broadcastTimerToPlayers(modTimerRemaining,true);
|
|
|
|
|
if(modTimerRemaining<=0){
|
|
|
|
|
clearInterval(modTimerInterval);modTimerRunning=false;
|
|
|
|
|
document.getElementById('btn-timer-ss').textContent='START';
|
|
|
|
|
ws_send({type:'close_round'});
|
|
|
|
|
toast('TIME UP — round closed','warn');
|
|
|
|
|
}
|
|
|
|
|
},1000);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ══════════════════════════════════════════════════════
|
|
|
|
|
// TIMER
|
|
|
|
|
// ══════════════════════════════════════════════════════
|
|
|
|
|
|
|
|
|
|
function renderRoundButtons(){
|
|
|
|
|
const btn=document.getElementById('mod-round-btn');
|
|
|
|
|
const resumeBtn=document.getElementById('mod-resume-btn');
|
|
|
|
|
|