escaperoom-2022-30min

Controls timer

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        escaperoom-2022-30min
// @namespace   http://tampermonkey.net/
// @version     0.0.6
// @description Controls timer
// @author		GMiclotte & GGroothuis
// @include		https://sites.google.com/view/escaperoom202230min/*
// @inject-into page
// @run-at document-end
// @grant		none
// @license MIT
// ==/UserScript==
 
function appendName(t, name) {
    if (t === 0) {
        return "";
    }
    return t + name[0];
}
 
function msToHms(ms) {
    let seconds = Number(ms / 1000);
    // split seconds in days, hours, minutes and seconds
    let d = Math.floor(seconds / 86400)
    let h = Math.floor(seconds % 86400 / 3600);
    let m = Math.floor(seconds % 3600 / 60);
    let s = Math.floor(seconds % 60);
    // append h/hour/hours etc depending, then concat and return
    return [
        appendName(d, "d"),
        appendName(h, "u"),
        appendName(m, "m"),
        appendName(s, "s"),
    ].filter(x => x.length).join(' ');
}
 
// default 30 minutes = 30 * 60 * 1000 ms
function setAllowedDuration(ms = 30 * 60 * 1000) {
    localStorage.setItem('duration', ms);
}
 
function saveStartTime() {
    localStorage.setItem('startTime', Date.now());
}
 
function getRemainingTime() {
    const currentTime = Date.now();
    const targetTime = Number(localStorage.getItem('startTime')) + Number(localStorage.getItem('duration'));
    return targetTime - currentTime;
}
 
function getFormattedRemainingTime() {
    const remainingTime = getRemainingTime();
    if (remainingTime < 0) {
        return 'De tijd is om!';
    }
    return msToHms(remainingTime);
}
 
// after resetMinutes the start time is cleared, if force is true, then the timer is also cleared
function clearStartTime(resetMinutes = 5, force = false) {
    const remainingTime = getRemainingTime();
    if (force || remainingTime < -resetMinutes * 60 * 1000) {
        localStorage.removeItem('startTime');
    }
}
 
function addButton(parent) {
    const button = document.createElement('button');
    button.id = 'countdownButton';
    button.style.textAlign = 'center';
    button.style.fontSize = '60px';
    button.style.marginTop = '0px';
    button.style.marginBottom = '0px';
    button.textContent = 'Start!';
    button.onclick = saveStartTime;
    parent.appendChild(button);
}
 
function getButton() {
    return document.getElementById('countdownButton');
}
 
function addTimer(parent) {
    const timer = document.createElement('p');
    timer.id = 'countdownTimer';
    timer.style.textAlign = 'center';
    timer.style.fontSize = '60px';
    timer.style.marginTop = '0px';
    timer.style.marginBottom = '0px';
    timer.textContent = '';
    parent.appendChild(timer);
}
 
function getTimer() {
    return document.getElementById('countdownTimer');
}
 
function updateTimer() {
    // check if we need to clear the start time
    clearStartTime();
    // get elements
    const button = getButton();
    const timer = getTimer();
    // get the start time
    const startTime = localStorage.getItem('startTime');
    if (startTime === null) {
        // start time is not yet set, show the start button
        button.style.display = 'block';
        timer.style.display = 'none';
        return;
    }
    // start time is set, show the countdown
    button.style.display = 'none';
    timer.style.display = 'block';
    timer.textContent = getFormattedRemainingTime();
}
 
function cleanup() {
    clearInterval(window.countdownTimer);
    const button = getButton();
    if (button !== null) {
        button.remove();
    }
    const timer = getTimer();
    if (timer !== null) {
        timer.remove();
    }
    clearStartTime(0, true);
}function appendName(t, name) {
    if (t === 0) {
        return "";
    }
    return t + name[0];
}
 
