MediaWiki:BossTimer.js: Difference between revisions
From Elwiki
No edit summary |
No edit summary |
||
(14 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
function | $(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 | 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 | 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'); | |||
if (timer | 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"; | |||
} |
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";
}