Skip to content

Commit 5423052

Browse files
committed
feat: friendly leaderboard ranks
1 parent 85f52e6 commit 5423052

1 file changed

Lines changed: 82 additions & 0 deletions

File tree

src/base/leaderboard/friends.js

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
wrap(() => {
2+
let showFriends = false;
3+
let ready = 0;
4+
const friendRanks = [];
5+
let pageNumber = -1;
6+
let btn;
7+
8+
eventManager.once('Rankings:init', init);
9+
eventManager.once('Chat:Connected', () => {
10+
if (onPage('leaderboard')) init();
11+
});
12+
13+
function toggle() {
14+
showFriends = !showFriends;
15+
localStorage.removeItem('rankedLeaderboardPage');
16+
global('setupLeaderboard')();
17+
if (btn) {
18+
btn.classList.toggle('active', showFriends);
19+
}
20+
}
21+
22+
function init() {
23+
if (ready === -1) return;
24+
ready += 1;
25+
if (ready !== 2) return;
26+
ready = -1;
27+
28+
style.add('#navButtons > .active > .glyphicon-user { color: orange; }');
29+
30+
globalSet('getMaxPage', function getMaxPage() {
31+
if (showFriends) return Math.floor((friendRanks.length - 1) / global('maxDisplayPage'));
32+
return this.super();
33+
});
34+
35+
eventManager.on('preShowPage', function showPage(page) {
36+
if (showFriends) {
37+
show(page);
38+
this.canceled = true;
39+
}
40+
});
41+
42+
globalSet('getUserPageNum', function getUserPageNum() {
43+
if (showFriends) return pageNumber;
44+
return this.super();
45+
});
46+
47+
btn = document.createElement('button');
48+
btn.classList.add('btn', 'btn-primary');
49+
btn.addEventListener('click', toggle);
50+
btn.innerHTML = '<span class="glyphicon glyphicon-user green"></span>';
51+
52+
document.querySelectorAll('button.btn-lg').forEach((el) => el.classList.remove('btn-lg'));
53+
document.querySelector('#navButtons').append(btn);
54+
hover.new('Toggle friend rankings', btn);
55+
56+
const leaderboard = global('leaderboard');
57+
const selfId = global('sessionIdUser');
58+
59+
const selfIndex = leaderboard.findIndex(({ id }) => id === selfId);
60+
if (selfIndex >= 0) {
61+
pageNumber = Math.floor(selfIndex / global('maxDisplayPage'));
62+
global('userPageNumbers').push(pageNumber);
63+
}
64+
65+
const friends = global('selfFriends');
66+
friendRanks.push(...leaderboard
67+
.filter(({ id }) => id === selfId || friends.some(({ id: uid }) => id === uid))
68+
.map((i) => leaderboard.indexOf(i)));
69+
}
70+
71+
function show(page = 0) {
72+
$('.leaderboardSlot').remove();
73+
$('#btnSelf').prop('disabled', true);
74+
$('#btnNext').prop('disabled', page === global('getMaxPage')());
75+
const addSlot = global('addLeaderboardSlot');
76+
const max = global('maxDisplayPage');
77+
const start = page * max;
78+
friendRanks
79+
.slice(start, start + max)
80+
.forEach((row) => addSlot(row));
81+
}
82+
});

0 commit comments

Comments
 (0)