2019-10-16 19:47:53 -03:00
const fs = require ( 'fs' )
2021-12-29 14:02:34 -03:00
const Player = require ( '../classes/Player.js' )
2019-10-15 23:42:47 -03:00
2019-10-16 19:47:53 -03:00
module . exports = async ( app , req , res , api , getLevels ) => {
2019-10-15 23:42:47 -03:00
2021-01-30 01:12:48 -03:00
if ( req . offline ) {
if ( ! api ) return res . redirect ( '/search/' + req . params . id )
2021-12-07 16:14:56 -03:00
else return res . sendError ( )
2021-01-30 01:12:48 -03:00
}
2020-11-07 21:20:44 -03:00
let username = getLevels || req . params . id
2021-08-01 19:22:35 -04:00
let probablyID
if ( username . endsWith ( "." ) && req . isGDPS ) {
username = username . slice ( 0 , - 1 )
probablyID = Number ( username )
}
2020-11-07 21:20:44 -03:00
let accountMode = ! req . query . hasOwnProperty ( "player" ) && Number ( req . params . id )
2021-01-21 19:15:31 -03:00
let foundID = app . userCache ( req . id , username )
2021-08-01 19:22:35 -04:00
let skipRequest = accountMode || foundID || probablyID
2021-01-17 02:05:06 -03:00
let searchResult ;
2020-09-10 10:02:40 -03:00
2020-11-07 21:20:44 -03:00
// if you're searching by account id, an intentional error is caused to skip the first request to the gd servers. see i pulled a sneaky on ya. (fuck callbacks man)
2021-08-01 19:22:35 -04:00
req . gdRequest ( skipRequest ? "" : 'getGJUsers20' , skipRequest ? { } : { str : username , page : 0 } , function ( err1 , res1 , b1 ) {
2021-01-17 02:05:06 -03:00
if ( foundID ) searchResult = foundID [ 0 ]
2021-08-01 19:22:35 -04:00
else if ( accountMode || err1 || b1 == '-1' || b1 . startsWith ( "<" ) || ! b1 ) searchResult = probablyID ? username : req . params . id
2021-01-18 23:54:18 -03:00
else if ( ! req . isGDPS ) searchResult = app . parseResponse ( b1 . split ( "|" ) [ 0 ] ) [ 16 ]
2021-01-17 02:05:06 -03:00
else { // GDPS's return multiple users, GD no longer does this
let userResults = b1 . split ( "|" ) . map ( x => app . parseResponse ( x ) )
searchResult = userResults . find ( x => x [ 1 ] . toLowerCase ( ) == username . toLowerCase ( ) || x [ 2 ] == username ) || ""
if ( searchResult ) searchResult = searchResult [ 16 ]
}
2021-01-14 20:18:19 -03:00
2020-11-07 21:20:44 -03:00
if ( getLevels ) {
req . params . text = foundID ? foundID [ 1 ] : app . parseResponse ( b1 ) [ 2 ]
return app . run . search ( app , req , res )
}
2019-10-15 23:42:47 -03:00
2021-01-18 23:54:18 -03:00
req . gdRequest ( 'getGJUserInfo20' , { targetAccountID : searchResult } , function ( err2 , res2 , body ) {
2021-01-17 02:05:06 -03:00
let account = app . parseResponse ( body || "" )
2021-01-18 23:54:18 -03:00
let dumbGDPSError = req . isGDPS && ( ! account [ 16 ] || account [ 1 ] . toLowerCase ( ) == "undefined" )
2021-01-17 02:05:06 -03:00
2021-08-18 20:10:35 -04:00
if ( err2 || dumbGDPSError ) {
2019-10-15 23:42:47 -03:00
if ( ! api ) return res . redirect ( '/search/' + req . params . id )
2021-12-07 16:14:56 -03:00
else return res . sendError ( )
2019-10-15 23:42:47 -03:00
}
2020-11-07 21:20:44 -03:00
2021-01-21 19:15:31 -03:00
if ( ! foundID ) app . userCache ( req . id , account [ 16 ] , account [ 2 ] , account [ 1 ] )
2020-11-26 18:04:42 -03:00
2021-12-29 14:02:34 -03:00
let userData = new Player ( account )
2020-11-07 21:20:44 -03:00
2022-02-06 21:18:45 -03:00
if ( api ) return res . send ( userData )
2019-10-15 23:42:47 -03:00
2020-11-07 21:20:44 -03:00
else fs . readFile ( './html/profile.html' , 'utf8' , function ( err , data ) {
2019-10-15 23:42:47 -03:00
let html = data ;
let variables = Object . keys ( userData )
variables . forEach ( x => {
let regex = new RegExp ( ` \\ [ \\ [ ${ x . toUpperCase ( ) } \\ ] \\ ] ` , "g" )
html = html . replace ( regex , app . clean ( userData [ x ] ) )
} )
2022-02-06 21:18:45 -03:00
return res . send ( html )
2019-10-15 23:42:47 -03:00
} )
} )
} )
}