function msToHms(ms) {
    let seconds = Number(ms / 1000);
    // split seconds in days, hours, minutes and seconds
    let d = Math.floor(seconds / 86400)
    let h = Math.floor(seconds % 86400 / 3600);
    let m = Math.floor(seconds % 3600 / 60);
    let s = Math.floor(seconds % 60);
    // append h/hour/hours etc depending, then concat and return
    return [
        appendName(d, "d"),
        appendName(h, "u"),
        appendName(m, "m"),
        appendName(s, "s"),
    ].filter(x => x.length).join(' ');
}
 
// default 30 minutes = 30 * 60 * 1000 ms
function setAllowedDuration(ms = 30 * 60 * 1000) {
    localStorage.setItem('duration', ms);
}
 
function saveStartTime() {
    localStorage.setItem('startTime', Date.now());
}
 
function getRemainingTime() {
    const currentTime = Date.now();
    const targetTime = Number(localStorage.getItem('startTime')) + Number(localStorage.getItem('duration'));
    return targetTime - currentTime;
}
 
function getFormattedRemainingTime() {
    const remainingTime = getRemainingTime();
    if (remainingTime < 0) {
        return 'De tijd is om!';
    }
    return msToHms(remainingTime);
}
 
// after resetMinutes the start time is cleared, if force is true, then the timer is also cleared
function clearStartTime(resetMinutes = 5, force = false) {
    const remainingTime = getRemainingTime();
    if (force || remainingTime < -resetMinutes * 60 * 1000) {
        localStorage.removeItem('startTime');
    }
}
 
function addButton(parent, idx) {
    const button = document.createElement('button');
    button.id = `countdownButton-${idx}`;
    button.style.textAlign = 'center';
    button.style.fontSize = '60px';
    button.style.marginTop = '0px';
    button.style.marginBottom = '0px';
    button.style.display = 'none';
    button.textContent = 'Start!';
    button.onclick = saveStartTime;
    parent.appendChild(button);
    return button;
}
 
function addTimer(parent, idx) {
    const timer = document.createElement('p');
    timer.id = `countdownTimer-${idx}`;
    timer.style.textAlign = 'center';
    timer.style.fontSize = '60px';
    timer.style.marginTop = '0px';
    timer.style.marginBottom = '0px';
    timer.style.display = 'none';
    timer.textContent = '';
    parent.appendChild(timer);
    return timer;
}
 
function updateTimer() {
    // check if we need to clear the start time
    clearStartTime();
    // get the start time
    const startTime = localStorage.getItem('startTime');
    if (startTime === null) {
        // start time is not yet set, show the start button
        window.countdownTimers.forEach(x => {
            x.button.style.display = 'block';
            x.timer.style.display = 'none';
        });
        return;
    }
    // start time is set, show the countdown
    window.countdownTimers.forEach(x => {
        x.button.style.display = 'none';
        x.timer.style.display = 'block';
        x.timer.textContent = getFormattedRemainingTime();
    });
}
 
function cleanup() {
    clearInterval(window.countdownTimer);
    window.countdownTimers.forEach(x => {
        x.button.remove();
        x.timer.remove();
    });
    window.countdownTimers = [];
    clearStartTime(0, true);
}
 
function init() {
    console.log('initializing escape room countdown timer')
    let parents = document.getElementById("timeriFrame");
    if (parents.length === 0) {
        setTimeout(init, 100);
        return;
    }
    let idx = 0;
    const countdownTimers = [];
    for (let parent of parents) {
        parent = parent.parentElement.parentElement;
        parent.children[0].remove();
        parent.style.display = 'flex';
        parent.style.justifyContent = 'center';
        parent.style.alignItems = 'center';
        setAllowedDuration();
        const button = addButton(parent, idx);
        const timer = addTimer(parent, idx);
        countdownTimers.push({button: button, timer: timer})
        idx++;
    }
    window.countdownTimers = countdownTimers;
    window.countdownTimer = setInterval(updateTimer, 250);
}
 
init();
 
window.cleanup = cleanup;
window.init = init;