MediaWiki:BossTimer.js: Difference between revisions

From Elwiki
No edit summary
No edit summary
 
(16 intermediate revisions by the same user not shown)
Line 1: Line 1:
function docReady(fn) {
$(function () {
     // see if DOM is already available
     var timer = document.querySelector('.boss-timer');
     if (document.readyState === "complete" || document.readyState === "interactive") {
     if (!timer) return;
         // call on next available tick
 
         setTimeout(fn, 1);
    var bosses = {
    } else {
         boss1: {
         document.addEventListener("DOMContentLoaded", fn);
            href: '/w/The Great Steel Wall',
            img: '/wiki/images/2/22/20-4Button.png'
         },
        boss2: {
            href: '/w/Plegas\'s Labyrinth',
            img: '/wiki/images/1/17/17-3Button.png'
         }
     }
     }
}


docReady(function () {
     var breakdown_hours = [];
     function closestHigher(number, candidates) {
    var i = 0;
        var bestCandidate = Infinity;
    while (i < 24) {
        var higherCandidates = candidates.filter(function (candidate) { return candidate > number });
        if (i % 2 > 0) breakdown_hours.push(i)
        higherCandidates.forEach(function (candidate) {
         i++
            if (candidate < bestCandidate) bestCandidate = candidate;
        });
         return bestCandidate;
     }
     }


     Date.prototype.addHours = function (h) {
     var boss1_hours = [];
         this.setTime(this.getTime() + (h * 60 * 60 * 1000));
    var i = 1;
         return this;
    while (i < 24) {
         boss1_hours.push(i);
         i += i % 2 === 0 ? 3 : 1;
     }
     }


     Date.prototype.addMinutes = function (m) {
     var status = {
         this.setTime(this.getTime() + (m * 60 * 1000));
         NA: {
         return this;
            boss1: true,
            boss2: true
        },
        EU: {
            boss1: true,
            boss2: true
         }
     }
     }


     Date.prototype.addTime = function (ms) {
     function start_timer(server, UTC_offset) {
         this.setTime(this.getTime() + ms);
         var timers = null;
         return this;
         UTC_offset = getTimezoneOffset(UTC_offset);
    }


    var getTimezoneOffset = (timeZone, date = new Date()) => {
        var date1;
         var tz = date.toLocaleString("en", { timeZone, timeStyle: "long" }).split(" ").slice(-1)[0];
        var date2 = new Date();
         var dateString = date.toString();
         date2.addMinutes(date2.getTimezoneOffset());
         var offset = Date.parse(`${dateString} UTC`) - Date.parse(`${dateString} ${tz}`);
         date2.addTime(UTC_offset);
        return offset;
         var hourNow;
    }


    function msToTime(s) {
        function updateDungeon() {
            date1 = new Date();
            date1.addMinutes(date1.getTimezoneOffset());
            date1.addTime(UTC_offset);
            hourNow = date1.getHours();
            var current = [];
            if (boss1_hours.includes(hourNow) && status[server].boss2) {
                status[server].boss1 = true;
                status[server].boss2 = false;
                current[server] = 'boss1';
            } else if (!boss1_hours.includes(hourNow) && status[server].boss1) {
                status[server].boss1 = false;
                status[server].boss2 = true;
                current[server] = 'boss2';
            }
            var currBoss = current[server];
            var currBossData = bosses[currBoss].href ? bosses[currBoss] : bosses[currBoss][server];
            var timer_img = $('.boss-timer-' + server + ' .boss-timer-image img');
            timer_img.attr('srcset', currBossData.img).attr('src', currBossData.img);
            $('.boss-timer-' + server + ' .boss-timer-image a').attr('href', currBossData.href);
            var localizationID = '#' + currBoss + '-localization-' + server;
            var localization = $(localizationID).text();
            console.table(localizationID, localization);
            if (!localization) {
                localization = $(localizationID.replace(server, 'NA')).text();
            }
            $('.boss-timer-' + server + ' .boss-timer-text').text(localization);
        }
        updateDungeon();


         s = parseInt(s);
         var closestBreakdown = closestHigher(hourNow, breakdown_hours);
        if (hourNow == 23) {
            date2.addHours(2);
        } else {
            date2.addHours(closestBreakdown - hourNow);
        }
        date2.setMinutes(0);
        date2.setSeconds(0);


         // Pad to 2 or 3 digits, default is 2
         var diffTime = Math.abs(date2 - date1);
         function pad(n, z) {
         function updateTime() {
             z = z || 2;
             $('.boss-timer-' + server + ' .boss-timer-countdown').text(msToTime(diffTime));
            return ('00' + n).slice(-z);
         }
         }
        updateTime();


         var ms = s % 1000;
         var timer_server = document.querySelector('.boss-timer-' + server);
        s = (s - ms) / 1000;
         if (!timer_server) return;
         var secs = s % 60;
         if (timers) return;
        s = (s - secs) / 60;
        var mins = s % 60;
         var hrs = (s - mins) / 60;


         return pad(hrs) + ':' + pad(mins) + ':' + pad(secs)
         function updateTimers() {
            diffTime = diffTime - 1000;
            if (diffTime < 0) {
                diffTime = 7200000
                updateDungeon();
            }
            updateTime();
        }
        timers = setInterval(updateTimers, 1000);
     }
     }


     var timer = document.querySelector('.boss-timer')
     start_timer('NA', 'US/Pacific');
     if (timer !== null && timer !== undefined) {
    start_timer('EU', 'CET');
         var breakdown_hours = [];
 
         var i = 0;
    $('.boss-timer img').css('display', 'inline-block');
         while (i < 24) {
 
            if (i % 2 > 0) breakdown_hours.push(i)
     if (isApple()) $('.boss-timer').hide();
            i++
 
        }
});
 
function isApple() {
    return [
         'iPad Simulator',
        'iPhone Simulator',
        'iPod Simulator',
        'iPad',
         'iPhone',
         'iPod'
    ].includes(navigator.platform)
        // iPad on iOS 13 detection
        || (navigator.userAgent.includes("Mac"))
}


        var grotto_hours = [];
function msToTime(s) {
        var i = 1;
        while (i < 24) {
            grotto_hours.push(i);
            i += i % 2 === 0 ? 3 : 1;
        }
        var is_grotto = [];
        var is_plegas = [];


        function start_timer(server, UTC_offset) {
    s = parseInt(s);
            UTC_offset = getTimezoneOffset(UTC_offset);


            is_grotto[server] = true;
    // Pad to 2 or 3 digits, default is 2
            is_plegas[server] = true;
    function pad(n, z) {
        z = z || 2;
        return ('00' + n).slice(-z);
    }


            var date1;
    var ms = s % 1000;
            var date2 = new Date();
    s = (s - ms) / 1000;
            date2.addMinutes(date2.getTimezoneOffset());
    var secs = s % 60;
            date2.addTime(UTC_offset);
    s = (s - secs) / 60;
            var hourNow;
    var mins = s % 60;
    var hrs = (s - mins) / 60;


            function updateDungeon() {
    return pad(hrs) + ':' + pad(mins) + ':' + pad(secs)
                date1 = new Date();
}
                date1.addMinutes(date1.getTimezoneOffset());
                date1.addTime(UTC_offset);
                hourNow = date1.getHours();
                if (grotto_hours.includes(hourNow) && is_plegas[server]) {
                    var timer_img_src = '/wiki/images/8/84/13-5Button.png';
                    var timer_img = document.querySelector('.boss-timer-' + server + ' .boss-timer-image img')
                    timer_img.setAttribute('srcset', timer_img_src);
                    timer_img.setAttribute('src', timer_img_src);
                    document.querySelector('.boss-timer-' + server + ' .boss-timer-image a').setAttribute('href', '/w/File:13-5Button.png');
                    document.querySelector('.boss-timer-' + server + ' .boss-timer-text').innerHTML = document.querySelector('#dungeon1-localization').innerText;
                    is_grotto[server] = true;
                    is_plegas[server] = false;
                } else if (!grotto_hours.includes(hourNow) && is_grotto[server]) {
                    var timer_img_src = '/wiki/images/1/17/17-3Button.png';
                    var timer_img = document.querySelector('.boss-timer-' + server + ' .boss-timer-image img');
                    timer_img.setAttribute('srcset', timer_img_src)
                    timer_img.setAttribute('src', timer_img_src);
                    document.querySelector('.boss-timer-' + server + ' .boss-timer-image a').setAttribute('href', '/w/File:17-3Button.png');
                    document.querySelector('.boss-timer-' + server + ' .boss-timer-text').innerHTML = document.querySelector('#dungeon2-localization').innerText;
                    is_plegas[server] = true;
                    is_grotto[server] = false;
                }
            }
            updateDungeon();


            var closestBreakdown = closestHigher(hourNow, breakdown_hours);
Date.prototype.addHours = function (h) {
            if (hourNow == 23) {
    this.setTime(this.getTime() + (h * 60 * 60 * 1000));
                date2.addHours(2);
    return this;
            } else {
}
                date2.addHours(closestBreakdown - hourNow);
            }
            date2.setMinutes(0);
            date2.setSeconds(0);


            var diffTime = Math.abs(date2 - date1);
Date.prototype.addMinutes = function (m) {
            function updateTime() {
    this.setTime(this.getTime() + (m * 60 * 1000));
                document.querySelector('.boss-timer-' + server + ' .boss-timer-countdown').innerHTML = msToTime(diffTime);
    return this;
            }
}
            updateTime();


            var timer_server = document.querySelector('.boss-timer-' + server);
Date.prototype.addTime = function (ms) {
            if (timer_server !== undefined && timer_server !== null) {
    this.setTime(this.getTime() + ms);
                setInterval(function () {
    return this;
                    diffTime = diffTime - 1000;
}
                    if (diffTime < 0) {
                        diffTime = 7200000
                        updateDungeon();
                    }
                    updateTime();
                }, 1000);
            }
        }


        var images = document.querySelectorAll('.boss-timer-image img');
function closestHigher(number, candidates) {
        for (let image of images) {
    var bestCandidate = Infinity;
            image.style.display = 'inline-block'
    var higherCandidates = candidates.filter(function (candidate) { return candidate > number });
        }
    higherCandidates.forEach(function (candidate) {
        if (candidate < bestCandidate) bestCandidate = candidate;
    });
    return bestCandidate;
}


        start_timer('NA', 'US/Pacific');
var getTimezoneOffset = (timeZone, date = new Date()) => {
        start_timer('EU', 'CET');
    var tz = date.toLocaleString("en", { timeZone, timeStyle: "long" }).split(" ").slice(-1)[0];
     }
     var dateString = date.toString();
    function iOS() {
    var offset = Date.parse(`${dateString} UTC`) - Date.parse(`${dateString} ${tz}`);
        return [
     return offset;
            'iPad Simulator',
}
            'iPhone Simulator',
            'iPod Simulator',
            'iPad',
            'iPhone',
            'iPod'
        ].includes(navigator.platform)
            // iPad on iOS 13 detection
            || (navigator.userAgent.includes("Mac") && "ontouchend" in document)
     }


    if (iOS()) $('.boss-timer').hide();
// Detect when tab is invisible
});
var hidden, visibilityChange;
if (typeof document.hidden !== "undefined") {
    hidden = "hidden";
    visibilityChange = "visibilitychange";
} else if (typeof document.msHidden !== "undefined") {
    hidden = "msHidden";
    visibilityChange = "msvisibilitychange";
} else if (typeof document.webkitHidden !== "undefined") {
    hidden = "webkitHidden";
    visibilityChange = "webkitvisibilitychange";
}

