63 lines
2.4 KiB
TypeScript
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`);
|
|
}
|
|
}
|