import { fixedSizeArray, FixedSizeArray, staticImplements, } from '@staratlas/data-source'; import { PermissionType, PermissionTypeStatic, } from '@staratlas/player-profile'; type NotSagePermissions = 'and' | 'contains' | 'eq' | 'or' | 'getPermissions'; @staticImplements>() export class SagePermissions implements PermissionType { constructor( public manageGame: boolean, public manageSector: boolean, public manageStar: boolean, public managePlanet: boolean, public manageShip: boolean, public manageSagePlayerProfile: boolean, public manageStarbase: boolean, public manageMineItem: boolean, public manageResource: boolean, public removeShipEscrow: boolean, public moveFleet: boolean, public transitionFromLoadingBay: boolean, public transitionFromIdle: boolean, public rentFleet: boolean, public doCrafting: boolean, public manageCargoPod: boolean, public addRemoveCargo: boolean, public doStarbaseUpgrades: boolean, public manageFleet: boolean, public manageFleetCargo: boolean, public doMining: boolean, public respawn: boolean, public manageSurveyDataUnit: boolean, public scanSurveyDataUnit: boolean, public doStarbaseUpkeep: boolean, public manageProgression: boolean, public manageCrewConfig: boolean, public manageCrew: boolean, public withdrawCrew: boolean, public manageCombat: boolean, public engageInCombat: boolean, ) {} contains(other: SagePermissions): boolean { return this.and(other).eq(other); } getPermissions(): FixedSizeArray { const out: FixedSizeArray = fixedSizeArray(8, 0); out[0] = (this.manageGame ? 1 << 0 : 0) | (this.manageSector ? 1 << 1 : 0) | (this.manageStar ? 1 << 2 : 0) | (this.managePlanet ? 1 << 3 : 0) | (this.manageShip ? 1 << 4 : 0) | (this.manageSagePlayerProfile ? 1 << 5 : 0) | (this.manageStarbase ? 1 << 6 : 0) | (this.manageMineItem ? 1 << 7 : 0); out[1] = (this.manageResource ? 1 << 0 : 0) | (this.removeShipEscrow ? 1 << 1 : 0) | (this.moveFleet ? 1 << 2 : 0) | (this.transitionFromLoadingBay ? 1 << 3 : 0) | (this.transitionFromIdle ? 1 << 4 : 0) | (this.rentFleet ? 1 << 5 : 0) | (this.doCrafting ? 1 << 6 : 0) | (this.manageCargoPod ? 1 << 7 : 0); out[2] = (this.addRemoveCargo ? 1 << 0 : 0) | (this.doStarbaseUpgrades ? 1 << 1 : 0) | (this.manageFleet ? 1 << 2 : 0) | (this.manageFleetCargo ? 1 << 3 : 0) | (this.doMining ? 1 << 4 : 0) | (this.respawn ? 1 << 5 : 0) | (this.manageSurveyDataUnit ? 1 << 6 : 0) | (this.scanSurveyDataUnit ? 1 << 7 : 0); out[3] = (this.doStarbaseUpkeep ? 1 << 0 : 0) | (this.manageProgression ? 1 << 1 : 0) | (this.manageCrewConfig ? 1 << 2 : 0) | (this.manageCrew ? 1 << 3 : 0) | (this.withdrawCrew ? 1 << 4 : 0) | (this.manageCombat ? 1 << 5 : 0) | (this.engageInCombat ? 1 << 6 : 0); return out; } static empty(): SagePermissions { return new SagePermissions( false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, ); } static all(): SagePermissions { return new SagePermissions( true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, ); } static manageGamePermissions(): SagePermissions { return SagePermissions.permissionsBuilder('manageGame'); } static manageSectorPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('manageSector'); } static manageStarPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('manageStar'); } static managePlanetPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('managePlanet'); } static manageShipPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('manageShip'); } static manageSagePlayerProfilePermissions(): SagePermissions { return SagePermissions.permissionsBuilder('manageSagePlayerProfile'); } static manageStarbasePermissions(): SagePermissions { return SagePermissions.permissionsBuilder('manageStarbase'); } static manageMineItemPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('manageMineItem'); } static manageResourcePermissions(): SagePermissions { return SagePermissions.permissionsBuilder('manageResource'); } static removeShipEscrowPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('removeShipEscrow'); } static moveFleetPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('moveFleet'); } static transitionFromLoadingBayPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('transitionFromLoadingBay'); } static transitionFromIdlePermissions(): SagePermissions { return SagePermissions.permissionsBuilder('transitionFromIdle'); } static rentFleetPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('rentFleet'); } static doCraftingPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('doCrafting'); } static manageCargoPodPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('manageCargoPod'); } static addRemoveCargoPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('addRemoveCargo'); } static doStarbaseUpgradesPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('doStarbaseUpgrades'); } static manageFleetPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('manageFleet'); } static manageFleetCargoPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('manageFleetCargo'); } static doMiningPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('doMining'); } static respawnPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('respawn'); } static manageSurveyDataUnitPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('manageSurveyDataUnit'); } static scanSurveyDataUnitPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('scanSurveyDataUnit'); } static doStarbaseUpkeepPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('doStarbaseUpkeep'); } static manageProgressionPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('manageProgression'); } static manageCrewConfigPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('manageCrewConfig'); } static manageCrewPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('manageCrew'); } static withdrawCrewPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('withdrawCrew'); } static manageCombatPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('manageCombat'); } static engageInCombatPermissions(): SagePermissions { return SagePermissions.permissionsBuilder('engageInCombat'); } static fromPermissions( permissions: FixedSizeArray, ): SagePermissions { return new SagePermissions( // MANAGE_GAME (permissions[0] & (1 << 0)) !== 0, // MANAGE_SECTOR (permissions[0] & (1 << 1)) !== 0, // MANAGE_STAR (permissions[0] & (1 << 2)) !== 0, // MANAGE_PLANET (permissions[0] & (1 << 3)) !== 0, // MANAGE_SHIP (permissions[0] & (1 << 4)) !== 0, // MANAGE_SAGE_PLAYER_PROFILE (permissions[0] & (1 << 5)) !== 0, // MANAGE_STAR_BASE (permissions[0] & (1 << 6)) !== 0, // MANAGE_MINE_ITEM (permissions[0] & (1 << 7)) !== 0, // MANAGE_RESOURCE (permissions[1] & (1 << 0)) !== 0, // REMOVE_SHIP_ESCROW (permissions[1] & (1 << 1)) !== 0, // MOVE_FLEET (permissions[1] & (1 << 2)) !== 0, // TRANSITION_FROM_LOADING_BAY (permissions[1] & (1 << 3)) !== 0, // TRANSITION_FROM_IDLE (permissions[1] & (1 << 4)) !== 0, // RENT_FLEET (permissions[1] & (1 << 5)) !== 0, // DO_CRAFTING (permissions[1] & (1 << 6)) !== 0, // MANAGE_CARGO_POD (permissions[1] & (1 << 7)) !== 0, // ADD_REMOVE_CARGO (permissions[2] & (1 << 0)) !== 0, // DO_STAR_BASE_UPGRADES (permissions[2] & (1 << 1)) !== 0, // MANAGE_FLEET (permissions[2] & (1 << 2)) !== 0, // MANAGE_FLEET_CARGO (permissions[2] & (1 << 3)) !== 0, // DO_MINING (permissions[2] & (1 << 4)) !== 0, // RESPAWN (permissions[2] & (1 << 5)) !== 0, // MANAGE_SURVEY_DATA_UNIT (permissions[2] & (1 << 6)) !== 0, // SCAN_SURVEY_DATA_UNIT (permissions[2] & (1 << 7)) !== 0, // DO_STAR_BASE_UPKEEP (permissions[3] & (1 << 0)) !== 0, // MANAGE_PROGRESSION (permissions[3] & (1 << 1)) !== 0, // MANAGE_CREW_CONFIG (permissions[3] & (1 << 2)) !== 0, // MANAGE_CREW (permissions[3] & (1 << 3)) !== 0, // WITHDRAW_CREW (permissions[3] & (1 << 4)) !== 0, // MANAGE_COMBAT (permissions[3] & (1 << 5)) !== 0, // ENGAGE_IN_COMBAT (permissions[3] & (1 << 6)) !== 0, ); } and(other: SagePermissions): SagePermissions { return new SagePermissions( this.manageGame && other.manageGame, this.manageSector && other.manageSector, this.manageStar && other.manageStar, this.managePlanet && other.managePlanet, this.manageShip && other.manageShip, this.manageSagePlayerProfile && other.manageSagePlayerProfile, this.manageStarbase && other.manageStarbase, this.manageMineItem && other.manageMineItem, this.manageResource && other.manageResource, this.removeShipEscrow && other.removeShipEscrow, this.moveFleet && other.moveFleet, this.transitionFromLoadingBay && other.transitionFromLoadingBay, this.transitionFromIdle && other.transitionFromIdle, this.rentFleet && other.rentFleet, this.doCrafting && other.doCrafting, this.manageCargoPod && other.manageCargoPod, this.addRemoveCargo && other.addRemoveCargo, this.doStarbaseUpgrades && other.doStarbaseUpgrades, this.manageFleet && other.manageFleet, this.manageFleetCargo && other.manageFleetCargo, this.doMining && other.doMining, this.respawn && other.respawn, this.manageSurveyDataUnit && other.manageSurveyDataUnit, this.scanSurveyDataUnit && other.scanSurveyDataUnit, this.doStarbaseUpkeep && other.doStarbaseUpkeep, this.manageProgression && other.manageProgression, this.manageCrewConfig && other.manageCrewConfig, this.manageCrew && other.manageCrew, this.withdrawCrew && other.withdrawCrew, this.manageCombat && other.manageCombat, this.engageInCombat && other.engageInCombat, ); } or(other: SagePermissions): SagePermissions { return new SagePermissions( this.manageGame || other.manageGame, this.manageSector || other.manageSector, this.manageStar || other.manageStar, this.managePlanet || other.managePlanet, this.manageShip || other.manageShip, this.manageSagePlayerProfile || other.manageSagePlayerProfile, this.manageStarbase || other.manageStarbase, this.manageMineItem || other.manageMineItem, this.manageResource || other.manageResource, this.removeShipEscrow || other.removeShipEscrow, this.moveFleet || other.moveFleet, this.transitionFromLoadingBay || other.transitionFromLoadingBay, this.transitionFromIdle || other.transitionFromIdle, this.rentFleet || other.rentFleet, this.doCrafting || other.doCrafting, this.manageCargoPod || other.manageCargoPod, this.addRemoveCargo || other.addRemoveCargo, this.doStarbaseUpgrades || other.doStarbaseUpgrades, this.manageFleet || other.manageFleet, this.manageFleetCargo || other.manageFleetCargo, this.doMining || other.doMining, this.respawn || other.respawn, this.manageSurveyDataUnit || other.manageSurveyDataUnit, this.scanSurveyDataUnit || other.scanSurveyDataUnit, this.doStarbaseUpkeep || other.doStarbaseUpkeep, this.manageProgression || other.manageProgression, this.manageCrewConfig || other.manageCrewConfig, this.manageCrew || other.manageCrew, this.withdrawCrew || other.withdrawCrew, this.manageCombat || other.manageCombat, this.engageInCombat || other.engageInCombat, ); } eq(other: SagePermissions): boolean { return ( this.manageGame === other.manageGame && this.manageSector === other.manageSector && this.manageStar === other.manageStar && this.managePlanet === other.managePlanet && this.manageShip === other.manageShip && this.manageSagePlayerProfile === other.manageSagePlayerProfile && this.manageStarbase === other.manageStarbase && this.manageMineItem === other.manageMineItem && this.manageResource === other.manageResource && this.removeShipEscrow === other.removeShipEscrow && this.moveFleet == other.moveFleet && this.transitionFromLoadingBay === other.transitionFromLoadingBay && this.transitionFromIdle === other.transitionFromIdle && this.rentFleet === other.rentFleet && this.doCrafting === other.doCrafting && this.manageCargoPod === other.manageCargoPod && this.addRemoveCargo === other.addRemoveCargo && this.doStarbaseUpgrades === other.doStarbaseUpgrades && this.manageFleet === other.manageFleet && this.manageFleetCargo === other.manageFleetCargo && this.doMining === other.doMining && this.respawn === other.respawn && this.manageSurveyDataUnit === other.manageSurveyDataUnit && this.scanSurveyDataUnit === other.scanSurveyDataUnit && this.doStarbaseUpkeep === other.doStarbaseUpkeep && this.manageProgression === other.manageProgression && this.manageCrewConfig === other.manageCrewConfig && this.manageCrew === other.manageCrew && this.withdrawCrew === other.withdrawCrew && this.manageCombat === other.manageCombat && this.engageInCombat === other.engageInCombat ); } /** * Dynamically builds an instance of SagePermissions * @param input - the desired permission or array of permissions * @returns SagePermissions */ static permissionsBuilder( input: | Exclude | Array>, ): SagePermissions { const inputPerms = Array.isArray(input) ? input : [input]; const params = Object.keys(SagePermissions.empty()).map((key) => (inputPerms).includes(key), ) as [ boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, ]; if (params.length != SagePermissions.length) { throw 'Incorrect permissions array'; } return new SagePermissions(...params); } }