Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions data/achievements.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 16 additions & 2 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
const express = require("express");
const compression = require("compression");
const helmet = require("helmet");
const achievements = require('./data/achievements');
const m = require("./lib/functions");
const db = require("./lib/db");
let types = {
Expand Down Expand Up @@ -294,8 +295,21 @@ app.get('/player/:player', async (req, res) => {
if(req.params.player) {
let player = await m.searchUser(db, req.params.player);
if(player) {
let user = await(m.getUser(player['uuid']));
!user ? res.status(404).render('error', {status: '404', msg: 'User not found.'}) : res.render('player', {data: user,m});
let user = await m.getUser(player['uuid']);
if(!user) return res.status(404).render('error', {status: '404', msg: 'User not found.'});

let earnedAchievements = await m.getPlayerAchievements(player['uuid']);
// API may return objects with an `id` field or bare numeric IDs
const earnedIds = new Set(earnedAchievements.map(e => {
const val = typeof e === 'object' ? e.id : e;
return typeof val === 'string' ? parseInt(val, 10) : val;
}));
user.badges = achievements
.filter(a => earnedIds.has(a.id) && a.icon && (a.server || a.special))
.sort((a, b) => (b.server ? 1 : 0) - (a.server ? 1 : 0))
.map(a => ({ name: a.name, icon: a.icon, special: a.special, server: a.server }));

res.render('player', { data: user, m });
}
else {
res.status(404).render('error', {status: '500', msg: 'Oops! Minecraft user does not exist.'});
Expand Down
26 changes: 22 additions & 4 deletions lib/functions.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,14 @@ async function getVillages() {
// don't stress mojang api
async function searchUser(db, player) {
// check db first
let user = await db('player_data').where(!isUUID(player) ? {"username": player} : {"uuid": player}).select("username", "uuid");
let user = await db('player_data')
.whereRaw(
!isUUID(player)
? "LOWER(username) = LOWER(?)"
: "uuid = ?",
[player.trim()]
)
.select("username", "uuid");
if(user.length == 0) {

let p = await getMojangUser(player);
Expand Down Expand Up @@ -92,7 +99,17 @@ async function getUserVillage(uuid) {
// get user statistics
async function getUser(uuid) {
let u = await request(process.env.userURL+uuid);
return u && u['found'] ? u : false;
return u && u['found'] ? u : false;
}

// get player achievement completion from retromc api
async function getPlayerAchievements(uuid) {
let data = await request(`${process.env.achievementURL}?uuid=${uuid}`);
if (!data) return [];
// API may return an array directly or an object with an achievements property
if (Array.isArray(data)) return data;
if (Array.isArray(data.achievements)) return data.achievements;
return [];
}


Expand Down Expand Up @@ -334,7 +351,7 @@ function getRankColor(rank) {
case 'helper':
return '<span class="minecraft-dark-aqua minecraft-bold">Helper</span>';
case 'trooper':
return '<span class="minecraft-light-purple minecraft-bold">trooper</span>';
return '<span class="minecraft-light-purple minecraft-bold">Trooper</span>';
case 'donator':
return '<span class="minecraft-red">Donator</span>';
case 'donator+':
Expand Down Expand Up @@ -394,5 +411,6 @@ module.exports = {
isPlayerOnline,
getUsername,
getVillageName,
searchUser
searchUser,
getPlayerAchievements
}
Loading