Latest revision as of 22:57, 29 February 2024

$(function () {
    var timer = document.querySelector('.boss-timer');
    if (!timer) return;

    var bosses = {
        boss1: {
            href: '/w/The Great Steel Wall',
            img: '/wiki/images/2/22/20-4Button.png'
        },
        boss2: {
            href: '/w/Plegas\'s Labyrinth',
            img: '/wiki/images/1/17/17-3Button.png'
        }
    }

    var breakdown_hours = [];
    var i = 0;
    while (i < 24) {
        if (i % 2 > 0) breakdown_hours.push(i)
        i++
    }

    var boss1_hours = [];
    var i = 1;
    while (i < 24) {
        boss1_hours.push(i);
        i += i % 2 === 0 ? 3 : 1;
    }

    var status = {
        NA: {
            boss1: true,
            boss2: true
        },
        EU: {
            boss1: true,
            boss2: true
        }
    }

    function start_timer(server, UTC_offset) {
        var timers = null;
        UTC_offset = getTimezoneOffset(UTC_offset);

        var date1;
        var date2 = new Date();
        date2.addMinutes(date2.getTimezoneOffset());
        date2.addTime(UTC_offset);
        var hourNow;

        function updateDungeon() {
            date1 = new Date();
            date1.addMinutes(date1.getTimezoneOffset());
            date1.addTime(UTC_offset);
            hourNow = date1.getHours();
            var current = [];
            if (boss1_hours.includes(hourNow) && status[server].boss2) {
                status[server].boss1 = true;
                status[server].boss2 = false;
                current[server] = 'boss1';
            } else if (!boss1_hours.includes(hourNow) && status[server].boss1) {
                status[server].boss1 = false;
                status[server].boss2 = true;
                current[server] = 'boss2';
            }
            var currBoss = current[server];
            var currBossData = bosses[currBoss].href ? bosses[currBoss] : bosses[currBoss][server];
            var timer_img = $('.boss-timer-' + server + ' .boss-timer-image img');
            timer_img.attr('srcset', currBossData.img).attr('src', currBossData.img);
            $('.boss-timer-' + server + ' .boss-timer-image a').attr('href', currBossData.href);
            var localizationID = '#' + currBoss + '-localization-' + server;
            var localization = $(localizationID).text();
            console.table(localizationID, localization);
            if (!localization) {
                localization = $(localizationID.replace(server, 'NA')).text();
            }
            $('.boss-timer-' + server + ' .boss-timer-text').text(localization);
        }
        updateDungeon();

        var closestBreakdown = closestHigher(hourNow, breakdown_hours);
        if (hourNow == 23) {
            date2.addHours(2);
        } else {
            date2.addHours(closestBreakdown - hourNow);
        }
        date2.setMinutes(0);
        date2.setSeconds(0);

        var diffTime = Math.abs(date2 - date1);
        function updateTime() {
            $('.boss-timer-' + server + ' .boss-timer-countdown').text(msToTime(diffTime));
        }
        updateTime();

        var timer_server = document.querySelector('.boss-timer-' + server);
        if (!timer_server) return;
        if (timers) return;

        function updateTimers() {
            diffTime = diffTime - 1000;
            if (diffTime < 0) {
                diffTime = 7200000
                updateDungeon();
            }
            updateTime();
        }
        timers = setInterval(updateTimers, 1000);
    }

    start_timer('NA', 'US/Pacific');
    start_timer('EU', 'CET');

    $('.boss-timer img').css('display', 'inline-block');

    if (isApple()) $('.boss-timer').hide();

});

