monitor/core/lib/player/playerResolver.ts
2025-04-16 22:30:27 +07:00

63 lines
2.4 KiB
TypeScript

import { SYM_CURRENT_MUTEX } from "@lib/symbols.js";
import { DatabasePlayer, ServerPlayer } from "./playerClasses.js"
/**
* Resolves a ServerPlayer or DatabasePlayer based on mutex, netid and license.
* When mutex#netid is present, it takes precedence over license.
* If the mutex is not from the current server, search for the license in FxPlayerlist.licenseCache[]
* and then search for the license in the database.
*/
export default (mutex: any, netid: any, license: any) => {
const parsedNetid = parseInt(netid);
let searchLicense = license;
//For error clarification only
let hasMutex = false;
//Attempt to resolve current mutex, if needed
if(mutex === SYM_CURRENT_MUTEX){
mutex = txCore.fxRunner.child?.mutex;
if (!mutex) {
throw new Error(`current mutex not available`);
}
}
//If mutex+netid provided
if (typeof mutex === 'string' && typeof netid === 'number' && !isNaN(parsedNetid)) {
hasMutex = true;
if (mutex && mutex === txCore.fxRunner.child?.mutex) {
//If the mutex is from the server currently online
const player = txCore.fxPlayerlist.getPlayerById(netid);
if (player instanceof ServerPlayer) {
return player;
} else {
throw new Error(`player not found in current server playerlist`);
}
} else {
// If mutex is from previous server, overwrite any given license
const searchRef = `${mutex}#${netid}`;
const found = txCore.fxPlayerlist.licenseCache.find(c => c[0] === searchRef);
if (found) searchLicense = found[1];
}
}
//If license provided or resolved through licenseCache, search in the database
if (typeof searchLicense === 'string' && searchLicense.length) {
const onlineMatches = txCore.fxPlayerlist.getOnlinePlayersByLicense(searchLicense);
if(onlineMatches.length){
return onlineMatches.at(-1) as ServerPlayer;
}else{
return new DatabasePlayer(searchLicense);
}
}
//Player not found
//If not found in the db, the search above already threw error
if(hasMutex){
throw new Error(`could not resolve player by its net id which likely means it has disconnected long ago`);
}else{
throw new Error(`could not resolve this player`);
}
}