Skip to content

Commit 78122dd

Browse files
committed
feat(api): tracking
1 parent e5923ae commit 78122dd

File tree

2 files changed

+98
-9
lines changed

2 files changed

+98
-9
lines changed

api/src/db/queries/tracking.ts

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1+
// TODO: Move this file to a utils folder or something - this is NOT queries
2+
13
import { CronJob } from "cron";
4+
import { pool } from "..";
5+
import type { QueryError } from "mysql2";
26

37
let usersToUpdate: Record<string, string[]> = {};
8+
let timestamp: string
49

510
export async function addUserToTrackingData(userId: string, guildId: string) : Promise<void> {
611
console.log("Adding user to tracking data:", userId, guildId);
@@ -9,25 +14,87 @@ export async function addUserToTrackingData(userId: string, guildId: string) : P
914
}
1015
if (!usersToUpdate[guildId].includes(userId)) {
1116
usersToUpdate[guildId].push(userId);
17+
return;
1218
}
1319
return;
1420
}
1521

1622
async function doTrackingJob() {
23+
timestamp = new Date().toISOString().slice(0, 19).replace('T', ' ');
1724
const usersToUpdateTemp = { ...usersToUpdate };
1825
usersToUpdate = {};
26+
console.log("Updating users:", usersToUpdateTemp);
1927
if (!Object.keys(usersToUpdateTemp).length) {
2028
console.log("No users to update!");
2129
return;
2230
}
2331
const guildIds = Object.keys(usersToUpdateTemp);
2432
for (const guildId of guildIds) {
2533
const userIds = usersToUpdateTemp[guildId];
26-
for (const userId of userIds) {
27-
console.log(userId, guildId);
34+
const userIdsString = userIds.join(",");
35+
const [err, results] = await getUsersXp(userIdsString, guildId);
36+
if (err) {
37+
console.error("Error getting users:", err);
38+
return;
39+
}
40+
console.log("Results:", results);
41+
for (const result of results) {
42+
const { id, guild_id, xp } = result;
43+
await insertUserDataToTracking(id, guild_id, xp);
2844
}
2945
}
3046
}
3147

3248
const trackingJob = new CronJob("*/5 * * * * *", doTrackingJob);
33-
trackingJob.start();
49+
trackingJob.start();
50+
51+
export async function getUsersTrackingData(userId: string, guildId: string): Promise<[QueryError | null, any]> {
52+
return new Promise((resolve, reject) => {
53+
pool.query("SELECT * FROM tracking WHERE user_id = ? AND guild_id = ?", [userId, guildId], (err, results) => {
54+
if (err) {
55+
reject([err, null]);
56+
} else {
57+
resolve([null, results]);
58+
}
59+
});
60+
});
61+
}
62+
63+
export async function getGuildTrackingData(guildId: string, override: number | null): Promise<[QueryError | null, null] | [null, any]> {
64+
const topNumber: number = override || 10;
65+
66+
return new Promise((resolve, reject) => {
67+
pool.query("SELECT * FROM tracking WHERE guild_id = ? ORDER BY xp DESC, time ASC LIMIT ?", [guildId, topNumber], (err, results) => {
68+
if (err) {
69+
reject([err, null]);
70+
} else {
71+
resolve([null, results]);
72+
}
73+
});
74+
});
75+
}
76+
77+
async function getUsersXp(userString: string, guildId: string): Promise<[QueryError | null, any]> {
78+
return new Promise((resolve, reject) => {
79+
pool.query("SELECT * FROM users WHERE id IN (?) AND guild_id = ?", [userString, guildId], (err, results) => {
80+
if (err) {
81+
reject([err, null]);
82+
} else {
83+
resolve([null, results]);
84+
}
85+
});
86+
});
87+
}
88+
89+
async function insertUserDataToTracking(userId: string, guildId: string, xp: number): Promise<[QueryError | null, null]> {
90+
const time = timestamp;
91+
return new Promise((resolve, reject) => {
92+
pool.query("INSERT INTO tracking (user_id, guild_id, xp, time) VALUES (?, ?, ?, ?)", [userId, guildId, xp, time], (err) => {
93+
if (err) {
94+
reject([err, null]);
95+
} else {
96+
resolve([null, null]);
97+
}
98+
});
99+
});
100+
}

api/src/index.ts

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import express, { type NextFunction, type Request, type Response } from "express";
22
import cors from "cors";
3-
import { getBotInfo, getGuild, getUser, getUsers, initTables, pool, updateGuild, enableUpdates, disableUpdates, setCooldown, setUpdatesChannel, setXP, setLevel, removeGuild, removeUser, getAllServersWithUpdatesEnabled, addUserToTrackingData } from "./db";
3+
import { getBotInfo, getGuild, getUser, getUsers, initTables, pool, updateGuild, enableUpdates, disableUpdates, setCooldown, setUpdatesChannel, setXP, setLevel, removeGuild, removeUser, getAllServersWithUpdatesEnabled, addUserToTrackingData, getGuildTrackingData, getUsersTrackingData } from "./db";
44

55
const app = express();
66
const PORT = 18103;
@@ -197,6 +197,32 @@ app.get('/get/dbusage', (_req, res) => {
197197
})
198198
});
199199

200+
app.get('/get/tracking/:guild', async (req, res) => {
201+
const { guild } = req.params;
202+
203+
const [err, data] = await getGuildTrackingData(guild, null);
204+
205+
if (err) {
206+
console.error("Error fetching tracking data:", err);
207+
return res.status(500).json({ message: "Internal server error" });
208+
}
209+
210+
return res.status(200).json(data);
211+
});
212+
213+
app.get('/get/tracking/:guild/:user', async (req, res) => {
214+
const { guild, user } = req.params;
215+
216+
const [err, data] = await getUsersTrackingData(user, guild);
217+
218+
if (err) {
219+
console.error("Error fetching tracking data:", err);
220+
return res.status(500).json({ message: "Internal server error" });
221+
}
222+
223+
return res.status(200).json(data);
224+
});
225+
200226
app.get("/get/:guild/:user", async (req, res) => {
201227
const { guild, user } = req.params;
202228

@@ -492,7 +518,7 @@ app.get("/invite", (_req, res) => res.status(308).redirect("https://discord.com/
492518
app.get('/support', (_req, res) => res.status(308).redirect('https://discord.gg/fpJVTkVngm'));
493519

494520
app.use((_req, res) => {
495-
res.status(404).json({ message: "Not found" });
521+
res.status(404).send()
496522
});
497523

498524
app.listen(PORT, () => {
@@ -743,7 +769,3 @@ async function syncFromLurkr(guild: string) {
743769
}
744770
}
745771
//#endregion
746-
747-
//#region Tracking
748-
749-
//#endregion

0 commit comments

Comments
 (0)