@@ -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