2020-11-03 02:08:57 +00:00
const StatusUpdate = require ( "./Packets/StatusUpdate.js" ) ;
2022-02-23 03:22:35 +00:00
const rankingModes = [
"pp_raw" ,
"ranked_score" ,
"avg_accuracy"
] ;
2020-08-27 13:09:35 +01:00
module . exports = class {
2022-02-23 03:22:35 +00:00
constructor ( id , username , uuid ) {
2021-09-03 23:47:46 +01:00
this . id = id ;
this . username = username ;
this . uuid = uuid ;
2022-02-23 03:22:35 +00:00
this . connectTime = Date . now ( ) ;
2022-02-23 05:35:32 +00:00
this . timeoutTime = Date . now ( ) + 30000 ;
2022-02-23 02:49:25 +00:00
this . queue = Buffer . alloc ( 0 ) ;
2021-09-03 23:47:46 +01:00
// Binato specific
this . rankingMode = 0 ;
this . playMode = 0 ;
this . countryID = 0 ;
this . spectators = [ ] ;
this . spectating = 0 ;
this . location = [ 0 , 0 ] ;
this . joinedChannels = [ ] ;
// Presence data
this . actionID = 0 ;
this . actionText = "" ;
this . actionMods = 0 ;
this . beatmapChecksum = "" ;
this . beatmapID = 0 ;
this . currentMods = 0 ;
// Cached db data
this . rankedScore = 0 ;
this . accuracy = 0 ;
this . playCount = 0 ;
this . totalScore = 0 ;
this . rank = 0 ;
this . pp = 0 ;
// Multiplayer data
this . currentMatch = null ;
this . matchSlotId = - 1 ;
2022-02-23 03:22:35 +00:00
this . isTourneyUser = false ;
2021-09-03 23:47:46 +01:00
}
// Adds new actions to the user's queue
addActionToQueue ( newData ) {
this . queue = Buffer . concat ( [ this . queue , newData ] , this . queue . length + newData . length ) ;
}
// Updates the user's current action
updatePresence ( action ) {
this . actionID = action . status ;
this . actionText = action . statusText ;
this . beatmapChecksum = action . beatmapChecksum ;
this . currentMods = action . currentMods ;
this . actionMods = action . currentMods ;
2022-05-10 12:36:48 +01:00
if ( action . playMode != this . playMode ) {
this . updateUserInfo ( true ) ;
this . playMode = action . playMode ;
}
2021-09-03 23:47:46 +01:00
this . beatmapID = action . beatmapId ;
}
// Gets the user's score information from the database and caches it
2022-04-20 07:25:15 +01:00
async updateUserInfo ( forceUpdate = false ) {
2022-05-10 12:36:48 +01:00
const userScoreDB = await global . DatabaseHelper . query ( "SELECT * FROM users_modes_info WHERE user_id = ? AND mode_id = ? LIMIT 1" , [ this . id , this . playMode ] ) ;
2022-02-23 03:22:35 +00:00
const mappedRankingMode = rankingModes [ this . rankingMode ] ;
2022-05-10 12:36:48 +01:00
const userRankDB = await global . DatabaseHelper . query ( ` SELECT user_id, ${ mappedRankingMode } FROM users_modes_info WHERE mode_id = ? ORDER BY ${ mappedRankingMode } DESC ` , [ this . playMode ] ) ;
2021-09-03 23:47:46 +01:00
if ( userScoreDB == null || userRankDB == null ) throw "fuck" ;
2022-02-23 03:22:35 +00:00
// Handle "if we should update" checks for each rankingMode
2021-09-03 23:47:46 +01:00
let userScoreUpdate = false ;
2022-02-23 03:22:35 +00:00
switch ( this . rankingMode ) {
case 0 :
if ( this . pp != userScoreDB . pp _raw )
userScoreUpdate = true ;
2021-09-03 23:47:46 +01:00
break ;
2022-02-23 03:22:35 +00:00
case 1 :
if ( this . rankedScore != userScoreDB . ranked _score )
userScoreUpdate = true ;
2021-09-03 23:47:46 +01:00
break ;
2022-02-23 03:22:35 +00:00
case 2 :
if ( this . accuracy != userScoreDB . avg _accuracy )
userScoreUpdate = true ;
2021-09-03 23:47:46 +01:00
break ;
}
this . rankedScore = userScoreDB . ranked _score ;
this . totalScore = userScoreDB . total _score ;
this . accuracy = userScoreDB . avg _accuracy ;
this . playCount = userScoreDB . playcount ;
2022-02-23 03:22:35 +00:00
// Fetch rank
2021-09-03 23:47:46 +01:00
for ( let i = 0 ; i < userRankDB . length ; i ++ ) {
2022-02-23 03:22:35 +00:00
if ( userRankDB [ i ] [ "user_id" ] == this . id ) {
this . rank = i + 1 ;
break ;
}
2021-09-03 23:47:46 +01:00
}
2022-02-23 03:22:35 +00:00
// Set PP to none if ranking mode is not PP
if ( this . rankingMode == 0 ) this . pp = userScoreDB . pp _raw ;
else this . pp = 0 ;
2021-09-03 23:47:46 +01:00
2022-02-23 03:22:35 +00:00
if ( userScoreUpdate || forceUpdate ) {
2021-09-03 23:47:46 +01:00
StatusUpdate ( this , this . id ) ;
}
}
// Clears out the user's queue
clearQueue ( ) {
2022-02-23 02:49:25 +00:00
this . queue = Buffer . alloc ( 0 ) ;
2021-09-03 23:47:46 +01:00
}
2020-08-27 13:09:35 +01:00
}