MediaWiki:BossTimer.js
From Elwiki
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
$(function () {
var timer = document.querySelector('.boss-timer');
if (!timer) return;
var bosses = {
boss1: {
EU: {
href: '/w/Titan\'s Grotto',
img: '/wiki/images/8/84/13-5Button.png'
},
NA: {
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 = $(currBossData[localizationID]).text();
if (!localization) {
localization = $(currBossData[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;
timers = setInterval(function () {
diffTime = diffTime - 1000;
if (diffTime < 0) {
diffTime = 7200000
updateDungeon();
}
updateTime();
}, 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;
}