1
+ // TODO: Move this file to a utils folder or something - this is NOT queries
2
+
1
3
import { CronJob } from "cron" ;
4
+ import { pool } from ".." ;
5
+ import type { QueryError } from "mysql2" ;
2
6
3
7
let usersToUpdate : Record < string , string [ ] > = { } ;
8
+ let timestamp : string
4
9
5
10
export async function addUserToTrackingData ( userId : string , guildId : string ) : Promise < void > {
6
11
console . log ( "Adding user to tracking data:" , userId , guildId ) ;
@@ -9,25 +14,87 @@ export async function addUserToTrackingData(userId: string, guildId: string) : P
9
14
}
10
15
if ( ! usersToUpdate [ guildId ] . includes ( userId ) ) {
11
16
usersToUpdate [ guildId ] . push ( userId ) ;
17
+ return ;
12
18
}
13
19
return ;
14
20
}
15
21
16
22
async function doTrackingJob ( ) {
23
+ timestamp = new Date ( ) . toISOString ( ) . slice ( 0 , 19 ) . replace ( 'T' , ' ' ) ;
17
24
const usersToUpdateTemp = { ...usersToUpdate } ;
18
25
usersToUpdate = { } ;
26
+ console . log ( "Updating users:" , usersToUpdateTemp ) ;
19
27
if ( ! Object . keys ( usersToUpdateTemp ) . length ) {
20
28
console . log ( "No users to update!" ) ;
21
29
return ;
22
30
}
23
31
const guildIds = Object . keys ( usersToUpdateTemp ) ;
24
32
for ( const guildId of guildIds ) {
25
33
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 ) ;
28
44
}
29
45
}
30
46
}
31
47
32
48
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
+ }
0 commit comments