function isApple() {
    return [
        'iPad Simulator',
        'iPhone Simulator',
        'iPod Simulator',
        'iPad',
        'iPhone',
        'iPod'
    ].includes(navigator.platform)
        // iPad on iOS 13 detection
        || (navigator.userAgent.includes("Mac"))
}

function msToTime(s) {

    s = parseInt(s);

    // Pad to 2 or 3 digits, default is 2
    function pad(n, z) {
        z = z || 2;
        return ('00' + n).slice(-z);
    }

    var ms = s % 1000;
    s = (s - ms) / 1000;
    var secs = s % 60;
    s = (s - secs) / 60;
    var mins = s % 60;
    var hrs = (s - mins) / 60;

    return pad(hrs) + ':' + pad(mins) + ':' + pad(secs)
}

Date.prototype.addHours = function (h) {
    this.setTime(this.getTime() + (h * 60 * 60 * 1000));
    return this;
}

Date.prototype.addMinutes = function (m) {
    this.setTime(this.getTime() + (m * 60 * 1000));
    return this;
}

Date.prototype.addTime = function (ms) {
    this.setTime(this.getTime() + ms);
    return this;
}

function closestHigher(number, candidates) {
    var bestCandidate = Infinity;
    var higherCandidates = candidates.filter(function (candidate) { return candidate > number });
    higherCandidates.forEach(function (candidate) {
        if (candidate < bestCandidate) bestCandidate = candidate;
    });
    return bestCandidate;
}

var getTimezoneOffset = (timeZone, date = new Date()) => {
    var tz = date.toLocaleString("en", { timeZone, timeStyle: "long" }).split(" ").slice(-1)[0];
    var dateString = date.toString();
    var offset = Date.parse(`${dateString} UTC`) - Date.parse(`${dateString} ${tz}`);
    return offset;
}

// Detect when tab is invisible
var hidden, visibilityChange;
if (typeof document.hidden !== "undefined") {
    hidden = "hidden";
    visibilityChange = "visibilitychange";
} else if (typeof document.msHidden !== "undefined") {
    hidden = "msHidden";
    visibilityChange = "msvisibilitychange";
} else if (typeof document.webkitHidden !== "undefined") {
    hidden = "webkitHidden";
    visibilityChange = "webkitvisibilitychange";
}