From af8096ea8ab7c5570929608bb5662f938c0b65c0 Mon Sep 17 00:00:00 2001 From: mat <27899617+mat-1@users.noreply.github.com> Date: Wed, 24 Mar 2021 22:09:31 -0500 Subject: improve mojang api to be much much faster --- build/hypixelCached.js | 3 ++- build/mojang.js | 53 ++++++++++++++++++++++++++++++++++++++------------ build/util.js | 7 ++++++- 3 files changed, 49 insertions(+), 14 deletions(-) (limited to 'build') diff --git a/build/hypixelCached.js b/build/hypixelCached.js index 88397bf..82e8c93 100644 --- a/build/hypixelCached.js +++ b/build/hypixelCached.js @@ -32,6 +32,7 @@ const hypixel = __importStar(require("./hypixel")); const util_1 = require("./util"); const _1 = require("."); // cache usernames for 4 hours +/** uuid: username */ const usernameCache = new node_cache_1.default({ stdTTL: 60 * 60 * 4, checkperiod: 60, @@ -85,7 +86,7 @@ function waitForCacheSet(cache, key, value) { */ async function uuidFromUser(user) { // if the user is 32 characters long, it has to be a uuid - if (util_1.undashUuid(user).length === 32) + if (util_1.isUuid(user)) return util_1.undashUuid(user); if (usernameCache.has(util_1.undashUuid(user))) { // check if the uuid is a key diff --git a/build/mojang.js b/build/mojang.js index b8bfa44..052f813 100644 --- a/build/mojang.js +++ b/build/mojang.js @@ -6,39 +6,68 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.usernameFromUser = exports.uuidFromUser = exports.mojangDataFromUser = void 0; +exports.usernameFromUser = exports.mojangDataFromUser = exports.uuidFromUser = exports.usernameFromUuid = exports.uuidFromUsername = exports.mojangDataFromUuid = void 0; const node_fetch_1 = __importDefault(require("node-fetch")); const https_1 = require("https"); +const util_1 = require("./util"); // We need to create an agent to prevent memory leaks const httpsAgent = new https_1.Agent({ keepAlive: true }); /** - * Get mojang api data from ashcon.app + * Get mojang api data from the session server */ -async function mojangDataFromUser(user) { +async function mojangDataFromUuid(uuid) { + console.log('mojangDataFromUuid', uuid); const fetchResponse = await node_fetch_1.default( - // we use v1 rather than v2 since its more stable - `https://api.ashcon.app/mojang/v1/user/${user}`, { agent: () => httpsAgent }); - return await fetchResponse.json(); + // using mojang directly is faster than ashcon lol, also mojang removed the ratelimits from here + `https://sessionserver.mojang.com/session/minecraft/profile/${util_1.undashUuid(uuid)}`, { agent: () => httpsAgent }); + const data = await fetchResponse.json(); + return { + uuid: data.id, + username: data.name + }; } -exports.mojangDataFromUser = mojangDataFromUser; +exports.mojangDataFromUuid = mojangDataFromUuid; +async function uuidFromUsername(username) { + console.log('uuidFromUsername', username); + // since we don't care about anything other than the uuid, we can use /uuid/ instead of /user/ + const fetchResponse = await node_fetch_1.default(`https://api.ashcon.app/mojang/v2/uuid/${username}`, { agent: () => httpsAgent }); + const userUuid = await fetchResponse.text(); + return userUuid.replace(/-/g, ''); +} +exports.uuidFromUsername = uuidFromUsername; +async function usernameFromUuid(uuid) { + const userJson = await mojangDataFromUuid(uuid); + return userJson.username; +} +exports.usernameFromUuid = usernameFromUuid; /** * Fetch the uuid from a user * @param user A user can be either a uuid or a username */ async function uuidFromUser(user) { - const fetchJSON = await mojangDataFromUser(user); - return fetchJSON.uuid.replace(/-/g, ''); + if (util_1.isUuid(user)) + // already a uuid, just return it undashed + return util_1.undashUuid(user); + else + return await uuidFromUsername(user); } exports.uuidFromUser = uuidFromUser; +async function mojangDataFromUser(user) { + if (!util_1.isUuid(user)) + return await mojangDataFromUuid(await uuidFromUsername(user)); + else + return await mojangDataFromUuid(user); +} +exports.mojangDataFromUser = mojangDataFromUser; /** * Fetch the username from a user * @param user A user can be either a uuid or a username */ async function usernameFromUser(user) { - // get a minecraft uuid from a username, using ashcon.app's mojang api - const fetchJSON = await mojangDataFromUser(user); - return fetchJSON.username; + // we do this to fix the capitalization + const data = await mojangDataFromUser(user); + return data.username; } exports.usernameFromUser = usernameFromUser; diff --git a/build/util.js b/build/util.js index df88635..e7ec9a6 100644 --- a/build/util.js +++ b/build/util.js @@ -3,7 +3,7 @@ * Random utility functions that are not related to Hypixel */ Object.defineProperty(exports, "__esModule", { value: true }); -exports.sleep = exports.colorCodeFromName = exports.minecraftColorCodes = exports.shuffle = exports.jsonToQuery = exports.queryToJson = exports.undashUuid = void 0; +exports.isUuid = exports.sleep = exports.colorCodeFromName = exports.minecraftColorCodes = exports.shuffle = exports.jsonToQuery = exports.queryToJson = exports.undashUuid = void 0; function undashUuid(uuid) { return uuid.replace(/-/g, '').toLowerCase(); } @@ -82,3 +82,8 @@ async function sleep(ms) { await new Promise(resolve => setTimeout(resolve, ms)); } exports.sleep = sleep; +/** Returns whether a string is a UUID4 (Minecraft uuid) */ +function isUuid(string) { + return undashUuid(string).length === 32; +} +exports.isUuid = isUuid; -- cgit