1+ // TODO: Move this file to a utils folder or something - this is NOT queries
2+
13import { CronJob } from "cron" ;
4+ import { pool } from ".." ;
5+ import type { QueryError } from "mysql2" ;
26
37let usersToUpdate : Record < string , string [ ] > = { } ;
8+ let timestamp : string
49
510export 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
1622async 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
3248const 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+ }
0 commit comments