diff --git a/routes/stats.js b/routes/stats.js
index d27dd036..4a07f236 100644
--- a/routes/stats.js
+++ b/routes/stats.js
@@ -24,11 +24,12 @@ module.exports = (app, mongo) => {
}
});
- app.get('/leaderboard', async (req, res) => {
+ app.get('/leaderboard', expressLayouts, async (req, res) => {
const leaderboard = await generateLeaderboard(mongo.User, 10);
- res.render(VIEWS + 'private/leaderboard.ejs', {
+ res.render(VIEWS + 'private/leaderboardV2.ejs', {
rankings: leaderboard,
pageName: 'Leaderboard',
+ layout: 'layouts/base.ejs',
});
});
diff --git a/views/private/leaderboardV2.ejs b/views/private/leaderboardV2.ejs
new file mode 100644
index 00000000..b1e81e24
--- /dev/null
+++ b/views/private/leaderboardV2.ejs
@@ -0,0 +1,138 @@
+<%
+ const rankBg = (r) => {
+ if (r === 1) return 'bg-sky-500 text-white';
+ if (r === 2) return 'bg-yellow-400';
+ if (r === 3) return 'bg-red-500 text-white';
+ return 'bg-green-500 text-white';
+ };
+ const medalSrc = (r) => {
+ if (r === 1) return 'https://cdn.mutorials.org/images/icons/Leaderboard_First.svg';
+ if (r === 2) return 'https://cdn.mutorials.org/images/icons/Leaderboard_Second.svg';
+ if (r === 3) return 'https://cdn.mutorials.org/images/icons/Leaderboard_Third.svg';
+ return null;
+ };
+ const truncate = (s, n) => s.length <= n ? s : s.substring(0, n - 3) + '...';
+%>
+
+<%- contentFor('main') %>
+
+
+
Rating Leaderboard
+
+
+ <% [
+ ['Physics', rankings.physics, (u) => u.rating.physics],
+ ['Chemistry', rankings.chem, (u) => u.rating.chemistry],
+ ['Biology', rankings.bio, (u) => u.rating.biology],
+ ['USABO', rankings.usabo, (u) => u.rating.usabo],
+ ].forEach(([title, list, getValue]) => { %>
+
+
<%= title %>
+
+
+
+
+ | Rank |
+ Username |
+ Rating |
+
+
+
+ <% let rank = 1; %>
+ <% list.forEach((user) => { %>
+
+
+ <% const medal = medalSrc(rank); %>
+ <% if (medal) { %>
+
+ <% } else { %>
+ <%= rank %>
+ <% } %>
+ |
+ <%= truncate(user.ign, 15) %> |
+ <%= getValue(user) %> |
+
+ <% rank++; %>
+ <% }) %>
+
+
+
+
+ <% }) %>
+
+
+
Problem Rush Leaderboard
+
+
+
Highest Rush Scores
+
+
+
+
+ | Rank |
+ Username |
+ High Score |
+ Attempts |
+
+
+
+ <% let rankRush = 1; %>
+ <% rankings.rush.forEach((user) => { %>
+
+
+ <% const medal = medalSrc(rankRush); %>
+ <% if (medal) { %>
+
+ <% } else { %>
+ <%= rankRush %>
+ <% } %>
+ |
+ <%= truncate(user.ign, 33) %> |
+ <%= user.stats.rush.highscore %> |
+ <%= user.stats.rush.attempts %> |
+
+ <% rankRush++; %>
+ <% }) %>
+
+
+
+
+
+
Experience Leaderboard
+
+
+
Highest Level Mutorials Users
+
+
+
+
+ | Rank |
+ Username |
+ Level |
+ Experience |
+
+
+
+ <% let rankExp = 1; %>
+ <% rankings.experience.forEach((user) => { %>
+
+
+ <% const medal = medalSrc(rankExp); %>
+ <% if (medal) { %>
+
+ <% } else { %>
+ <%= rankExp %>
+ <% } %>
+ |
+ <%= truncate(user.ign, 33) %> |
+ <%= user.level.level %> |
+ <%= Math.round(user.experience) %> |
+
+ <% rankExp++; %>
+ <% }) %>
+
+
+
+
+
+