feat: syndicates (#269)
Co-authored-by: janisslsm <janisslsm@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									3e4eeb601d
								
							
						
					
					
						commit
						2a1a4e77b5
					
				
							
								
								
									
										25
									
								
								src/controllers/api/syndicateSacrificeController.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/controllers/api/syndicateSacrificeController.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
				
			||||||
 | 
					import { syndicateSacrifice } from "@/src/services/inventoryService";
 | 
				
			||||||
 | 
					import { ISyndicateSacrifice } from "@/src/types/syndicateTypes";
 | 
				
			||||||
 | 
					import { RequestHandler } from "express";
 | 
				
			||||||
 | 
					import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
				
			||||||
 | 
					// eslint-disable-next-line @typescript-eslint/no-misused-promises
 | 
				
			||||||
 | 
					const syndicateSacrificeController: RequestHandler = async (request, response) => {
 | 
				
			||||||
 | 
					    const accountId = await getAccountIdForRequest(request);
 | 
				
			||||||
 | 
					    const body = getJSONfromString(request.body);
 | 
				
			||||||
 | 
					    let reply = {};
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					        const update = JSON.parse(body) as ISyndicateSacrifice;
 | 
				
			||||||
 | 
					        if (typeof update !== "object") {
 | 
				
			||||||
 | 
					            throw new Error("Invalid data format");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        reply = await syndicateSacrifice(update, accountId);
 | 
				
			||||||
 | 
					    } catch (err) {
 | 
				
			||||||
 | 
					        console.error("Error parsing JSON data:", err);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    response.json(reply);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export { syndicateSacrificeController };
 | 
				
			||||||
@ -1,19 +1,15 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import { RequestHandler } from "express";
 | 
				
			||||||
import { IChallengeProgress } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
				
			||||||
import { getInventory, addChallenges } from "@/src/services/inventoryService";
 | 
					import { updateChallengeProgress } from "@/src/services/inventoryService";
 | 
				
			||||||
 | 
					import { IUpdateChallengeProgressRequest } from "@/src/types/requestTypes";
 | 
				
			||||||
interface IUpdateChallengeProgessRequest {
 | 
					 | 
				
			||||||
    ChallengeProgress: IChallengeProgress[];
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const updateChallengeProgressController: RequestHandler = async (req, res) => {
 | 
					const updateChallengeProgressController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const payload: IUpdateChallengeProgessRequest = getJSONfromString(req.body.toString());
 | 
					    const payload: IUpdateChallengeProgressRequest = getJSONfromString(req.body.toString());
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
    const inventory = await getInventory(accountId);
 | 
					
 | 
				
			||||||
    addChallenges(inventory, payload.ChallengeProgress);
 | 
					    await updateChallengeProgress(payload, accountId);
 | 
				
			||||||
    await inventory.save();
 | 
					
 | 
				
			||||||
    res.status(200).end();
 | 
					    res.status(200).end();
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -52,6 +52,7 @@ import { getGuildLogController } from "../controllers/api/getGuildLogController"
 | 
				
			|||||||
import { guildTechController } from "../controllers/api/guildTechController";
 | 
					import { guildTechController } from "../controllers/api/guildTechController";
 | 
				
			||||||
import { dojoController } from "@/src/controllers/api/dojoController";
 | 
					import { dojoController } from "@/src/controllers/api/dojoController";
 | 
				
			||||||
import { getGuildDojoController } from "@/src/controllers/api/getGuildDojoController";
 | 
					import { getGuildDojoController } from "@/src/controllers/api/getGuildDojoController";
 | 
				
			||||||
 | 
					import { syndicateSacrificeController } from "../controllers/api/syndicateSacrificeController";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const apiRouter = express.Router();
 | 
					const apiRouter = express.Router();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -114,5 +115,6 @@ apiRouter.post("/createGuild.php", createGuildController);
 | 
				
			|||||||
apiRouter.post("/sell.php", sellController);
 | 
					apiRouter.post("/sell.php", sellController);
 | 
				
			||||||
apiRouter.post("/upgrades.php", upgradesController);
 | 
					apiRouter.post("/upgrades.php", upgradesController);
 | 
				
			||||||
apiRouter.post("/guildTech.php", guildTechController);
 | 
					apiRouter.post("/guildTech.php", guildTechController);
 | 
				
			||||||
 | 
					apiRouter.post("/syndicateSacrifice.php", syndicateSacrificeController);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export { apiRouter };
 | 
					export { apiRouter };
 | 
				
			||||||
 | 
				
			|||||||
@ -13,12 +13,19 @@ import {
 | 
				
			|||||||
    IMiscItem,
 | 
					    IMiscItem,
 | 
				
			||||||
    IMission,
 | 
					    IMission,
 | 
				
			||||||
    IRawUpgrade,
 | 
					    IRawUpgrade,
 | 
				
			||||||
 | 
					    ISeasonChallengeHistory,
 | 
				
			||||||
    ITypeCount
 | 
					    ITypeCount
 | 
				
			||||||
} from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					} from "@/src/types/inventoryTypes/inventoryTypes";
 | 
				
			||||||
import { IGenericUpdate } from "../types/genericUpdate";
 | 
					import { IGenericUpdate } from "../types/genericUpdate";
 | 
				
			||||||
import { IArtifactsRequest, IMissionInventoryUpdateRequest, IThemeUpdateRequest } from "../types/requestTypes";
 | 
					import {
 | 
				
			||||||
 | 
					    IArtifactsRequest,
 | 
				
			||||||
 | 
					    IMissionInventoryUpdateRequest,
 | 
				
			||||||
 | 
					    IThemeUpdateRequest,
 | 
				
			||||||
 | 
					    IUpdateChallengeProgressRequest
 | 
				
			||||||
 | 
					} from "../types/requestTypes";
 | 
				
			||||||
import { logger } from "@/src/utils/logger";
 | 
					import { logger } from "@/src/utils/logger";
 | 
				
			||||||
import { WeaponTypeInternal } from "@/src/services/itemDataService";
 | 
					import { WeaponTypeInternal } from "@/src/services/itemDataService";
 | 
				
			||||||
 | 
					import { ISyndicateSacrifice, ISyndicateSacrificeResponse } from "../types/syndicateTypes";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const createInventory = async (
 | 
					export const createInventory = async (
 | 
				
			||||||
    accountOwnerId: Types.ObjectId,
 | 
					    accountOwnerId: Types.ObjectId,
 | 
				
			||||||
@ -164,6 +171,28 @@ export const updateTheme = async (data: IThemeUpdateRequest, accountId: string)
 | 
				
			|||||||
    await inventory.save();
 | 
					    await inventory.save();
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const syndicateSacrifice = async (
 | 
				
			||||||
 | 
					    data: ISyndicateSacrifice,
 | 
				
			||||||
 | 
					    accountId: string
 | 
				
			||||||
 | 
					): Promise<ISyndicateSacrificeResponse> => {
 | 
				
			||||||
 | 
					    const inventory = await getInventory(accountId);
 | 
				
			||||||
 | 
					    const syndicate = inventory.Affiliations.find(x => x.Tag == data.AffiliationTag);
 | 
				
			||||||
 | 
					    const level = data.SacrificeLevel - (syndicate?.Title ?? 0);
 | 
				
			||||||
 | 
					    const res: ISyndicateSacrificeResponse = {
 | 
				
			||||||
 | 
					        AffiliationTag: data.AffiliationTag,
 | 
				
			||||||
 | 
					        InventoryChanges: [],
 | 
				
			||||||
 | 
					        Level: data.SacrificeLevel,
 | 
				
			||||||
 | 
					        LevelIncrease: level <= 0 ? 1 : level,
 | 
				
			||||||
 | 
					        NewEpisodeReward: syndicate?.Tag == "RadioLegionIntermission9Syndicate"
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (syndicate?.Title !== undefined) syndicate.Title += 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await inventory.save();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return res;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const addWeapon = async (
 | 
					export const addWeapon = async (
 | 
				
			||||||
    weaponType: WeaponTypeInternal,
 | 
					    weaponType: WeaponTypeInternal,
 | 
				
			||||||
    weaponName: string,
 | 
					    weaponName: string,
 | 
				
			||||||
@ -290,6 +319,32 @@ export const addMods = (inventory: IInventoryDatabaseDocument, itemsArray: IRawU
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const updateChallengeProgress = async (challenges: IUpdateChallengeProgressRequest, accountId: string) => {
 | 
				
			||||||
 | 
					    const inventory = await getInventory(accountId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    addChallenges(inventory, challenges.ChallengeProgress);
 | 
				
			||||||
 | 
					    addSeasonalChallengeHistory(inventory, challenges.SeasonChallengeHistory);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await inventory.save();
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const addSeasonalChallengeHistory = (
 | 
				
			||||||
 | 
					    inventory: IInventoryDatabaseDocument,
 | 
				
			||||||
 | 
					    itemsArray: ISeasonChallengeHistory[] | undefined
 | 
				
			||||||
 | 
					) => {
 | 
				
			||||||
 | 
					    const category = inventory.SeasonChallengeHistory;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    itemsArray?.forEach(({ challenge, id }) => {
 | 
				
			||||||
 | 
					        const itemIndex = category.findIndex(i => i.challenge === challenge);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (itemIndex !== -1) {
 | 
				
			||||||
 | 
					            category[itemIndex].id = id;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            category.push({ challenge, id });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const addChallenges = (inventory: IInventoryDatabaseDocument, itemsArray: IChallengeProgress[] | undefined) => {
 | 
					export const addChallenges = (inventory: IInventoryDatabaseDocument, itemsArray: IChallengeProgress[] | undefined) => {
 | 
				
			||||||
    const category = inventory.ChallengeProgress;
 | 
					    const category = inventory.ChallengeProgress;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -330,6 +385,24 @@ export const missionInventoryUpdate = async (data: IMissionInventoryUpdateReques
 | 
				
			|||||||
    // endo
 | 
					    // endo
 | 
				
			||||||
    inventory.FusionPoints += FusionPoints || 0;
 | 
					    inventory.FusionPoints += FusionPoints || 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // syndicate
 | 
				
			||||||
 | 
					    data.AffiliationChanges?.forEach(affiliation => {
 | 
				
			||||||
 | 
					        const syndicate = inventory.Affiliations.find(x => x.Tag == affiliation.Tag);
 | 
				
			||||||
 | 
					        if (syndicate !== undefined) {
 | 
				
			||||||
 | 
					            syndicate.Standing =
 | 
				
			||||||
 | 
					                syndicate.Standing === undefined ? affiliation.Standing : syndicate.Standing + affiliation.Standing;
 | 
				
			||||||
 | 
					            syndicate.Title = syndicate.Title === undefined ? affiliation.Title : syndicate.Title + affiliation.Title;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            inventory.Affiliations.push({
 | 
				
			||||||
 | 
					                Standing: affiliation.Standing,
 | 
				
			||||||
 | 
					                Title: affiliation.Title,
 | 
				
			||||||
 | 
					                Tag: affiliation.Tag,
 | 
				
			||||||
 | 
					                FreeFavorsEarned: [],
 | 
				
			||||||
 | 
					                FreeFavorsUsed: []
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Gear XP
 | 
					    // Gear XP
 | 
				
			||||||
    gearKeys.forEach(key => addGearExpByCategory(inventory, data[key], key));
 | 
					    gearKeys.forEach(key => addGearExpByCategory(inventory, data[key], key));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1028,6 +1028,11 @@ export interface ISeasonChallengeHistory {
 | 
				
			|||||||
    id: string;
 | 
					    id: string;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface ISeasonChallengeCompletions {
 | 
				
			||||||
 | 
					    challenge: string;
 | 
				
			||||||
 | 
					    id: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface ISentientSpawnChanceBoosters {
 | 
					export interface ISentientSpawnChanceBoosters {
 | 
				
			||||||
    numOceanMissionsCompleted: number;
 | 
					    numOceanMissionsCompleted: number;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -7,7 +7,9 @@ import {
 | 
				
			|||||||
    ICrewShipSalvagedWeaponSkin,
 | 
					    ICrewShipSalvagedWeaponSkin,
 | 
				
			||||||
    IMiscItem,
 | 
					    IMiscItem,
 | 
				
			||||||
    IMission,
 | 
					    IMission,
 | 
				
			||||||
    IRawUpgrade
 | 
					    IRawUpgrade,
 | 
				
			||||||
 | 
					    ISeasonChallengeCompletions,
 | 
				
			||||||
 | 
					    ISeasonChallengeHistory
 | 
				
			||||||
} from "./inventoryTypes/inventoryTypes";
 | 
					} from "./inventoryTypes/inventoryTypes";
 | 
				
			||||||
import { IWeaponClient } from "./inventoryTypes/weaponTypes";
 | 
					import { IWeaponClient } from "./inventoryTypes/weaponTypes";
 | 
				
			||||||
import { ISuitClient } from "./inventoryTypes/SuitTypes";
 | 
					import { ISuitClient } from "./inventoryTypes/SuitTypes";
 | 
				
			||||||
@ -25,9 +27,22 @@ export interface IThemeUpdateRequest {
 | 
				
			|||||||
    Sounds?: string;
 | 
					    Sounds?: string;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface IAffiliationChange {
 | 
				
			||||||
 | 
					    Tag: string;
 | 
				
			||||||
 | 
					    Standing: number;
 | 
				
			||||||
 | 
					    Title: number;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface IUpdateChallengeProgressRequest {
 | 
				
			||||||
 | 
					    ChallengeProgress: IChallengeProgress[];
 | 
				
			||||||
 | 
					    SeasonChallengeHistory: ISeasonChallengeHistory[];
 | 
				
			||||||
 | 
					    SeasonChallengeCompletions: ISeasonChallengeCompletions[];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface IMissionInventoryUpdateRequest {
 | 
					export interface IMissionInventoryUpdateRequest {
 | 
				
			||||||
    rewardsMultiplier?: number;
 | 
					    rewardsMultiplier?: number;
 | 
				
			||||||
    ActiveBoosters?: IBooster[];
 | 
					    ActiveBoosters?: IBooster[];
 | 
				
			||||||
 | 
					    AffiliationChanges?: IAffiliationChange[];
 | 
				
			||||||
    LongGuns?: IWeaponClient[];
 | 
					    LongGuns?: IWeaponClient[];
 | 
				
			||||||
    Pistols?: IWeaponClient[];
 | 
					    Pistols?: IWeaponClient[];
 | 
				
			||||||
    Suits?: ISuitClient[];
 | 
					    Suits?: ISuitClient[];
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										13
									
								
								src/types/syndicateTypes.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/types/syndicateTypes.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					export interface ISyndicateSacrifice {
 | 
				
			||||||
 | 
					    AffiliationTag: string;
 | 
				
			||||||
 | 
					    SacrificeLevel: number;
 | 
				
			||||||
 | 
					    AllowMultiple: boolean;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface ISyndicateSacrificeResponse {
 | 
				
			||||||
 | 
					    AffiliationTag: string;
 | 
				
			||||||
 | 
					    Level: number;
 | 
				
			||||||
 | 
					    LevelIncrease: number;
 | 
				
			||||||
 | 
					    InventoryChanges: any[];
 | 
				
			||||||
 | 
					    NewEpisodeReward: boolean;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user