chore: fix various eslint issues (#1176)

Reviewed-on: OpenWF/SpaceNinjaServer#1176
This commit is contained in:
Sainan 2025-03-15 03:24:39 -07:00
parent db20369eb9
commit 2891e2fef5
16 changed files with 111 additions and 75 deletions

View File

@ -38,7 +38,7 @@ export interface IQuestKeyReward {
Duration: number; Duration: number;
CouponSku: number; CouponSku: number;
Syndicate: string; Syndicate: string;
Milestones: any[]; //Milestones: any[];
ChooseSetIndex: number; ChooseSetIndex: number;
NewSystemReward: boolean; NewSystemReward: boolean;
_id: IOid; _id: IOid;

View File

@ -261,6 +261,7 @@ const resourceGetParent = (resourceName: string): string | undefined => {
if (resourceName in ExportResources) { if (resourceName in ExportResources) {
return ExportResources[resourceName].parentName; return ExportResources[resourceName].parentName;
} }
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
return ExportVirtuals[resourceName]?.parentName; return ExportVirtuals[resourceName]?.parentName;
}; };

View File

@ -2,12 +2,13 @@ import { RequestHandler } from "express";
import { getSessionByID } from "@/src/managers/sessionManager"; import { getSessionByID } from "@/src/managers/sessionManager";
import { logger } from "@/src/utils/logger"; import { logger } from "@/src/utils/logger";
const joinSessionController: RequestHandler = (_req, res) => { export const joinSessionController: RequestHandler = (req, res) => {
const reqBody = JSON.parse(String(_req.body)); const reqBody = JSON.parse(String(req.body)) as IJoinSessionRequest;
logger.debug(`JoinSession Request`, { reqBody }); logger.debug(`JoinSession Request`, { reqBody });
const req = JSON.parse(String(_req.body)); const session = getSessionByID(reqBody.sessionIds[0]);
const session = getSessionByID(req.sessionIds[0] as string);
res.json({ rewardSeed: session?.rewardSeed, sessionId: { $oid: session?.sessionId } }); res.json({ rewardSeed: session?.rewardSeed, sessionId: { $oid: session?.sessionId } });
}; };
export { joinSessionController }; interface IJoinSessionRequest {
sessionIds: string[];
}

View File

@ -44,7 +44,7 @@ function getSessionByID(sessionId: string): ISession | undefined {
return sessions.find(session => session.sessionId === sessionId); return sessions.find(session => session.sessionId === sessionId);
} }
function getSession(sessionIdOrRequest: string | IFindSessionRequest): any[] { function getSession(sessionIdOrRequest: string | IFindSessionRequest): { createdBy: string; id: string }[] {
if (typeof sessionIdOrRequest === "string") { if (typeof sessionIdOrRequest === "string") {
const session = sessions.find(session => session.sessionId === sessionIdOrRequest); const session = sessions.find(session => session.sessionId === sessionIdOrRequest);
if (session) { if (session) {
@ -107,8 +107,7 @@ function updateSession(sessionId: string, sessionData: string): boolean {
const session = sessions.find(session => session.sessionId === sessionId); const session = sessions.find(session => session.sessionId === sessionId);
if (!session) return false; if (!session) return false;
try { try {
const updatedData = JSON.parse(sessionData); Object.assign(session, JSON.parse(sessionData));
Object.assign(session, updatedData);
return true; return true;
} catch (error) { } catch (error) {
console.error("Invalid JSON string for session update."); console.error("Invalid JSON string for session update.");

View File

@ -1,7 +1,7 @@
import { IOid } from "@/src/types/commonTypes"; import { IOid } from "@/src/types/commonTypes";
import { IEquipmentSelection } from "@/src/types/inventoryTypes/commonInventoryTypes"; import { IEquipmentSelection } from "@/src/types/inventoryTypes/commonInventoryTypes";
import { ILoadoutConfigDatabase, ILoadoutDatabase } from "@/src/types/saveLoadoutTypes"; import { ILoadoutConfigDatabase, ILoadoutDatabase } from "@/src/types/saveLoadoutTypes";
import { Model, Schema, Types, model } from "mongoose"; import { Document, Model, Schema, Types, model } from "mongoose";
const oidSchema = new Schema<IOid>( const oidSchema = new Schema<IOid>(
{ {
@ -97,3 +97,15 @@ type loadoutDocumentProps = {
type loadoutModelType = Model<ILoadoutDatabase, {}, loadoutDocumentProps>; type loadoutModelType = Model<ILoadoutDatabase, {}, loadoutDocumentProps>;
export const Loadout = model<ILoadoutDatabase, loadoutModelType>("Loadout", loadoutSchema); export const Loadout = model<ILoadoutDatabase, loadoutModelType>("Loadout", loadoutSchema);
// eslint-disable-next-line @typescript-eslint/ban-types
export type TLoadoutDatabaseDocument = Document<unknown, {}, ILoadoutDatabase> &
Omit<
ILoadoutDatabase & {
_id: Types.ObjectId;
} & {
__v: number;
},
keyof loadoutDocumentProps
> &
loadoutDocumentProps;

View File

@ -1,4 +1,4 @@
import { Schema, model } from "mongoose"; import { Document, Schema, Types, model } from "mongoose";
import { IShipDatabase } from "../types/shipTypes"; import { IShipDatabase } from "../types/shipTypes";
import { toOid } from "@/src/helpers/inventoryHelpers"; import { toOid } from "@/src/helpers/inventoryHelpers";
import { colorSchema } from "@/src/models/inventoryModels/inventoryModel"; import { colorSchema } from "@/src/models/inventoryModels/inventoryModel";
@ -47,3 +47,11 @@ shipSchema.set("toObject", {
}); });
export const Ship = model("Ships", shipSchema); export const Ship = model("Ships", shipSchema);
// eslint-disable-next-line @typescript-eslint/ban-types
export type TShipDatabaseDocument = Document<unknown, {}, IShipDatabase> &
IShipDatabase & {
_id: Types.ObjectId;
} & {
__v: number;
};

View File

@ -4,7 +4,7 @@ import { IEnemy, IMission, IScan, ITutorial, IAbility, IWeapon, IStatsDatabase,
const abilitySchema = new Schema<IAbility>( const abilitySchema = new Schema<IAbility>(
{ {
type: { type: String, required: true }, type: { type: String, required: true },
used: Number used: { type: Number, required: true }
}, },
{ _id: false } { _id: false }
); );
@ -32,7 +32,7 @@ const missionSchema = new Schema<IMission>(
const scanSchema = new Schema<IScan>( const scanSchema = new Schema<IScan>(
{ {
type: { type: String, required: true }, type: { type: String, required: true },
scans: Number scans: { type: Number, required: true }
}, },
{ _id: false } { _id: false }
); );

View File

@ -1,6 +1,6 @@
import { Loadout } from "@/src/models/inventoryModels/loadoutModel"; import { Loadout, TLoadoutDatabaseDocument } from "@/src/models/inventoryModels/loadoutModel";
export const getLoadout = async (accountId: string) => { export const getLoadout = async (accountId: string): Promise<TLoadoutDatabaseDocument> => {
const loadout = await Loadout.findOne({ loadoutOwnerId: accountId }); const loadout = await Loadout.findOne({ loadoutOwnerId: accountId });
if (!loadout) { if (!loadout) {

View File

@ -313,6 +313,12 @@ export const addMissionInventoryUpdates = async (
return inventoryChanges; return inventoryChanges;
}; };
interface AddMissionRewardsReturnType {
MissionRewards: IMissionReward[];
inventoryChanges?: IInventoryChanges;
credits?: IMissionCredits;
}
//TODO: return type of partial missioninventoryupdate response //TODO: return type of partial missioninventoryupdate response
export const addMissionRewards = async ( export const addMissionRewards = async (
inventory: TInventoryDatabaseDocument, inventory: TInventoryDatabaseDocument,
@ -324,7 +330,7 @@ export const addMissionRewards = async (
VoidTearParticipantsCurrWave: voidTearWave, VoidTearParticipantsCurrWave: voidTearWave,
StrippedItems: strippedItems StrippedItems: strippedItems
}: IMissionInventoryUpdateRequest }: IMissionInventoryUpdateRequest
) => { ): Promise<AddMissionRewardsReturnType> => {
if (!rewardInfo) { if (!rewardInfo) {
//TODO: if there is a case where you can have credits collected during a mission but no rewardInfo, add credits needs to be handled earlier //TODO: if there is a case where you can have credits collected during a mission but no rewardInfo, add credits needs to be handled earlier
logger.debug(`Mission ${missions!.Tag} did not have Reward Info `); logger.debug(`Mission ${missions!.Tag} did not have Reward Info `);
@ -435,6 +441,13 @@ export const addMissionRewards = async (
return { inventoryChanges, MissionRewards, credits }; return { inventoryChanges, MissionRewards, credits };
}; };
interface IMissionCredits {
MissionCredits: number[];
CreditBonus: number[];
TotalCredits: number[];
DailyMissionBonus?: boolean;
}
//creditBonus is not entirely accurate. //creditBonus is not entirely accurate.
//TODO: consider ActiveBoosters //TODO: consider ActiveBoosters
export const addCredits = ( export const addCredits = (
@ -444,11 +457,11 @@ export const addCredits = (
missionCompletionCredits, missionCompletionCredits,
rngRewardCredits rngRewardCredits
}: { missionDropCredits: number; missionCompletionCredits: number; rngRewardCredits: number } }: { missionDropCredits: number; missionCompletionCredits: number; rngRewardCredits: number }
) => { ): IMissionCredits => {
const hasDailyCreditBonus = true; const hasDailyCreditBonus = true;
const totalCredits = missionDropCredits + missionCompletionCredits + rngRewardCredits; const totalCredits = missionDropCredits + missionCompletionCredits + rngRewardCredits;
const finalCredits = { const finalCredits: IMissionCredits = {
MissionCredits: [missionDropCredits, missionDropCredits], MissionCredits: [missionDropCredits, missionDropCredits],
CreditBonus: [missionCompletionCredits, missionCompletionCredits], CreditBonus: [missionCompletionCredits, missionCompletionCredits],
TotalCredits: [totalCredits, totalCredits] TotalCredits: [totalCredits, totalCredits]
@ -471,7 +484,7 @@ export const addFixedLevelRewards = (
rewards: IMissionRewardExternal, rewards: IMissionRewardExternal,
inventory: TInventoryDatabaseDocument, inventory: TInventoryDatabaseDocument,
MissionRewards: IMissionReward[] MissionRewards: IMissionReward[]
) => { ): number => {
let missionBonusCredits = 0; let missionBonusCredits = 0;
if (rewards.credits) { if (rewards.credits) {
missionBonusCredits += rewards.credits; missionBonusCredits += rewards.credits;

View File

@ -1,7 +1,8 @@
import { PersonalRooms } from "@/src/models/personalRoomsModel"; import { PersonalRooms } from "@/src/models/personalRoomsModel";
import { addItem, getInventory } from "@/src/services/inventoryService"; import { addItem, getInventory } from "@/src/services/inventoryService";
import { TPersonalRoomsDatabaseDocument } from "../types/personalRoomsTypes";
export const getPersonalRooms = async (accountId: string) => { export const getPersonalRooms = async (accountId: string): Promise<TPersonalRoomsDatabaseDocument> => {
const personalRooms = await PersonalRooms.findOne({ personalRoomsOwnerId: accountId }); const personalRooms = await PersonalRooms.findOne({ personalRoomsOwnerId: accountId });
if (!personalRooms) { if (!personalRooms) {
@ -10,7 +11,7 @@ export const getPersonalRooms = async (accountId: string) => {
return personalRooms; return personalRooms;
}; };
export const updateShipFeature = async (accountId: string, shipFeature: string) => { export const updateShipFeature = async (accountId: string, shipFeature: string): Promise<void> => {
const personalRooms = await getPersonalRooms(accountId); const personalRooms = await getPersonalRooms(accountId);
if (personalRooms.Ship.Features.includes(shipFeature)) { if (personalRooms.Ship.Features.includes(shipFeature)) {

View File

@ -108,8 +108,11 @@ export const handlePurchase = async (
]; ];
} }
purchaseRequest.PurchaseParams.Quantity *= offer.QuantityMultiplier; purchaseRequest.PurchaseParams.Quantity *= offer.QuantityMultiplier;
} else if (!ExportVendors[purchaseRequest.PurchaseParams.SourceId!]) { } else {
throw new Error(`unknown vendor: ${purchaseRequest.PurchaseParams.SourceId!}`); // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
if (!ExportVendors[purchaseRequest.PurchaseParams.SourceId!]) {
throw new Error(`unknown vendor: ${purchaseRequest.PurchaseParams.SourceId!}`);
}
} }
} }
@ -120,8 +123,6 @@ export const handlePurchase = async (
); );
combineInventoryChanges(purchaseResponse.InventoryChanges, inventoryChanges); combineInventoryChanges(purchaseResponse.InventoryChanges, inventoryChanges);
if (!purchaseResponse) throw new Error("purchase response was undefined");
const currencyChanges = updateCurrency( const currencyChanges = updateCurrency(
inventory, inventory,
purchaseRequest.PurchaseParams.ExpectedPrice, purchaseRequest.PurchaseParams.ExpectedPrice,
@ -149,6 +150,7 @@ export const handlePurchase = async (
]; ];
} else { } else {
const syndicate = ExportSyndicates[syndicateTag]; const syndicate = ExportSyndicates[syndicateTag];
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
if (syndicate) { if (syndicate) {
const favour = syndicate.favours.find( const favour = syndicate.favours.find(
x => x.storeItem == purchaseRequest.PurchaseParams.StoreItem x => x.storeItem == purchaseRequest.PurchaseParams.StoreItem
@ -360,6 +362,7 @@ const handleBoosterPackPurchase = async (
quantity: number quantity: number
): Promise<IPurchaseResponse> => { ): Promise<IPurchaseResponse> => {
const pack = ExportBoosterPacks[typeName]; const pack = ExportBoosterPacks[typeName];
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
if (!pack) { if (!pack) {
throw new Error(`unknown booster pack: ${typeName}`); throw new Error(`unknown booster pack: ${typeName}`);
} }

View File

@ -93,7 +93,10 @@ export const updateQuestStage = (
Object.assign(questStage, questStageUpdate); Object.assign(questStage, questStageUpdate);
}; };
export const addQuestKey = (inventory: TInventoryDatabaseDocument, questKey: IQuestKeyDatabase) => { export const addQuestKey = (
inventory: TInventoryDatabaseDocument,
questKey: IQuestKeyDatabase
): IQuestKeyClient | undefined => {
if (inventory.QuestKeys.some(q => q.ItemType === questKey.ItemType)) { if (inventory.QuestKeys.some(q => q.ItemType === questKey.ItemType)) {
logger.warn(`Quest key ${questKey.ItemType} already exists. It will not be added`); logger.warn(`Quest key ${questKey.ItemType} already exists. It will not be added`);
return; return;
@ -115,7 +118,7 @@ export const addQuestKey = (inventory: TInventoryDatabaseDocument, questKey: IQu
return inventory.QuestKeys[index - 1].toJSON<IQuestKeyClient>(); return inventory.QuestKeys[index - 1].toJSON<IQuestKeyClient>();
}; };
export const completeQuest = async (inventory: TInventoryDatabaseDocument, questKey: string) => { export const completeQuest = async (inventory: TInventoryDatabaseDocument, questKey: string): Promise<void> => {
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
const chainStages = ExportKeys[questKey]?.chainStages; const chainStages = ExportKeys[questKey]?.chainStages;

View File

@ -1,11 +1,10 @@
import { Ship } from "@/src/models/shipModel"; import { Ship, TShipDatabaseDocument } from "@/src/models/shipModel";
import { ILoadoutDatabase } from "@/src/types/saveLoadoutTypes";
import { Types } from "mongoose"; import { Types } from "mongoose";
export const createShip = async ( export const createShip = async (
accountOwnerId: Types.ObjectId, accountOwnerId: Types.ObjectId,
typeName: string = "/Lotus/Types/Items/Ships/DefaultShip" typeName: string = "/Lotus/Types/Items/Ships/DefaultShip"
) => { ): Promise<Types.ObjectId> => {
try { try {
const ship = new Ship({ const ship = new Ship({
ItemType: typeName, ItemType: typeName,
@ -21,7 +20,7 @@ export const createShip = async (
} }
}; };
export const getShip = async (shipId: Types.ObjectId, fieldSelection: string = "") => { export const getShip = async (shipId: Types.ObjectId, fieldSelection: string = ""): Promise<TShipDatabaseDocument> => {
const ship = await Ship.findOne({ _id: shipId }, fieldSelection); const ship = await Ship.findOne({ _id: shipId }, fieldSelection);
if (!ship) { if (!ship) {
@ -30,15 +29,3 @@ export const getShip = async (shipId: Types.ObjectId, fieldSelection: string = "
return ship; return ship;
}; };
export const getShipLean = async (shipOwnerId: string) => {
const ship = await Ship.findOne({ ShipOwnerId: shipOwnerId }).lean().populate<{
LoadOutInventory: { LoadOutPresets: ILoadoutDatabase };
}>("LoadOutInventory.LoadOutPresets");
if (!ship) {
throw new Error(`error finding a ship for account ${shipOwnerId}`);
}
return ship;
};

View File

@ -82,7 +82,6 @@ export const updateStats = async (playerStats: TStatsDatabaseDocument, payload:
for (const [type, scans] of Object.entries(data as IUploadEntry)) { for (const [type, scans] of Object.entries(data as IUploadEntry)) {
const scan = playerStats.Scans.find(element => element.type === type); const scan = playerStats.Scans.find(element => element.type === type);
if (scan) { if (scan) {
scan.scans ??= 0;
scan.scans += scans; scan.scans += scans;
} else { } else {
playerStats.Scans.push({ type: type, scans }); playerStats.Scans.push({ type: type, scans });
@ -95,7 +94,6 @@ export const updateStats = async (playerStats: TStatsDatabaseDocument, payload:
for (const [type, used] of Object.entries(data as IUploadEntry)) { for (const [type, used] of Object.entries(data as IUploadEntry)) {
const ability = playerStats.Abilities.find(element => element.type === type); const ability = playerStats.Abilities.find(element => element.type === type);
if (ability) { if (ability) {
ability.used ??= 0;
ability.used += used; ability.used += used;
} else { } else {
playerStats.Abilities.push({ type: type, used }); playerStats.Abilities.push({ type: type, used });
@ -307,22 +305,20 @@ export const updateStats = async (playerStats: TStatsDatabaseDocument, payload:
for (const [category, value] of Object.entries(actionData as IStatsSet)) { for (const [category, value] of Object.entries(actionData as IStatsSet)) {
switch (category) { switch (category) {
case "ELO_RATING": case "ELO_RATING":
playerStats.Rating = value; playerStats.Rating = value as number;
break; break;
case "RANK": case "RANK":
playerStats.Rank = value; playerStats.Rank = value as number;
break; break;
case "PLAYER_LEVEL": case "PLAYER_LEVEL":
playerStats.PlayerLevel = value; playerStats.PlayerLevel = value as number;
break; break;
default: default:
if (!ignoredCategories.includes(category)) { if (!ignoredCategories.includes(category)) {
if (!unknownCategories[action]) { unknownCategories[action] ??= [];
unknownCategories[action] = [];
}
unknownCategories[action].push(category); unknownCategories[action].push(category);
} }
break; break;

View File

@ -7,7 +7,7 @@ import {
ITailorShopDatabase, ITailorShopDatabase,
TBootLocation TBootLocation
} from "@/src/types/shipTypes"; } from "@/src/types/shipTypes";
import { Model, Types } from "mongoose"; import { Document, Model, Types } from "mongoose";
export interface IOrbiter { export interface IOrbiter {
Features: string[]; Features: string[];
@ -48,3 +48,15 @@ export type PersonalRoomsDocumentProps = {
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types
export type PersonalRoomsModelType = Model<IPersonalRoomsDatabase, {}, PersonalRoomsDocumentProps>; export type PersonalRoomsModelType = Model<IPersonalRoomsDatabase, {}, PersonalRoomsDocumentProps>;
// eslint-disable-next-line @typescript-eslint/ban-types
export type TPersonalRoomsDatabaseDocument = Document<unknown, {}, IPersonalRoomsDatabase> &
Omit<
IPersonalRoomsDatabase & {
_id: Types.ObjectId;
} & {
__v: number;
},
keyof PersonalRoomsDocumentProps
> &
PersonalRoomsDocumentProps;

View File

@ -1,29 +1,29 @@
export interface ISession { export interface ISession {
sessionId: string; sessionId: string;
creatorId: string; creatorId: string;
maxPlayers: number; maxPlayers?: number;
minPlayers: number; minPlayers?: number;
privateSlots: number; privateSlots?: number;
scoreLimit: number; scoreLimit?: number;
timeLimit: number; timeLimit?: number;
gameModeId: number; gameModeId?: number;
eloRating: number; eloRating?: number;
regionId: number; regionId?: number;
difficulty: number; difficulty?: number;
hasStarted: boolean; hasStarted?: boolean;
enableVoice: boolean; enableVoice?: boolean;
matchType: string; matchType?: string;
maps: string[]; maps?: string[];
originalSessionId: string; originalSessionId?: string;
customSettings: string; customSettings?: string;
rewardSeed: number; rewardSeed?: number;
guildId: string; guildId?: string;
buildId: number; buildId?: number;
platform: number; platform?: number;
xplatform: boolean; xplatform?: boolean;
freePublic: number; freePublic?: number;
freePrivate: number; freePrivate?: number;
fullReset: number; fullReset?: number;
} }
export interface IFindSessionRequest { export interface IFindSessionRequest {