aboutsummaryrefslogtreecommitdiff
path: root/build/database.js
diff options
context:
space:
mode:
authormat <27899617+mat-1@users.noreply.github.com>2021-02-28 01:35:46 -0600
committermat <27899617+mat-1@users.noreply.github.com>2021-02-28 01:35:46 -0600
commit5bf261102017e6489af9b604a3a60cc8083c97d7 (patch)
treef1896edd1a44f5f09a7727f67b89a5295196f039 /build/database.js
parentce7bd034cd5bd763c01674055ea88203bf806744 (diff)
parent3fb0c21c294a4ff02353e5726d5ef1c21c39cb0d (diff)
downloadskyblock-api-5bf261102017e6489af9b604a3a60cc8083c97d7.tar.gz
skyblock-api-5bf261102017e6489af9b604a3a60cc8083c97d7.tar.bz2
skyblock-api-5bf261102017e6489af9b604a3a60cc8083c97d7.zip
Merge branch 'main' of https://github.com/skyblockstats/skyblock-api into main
Diffstat (limited to 'build/database.js')
-rw-r--r--build/database.js64
1 files changed, 56 insertions, 8 deletions
diff --git a/build/database.js b/build/database.js
index 31c85ee..737b0a3 100644
--- a/build/database.js
+++ b/build/database.js
@@ -25,8 +25,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
-exports.updateDatabaseMember = void 0;
+exports.updateDatabaseMember = exports.fetchMemberLeaderboard = void 0;
const constants = __importStar(require("./constants"));
+const cached = __importStar(require("./hypixelCached"));
const mongodb_1 = require("mongodb");
const node_cache_1 = __importDefault(require("node-cache"));
// don't update the user for 3 minutes
@@ -57,7 +58,7 @@ function getMemberCollectionAttributes(member) {
return collectionAttributes;
}
function getMemberLeaderboardAttributes(member) {
- // if you want to add a new leaderboard for member attributes, add it here
+ // if you want to add a new leaderboard for member attributes, add it here (and getAllLeaderboardAttributes)
return {
// we use the raw stat names rather than the clean stats in case hypixel adds a new stat and it takes a while for us to clean it
...member.rawHypixelStats,
@@ -69,6 +70,19 @@ function getMemberLeaderboardAttributes(member) {
visited_zones: member.visited_zones.length,
};
}
+/** Fetch the names of all the leaderboards */
+async function fetchAllMemberLeaderboardAttributes() {
+ return [
+ // we use the raw stat names rather than the clean stats in case hypixel adds a new stat and it takes a while for us to clean it
+ ...await constants.fetchStats(),
+ // collection leaderboards
+ ...(await constants.fetchCollections()).map(value => `collection_${value}`),
+ 'fairy_souls',
+ 'first_join',
+ 'purse',
+ 'visited_zones',
+ ];
+}
async function fetchMemberLeaderboard(name) {
if (cachedLeaderboards.has(name))
return cachedLeaderboards.get(name);
@@ -76,16 +90,28 @@ async function fetchMemberLeaderboard(name) {
const query = {};
query[`stats.${name}`] = { '$exists': true };
const sortQuery = {};
- sortQuery[`stats.${name}`] = 1;
- const leaderboard = await memberLeaderboardsCollection.find(query).sort(sortQuery).toArray();
+ sortQuery[`stats.${name}`] = -1;
+ const leaderboardRaw = await memberLeaderboardsCollection.find(query).sort(sortQuery).limit(100).toArray();
+ const fetchLeaderboardPlayer = async (item) => {
+ return {
+ player: await cached.fetchPlayer(item.uuid),
+ value: item.stats[name]
+ };
+ };
+ const promises = [];
+ for (const item of leaderboardRaw) {
+ promises.push(fetchLeaderboardPlayer(item));
+ }
+ const leaderboard = await Promise.all(promises);
cachedLeaderboards.set(name, leaderboard);
return leaderboard;
}
-async function getLeaderboardRequirement(name) {
+exports.fetchMemberLeaderboard = fetchMemberLeaderboard;
+async function getMemberLeaderboardRequirement(name) {
const leaderboard = await fetchMemberLeaderboard(name);
// if there's more than 100 items, return the 100th. if there's less, return null
- if (leaderboard.length > 100)
- return leaderboard[100].stats[name];
+ if (leaderboard.length >= 100)
+ return leaderboard[99].value;
else
return null;
}
@@ -99,6 +125,7 @@ async function updateDatabaseMember(member) {
// store the member in recentlyUpdated so it cant update for 3 more minutes
recentlyUpdated.set(member.uuid, true);
await constants.addStats(Object.keys(member.rawHypixelStats));
+ await constants.addCollections(member.collections.map(value => value.name));
const leaderboardAttributes = getMemberLeaderboardAttributes(member);
await memberLeaderboardsCollection.updateOne({
uuid: member.uuid
@@ -112,4 +139,25 @@ async function updateDatabaseMember(member) {
});
}
exports.updateDatabaseMember = updateDatabaseMember;
-connect();
+/**
+ * Remove leaderboard attributes for members that wouldn't actually be on the leaderboard. This saves a lot of storage space
+ */
+async function removeBadMemberLeaderboardAttributes() {
+ const leaderboards = await fetchAllMemberLeaderboardAttributes();
+ for (const leaderboard of leaderboards) {
+ // wait 10 seconds so it doesnt use as much ram
+ await new Promise(resolve => setTimeout(resolve, 10000));
+ const unsetValue = {};
+ unsetValue[leaderboard] = '';
+ const filter = {};
+ const requirement = await getMemberLeaderboardRequirement(leaderboard);
+ if (requirement !== null) {
+ filter[`stats.${leaderboard}`] = {
+ '$lt': requirement
+ };
+ await memberLeaderboardsCollection.updateMany(filter, { '$unset': unsetValue });
+ }
+ }
+}
+connect()
+ .then(removeBadMemberLeaderboardAttributes);