Skip to content

Commit e9396a3

Browse files
committed
feat: add ability to sync xp from polaris (wip)
1 parent ce93ddd commit e9396a3

File tree

1 file changed

+91
-1
lines changed

1 file changed

+91
-1
lines changed

api/index.ts

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ app.post("/admin/:action/:guild/:target", authMiddleware, async (req, res) => {
175175
switch (target) {
176176
case "enable":
177177
try {
178-
const [err, success] = await enableUpdates(guild, extraData.channelId);
178+
const [err, success] = await enableUpdates(guild);
179179
if (err) {
180180
return res.status(500).json({ message: "Internal server error", err });
181181
} else {
@@ -328,6 +328,28 @@ app.post("/admin/:action/:guild/:target", authMiddleware, async (req, res) => {
328328
return res.status(500).json({ message: "Internal server error" });
329329
}
330330
}
331+
case "sync": {
332+
if(target !== "polaris") {
333+
return res.status(400).json({ message: "Illegal request" });
334+
}
335+
336+
switch(target) {
337+
case "polaris": {
338+
try {
339+
const [err, success] = await syncFromPolaris(guild);
340+
if (err) {
341+
return res.status(500).json({ message: "Internal server error", err });
342+
} else {
343+
return res.status(200).json(success);
344+
}
345+
} catch (err) {
346+
return res.status(500).json({ message: "Internal server error", err });
347+
}
348+
}
349+
default:
350+
return res.status(500).json({ message: "Internal server error" });
351+
}
352+
}
331353
default:
332354
return res.status(400).json({ message: "Illegal request" });
333355
}
@@ -434,3 +456,71 @@ async function adminRolesAdd(guild: string, role: string, level: number) {
434456
});
435457
}
436458
//#endregion
459+
460+
//#region Syncing
461+
async function syncFromPolaris(guild: string) {
462+
const res = await fetch(`https://gdcolon.com/polaris/api/leaderboard/${guild}`);
463+
const data = await res.json();
464+
const users = data.leaderboard;
465+
for(let i = 1; i < data.pageInfo.pageCount; i++) {
466+
const res = await fetch(`https://gdcolon.com/polaris/api/leaderboard/${guild}?page=${i + 1}`);
467+
const data = await res.json();
468+
users.push(...data.leaderboard);
469+
}
470+
471+
if(users.length === 0) {
472+
return [new Error("No users found"), false];
473+
}
474+
475+
console.log(users.length)
476+
477+
const insertQuery = `
478+
INSERT INTO users
479+
(id, guild_id, xp, pfp, name, nickname, level, xp_needed_next_level, progress_next_level)
480+
VALUES
481+
`;
482+
483+
const insertValues: string[] = [];
484+
485+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
486+
for(const _user of users) {
487+
insertValues.push(`(?, ?, ?, ?, ?, ?, ?, ?, ?)`);
488+
}
489+
490+
console.log(insertValues.length)
491+
492+
const formattedUsers = users.map((user: { id: string, xp: number, avatar: string, username: string, nickname: string, displayName: string }) => {
493+
const xpValue = user.xp;
494+
const level = Math.floor(Math.sqrt(xpValue / 100));
495+
const nextLevel = level + 1;
496+
const nextLevelXp = Math.pow(nextLevel, 2) * 100;
497+
const xpNeededForNextLevel = nextLevelXp - xpValue;
498+
const currentLevelXp = Math.pow(level, 2) * 100;
499+
const progressToNextLevel =
500+
((xpValue - currentLevelXp) / (nextLevelXp - currentLevelXp)) * 100;
501+
return [
502+
user.id,
503+
guild,
504+
xpValue,
505+
user.avatar,
506+
user.username,
507+
user.nickname ?? user.displayName,
508+
level,
509+
xpNeededForNextLevel,
510+
progressToNextLevel.toFixed(2),
511+
];
512+
})
513+
514+
return new Promise((resolve, reject) => {
515+
pool.query(insertQuery + "\n" + insertValues.join(","), formattedUsers, (err) =>
516+
{
517+
if (err) {
518+
console.error("Error syncing from Polaris:", err);
519+
reject([err, false]);
520+
} else {
521+
resolve([null, true]);
522+
}
523+
});
524+
});
525+
}
526+
//#endregion

0 commit comments

Comments
 (0)