MediaWiki:BossTimer.js: Difference between revisions

From Elwiki
No edit summary
No edit summary
Tags: Mobile edit Mobile web edit
Line 154: Line 154:
         start_timer('EU', 'CET');
         start_timer('EU', 'CET');
     }
     }
     function iOS() {
     function isApple() {
         return [
         return [
             'iPad Simulator',
             'iPad Simulator',
Line 164: Line 164:
         ].includes(navigator.platform)
         ].includes(navigator.platform)
             // iPad on iOS 13 detection
             // iPad on iOS 13 detection
             || (navigator.userAgent.includes("Mac") && "ontouchend" in document)
             || (navigator.userAgent.includes("Mac"))
     }
     }


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

Revision as of 13:03, 21 May 2022

function docReady(fn) {
    // see if DOM is already available
    if (document.readyState === "complete" || document.readyState === "interactive") {
        // call on next available tick
        setTimeout(fn, 1);
    } else {
        document.addEventListener("DOMContentLoaded", fn);
    }
}

docReady(function () {
    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;
    }

    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;
    }

    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;
    }

    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)
    }

    var timer = document.querySelector('.boss-timer')
    if (timer !== null && timer !== undefined) {
        var breakdown_hours = [];
        var i = 0;
        while (i < 24) {
            if (i % 2 > 0) breakdown_hours.push(i)
            i++
        }

        var grotto_hours = [];
        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) {
            UTC_offset = getTimezoneOffset(UTC_offset);

            is_grotto[server] = true;
            is_plegas[server] = true;

            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();
                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);
            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() {
                document.querySelector('.boss-timer-' + server + ' .boss-timer-countdown').innerHTML = msToTime(diffTime);
            }
            updateTime();

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

        var images = document.querySelectorAll('.boss-timer-image img');
        for (let image of images) {
            image.style.display = 'inline-block'
        }

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

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