MediaWiki:Common.js: Difference between revisions
MediaWiki interface page
More actions
Load Central stats on wiki profiles |
Level infobox |
||
| Line 1: | Line 1: | ||
function abCompactCount(n) { | |||
var num = Number(n) || 0; | |||
if (num >= 1e9) { | |||
return (num / 1e9).toFixed(1).replace(/\.0$/, '') + 'B'; | |||
} | |||
if (num >= 1e6) { | |||
return (num / 1e6).toFixed(1).replace(/\.0$/, '') + 'M'; | |||
} | |||
if (num >= 1e3) { | |||
return (num / 1e3).toFixed(1).replace(/\.0$/, '') + 'K'; | |||
} | |||
return String(Math.floor(num)); | |||
} | |||
$(function () { | |||
var levelId = mw.config.get('abLevelId'); | |||
var $box = $('.ab-level-infobox'); | |||
if (!levelId || !$box.length) { | |||
return; | |||
} | |||
var defaultThumbs = ['82374078680299', '105249369413891', '104825146904235']; | |||
function thumbAssetId(level) { | |||
if (!level || level.locked) { | |||
return defaultThumbs[0]; | |||
} | |||
var raw = String(level.thumbnail || '').replace(/^rbxassetid:\/\//i, '').replace(/[^0-9]/g, ''); | |||
if (raw && raw !== '0') { | |||
return raw; | |||
} | |||
return defaultThumbs[Math.abs(Number(level.id) || Number(levelId) || 0) % defaultThumbs.length]; | |||
} | |||
function setThumb(assetId) { | |||
var $thumb = $box.find('.ab-level-thumb'); | |||
if (!$thumb.length || !assetId) { | |||
return; | |||
} | |||
fetch( | |||
'https://adventure-builder.net/api/roblox-proxy?service=thumbnails&assetIds=' + | |||
encodeURIComponent(assetId) + | |||
'&size=' + | |||
encodeURIComponent('420x420') | |||
) | |||
.then(function (res) { | |||
return res.ok ? res.json() : null; | |||
}) | |||
.then(function (data) { | |||
var item = data && data.data && data.data[0]; | |||
if (!item || item.state !== 'Completed' || !item.imageUrl) { | |||
return; | |||
} | |||
$thumb.attr('src', item.imageUrl).removeClass('ab-level-thumb--placeholder'); | |||
}) | |||
.catch(function () {}); | |||
} | |||
fetch('https://adventure-builder.net/api/v1/levels/' + encodeURIComponent(levelId)) | |||
.then(function (res) { | |||
return res.ok ? res.json() : null; | |||
}) | |||
.then(function (data) { | |||
var level = data && (data.level || data); | |||
if (!level || level.locked || !level.id) { | |||
setThumb(defaultThumbs[0]); | |||
return; | |||
} | |||
if (level.title) { | |||
$box.find('.pi-title').text(level.title); | |||
} | |||
[ | |||
['plays', level.plays], | |||
['clears', level.clears], | |||
['favorites', level.favorites] | |||
].forEach(function (pair) { | |||
$box.find('.ab-level-stat[data-stat="' + pair[0] + '"]').text( | |||
abCompactCount(pair[1]) | |||
); | |||
}); | |||
setThumb(thumbAssetId(level)); | |||
}) | |||
.catch(function () { | |||
if ($box.find('.ab-level-thumb--placeholder').length) { | |||
setThumb(defaultThumbs[Math.abs(Number(levelId) || 0) % defaultThumbs.length]); | |||
} | |||
}); | |||
}); | |||
$(function () { | $(function () { | ||
var userId = mw.config.get('abRobloxUserId'); | var userId = mw.config.get('abRobloxUserId'); | ||
| Line 21: | Line 110: | ||
if (!$stats.length) { | if (!$stats.length) { | ||
return; | return; | ||
} | } | ||
| Line 54: | Line 129: | ||
$('<li>') | $('<li>') | ||
.addClass('ab-central-stat') | .addClass('ab-central-stat') | ||
.text( | .text(abCompactCount(pair[0]) + ' ' + pair[1]) | ||
.appendTo($stats); | .appendTo($stats); | ||
}); | }); | ||
Revision as of 21:15, 27 August 2026
function abCompactCount(n) {
var num = Number(n) || 0;
if (num >= 1e9) {
return (num / 1e9).toFixed(1).replace(/\.0$/, '') + 'B';
}
if (num >= 1e6) {
return (num / 1e6).toFixed(1).replace(/\.0$/, '') + 'M';
}
if (num >= 1e3) {
return (num / 1e3).toFixed(1).replace(/\.0$/, '') + 'K';
}
return String(Math.floor(num));
}
$(function () {
var levelId = mw.config.get('abLevelId');
var $box = $('.ab-level-infobox');
if (!levelId || !$box.length) {
return;
}
var defaultThumbs = ['82374078680299', '105249369413891', '104825146904235'];
function thumbAssetId(level) {
if (!level || level.locked) {
return defaultThumbs[0];
}
var raw = String(level.thumbnail || '').replace(/^rbxassetid:\/\//i, '').replace(/[^0-9]/g, '');
if (raw && raw !== '0') {
return raw;
}
return defaultThumbs[Math.abs(Number(level.id) || Number(levelId) || 0) % defaultThumbs.length];
}
function setThumb(assetId) {
var $thumb = $box.find('.ab-level-thumb');
if (!$thumb.length || !assetId) {
return;
}
fetch(
'https://adventure-builder.net/api/roblox-proxy?service=thumbnails&assetIds=' +
encodeURIComponent(assetId) +
'&size=' +
encodeURIComponent('420x420')
)
.then(function (res) {
return res.ok ? res.json() : null;
})
.then(function (data) {
var item = data && data.data && data.data[0];
if (!item || item.state !== 'Completed' || !item.imageUrl) {
return;
}
$thumb.attr('src', item.imageUrl).removeClass('ab-level-thumb--placeholder');
})
.catch(function () {});
}
fetch('https://adventure-builder.net/api/v1/levels/' + encodeURIComponent(levelId))
.then(function (res) {
return res.ok ? res.json() : null;
})
.then(function (data) {
var level = data && (data.level || data);
if (!level || level.locked || !level.id) {
setThumb(defaultThumbs[0]);
return;
}
if (level.title) {
$box.find('.pi-title').text(level.title);
}
[
['plays', level.plays],
['clears', level.clears],
['favorites', level.favorites]
].forEach(function (pair) {
$box.find('.ab-level-stat[data-stat="' + pair[0] + '"]').text(
abCompactCount(pair[1])
);
});
setThumb(thumbAssetId(level));
})
.catch(function () {
if ($box.find('.ab-level-thumb--placeholder').length) {
setThumb(defaultThumbs[Math.abs(Number(levelId) || 0) % defaultThumbs.length]);
}
});
});
$(function () {
var userId = mw.config.get('abRobloxUserId');
if (!userId) {
return;
}
var $img = $('.profile-avatar-image');
if ($img.length) {
var fallback = $img.attr('src');
$img.on('error', function () {
$img.attr('src', fallback);
});
$img.attr(
'src',
'https://adventure-builder.net/api/roblox-proxy?service=profile-picture&userId=' +
encodeURIComponent(userId)
);
}
var $stats = $('.profile-header-statistics');
if (!$stats.length) {
return;
}
fetch(
'https://adventure-builder.net/api/v1/profiles/' + encodeURIComponent(userId)
)
.then(function (res) {
return res.ok ? res.json() : null;
})
.then(function (profile) {
if (!profile) {
return;
}
[
[profile.levels_count, 'Levels'],
[profile.clears, 'Clears'],
[profile.followers, 'Followers']
].forEach(function (pair) {
$('<li>')
.addClass('ab-central-stat')
.text(abCompactCount(pair[0]) + ' ' + pair[1])
.appendTo($stats);
});
})
.catch(function () {});
});