MediaWiki:BossTimer.js: Difference between revisions
From Elwiki
No edit summary |
No edit summary |
||
(12 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
$(function () { | $(function () { | ||
var timer = document.querySelector('.boss-timer'); | var timer = document.querySelector('.boss-timer'); | ||
if (timer | if (!timer) return; | ||
var bosses = { | |||
boss1: { | |||
href: '/w/The Great Steel Wall', | |||
img: '/wiki/images/2/22/20-4Button.png' | |||
href: '/w/ | |||
img: '/wiki/images/ | |||
}, | }, | ||
boss2: { | |||
href: '/w/Plegas\'s Labyrinth', | href: '/w/Plegas\'s Labyrinth', | ||
img: '/wiki/images/1/17/17-3Button.png' | img: '/wiki/images/1/17/17-3Button.png' | ||
} | } | ||
} | } | ||
Line 74: | Line 21: | ||
} | } | ||
var | var boss1_hours = []; | ||
var i = 1; | var i = 1; | ||
while (i < 24) { | while (i < 24) { | ||
boss1_hours.push(i); | |||
i += i % 2 === 0 ? 3 : 1; | i += i % 2 === 0 ? 3 : 1; | ||
} | } | ||
Line 83: | Line 30: | ||
var status = { | var status = { | ||
NA: { | NA: { | ||
boss1: true, | |||
boss2: true | |||
}, | }, | ||
EU: { | EU: { | ||
boss1: true, | |||
boss2: true | |||
} | } | ||
} | } | ||
function start_timer(server, UTC_offset) { | function start_timer(server, UTC_offset) { | ||
var timers = null; | |||
UTC_offset = getTimezoneOffset(UTC_offset); | UTC_offset = getTimezoneOffset(UTC_offset); | ||
Line 107: | Line 55: | ||
hourNow = date1.getHours(); | hourNow = date1.getHours(); | ||
var current = []; | var current = []; | ||
if ( | if (boss1_hours.includes(hourNow) && status[server].boss2) { | ||
status[server]. | status[server].boss1 = true; | ||
status[server]. | status[server].boss2 = false; | ||
current[server] = ' | current[server] = 'boss1'; | ||
} else if (! | } else if (!boss1_hours.includes(hourNow) && status[server].boss1) { | ||
status[server]. | status[server].boss1 = false; | ||
status[server]. | status[server].boss2 = true; | ||
current[server] = ' | 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'); | var timer_img = $('.boss-timer-' + server + ' .boss-timer-image img'); | ||
timer_img.attr('srcset', | timer_img.attr('srcset', currBossData.img).attr('src', currBossData.img); | ||
$('.boss-timer-' + server + ' .boss-timer-image a').attr('href', | $('.boss-timer-' + server + ' .boss-timer-image a').attr('href', currBossData.href); | ||
$('.boss-timer-' + server + ' .boss-timer-text').text( | 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(); | updateDungeon(); | ||
Line 139: | Line 95: | ||
var timer_server = document.querySelector('.boss-timer-' + server); | var timer_server = document.querySelector('.boss-timer-' + server); | ||
if (timer_server | if (!timer_server) return; | ||
if (timers) return; | |||
function updateTimers() { | |||
diffTime = diffTime - 1000; | diffTime = diffTime - 1000; | ||
if (diffTime < 0) { | if (diffTime < 0) { | ||
Line 147: | Line 105: | ||
} | } | ||
updateTime(); | updateTime(); | ||
}, 1000); | } | ||
timers = setInterval(updateTimers, 1000); | |||
} | } | ||
Line 154: | Line 113: | ||
$('.boss-timer img').css('display', 'inline-block'); | $('.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";
}