feat: divvy alliance vault #1455
							
								
								
									
										74
									
								
								src/controllers/api/divvyAllianceVaultController.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								src/controllers/api/divvyAllianceVaultController.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,74 @@
 | 
				
			|||||||
 | 
					import { Alliance, AllianceMember, Guild, GuildMember } from "@/src/models/guildModel";
 | 
				
			||||||
 | 
					import { getAccountForRequest } from "@/src/services/loginService";
 | 
				
			||||||
 | 
					import { GuildPermission } from "@/src/types/guildTypes";
 | 
				
			||||||
 | 
					import { logger } from "@/src/utils/logger";
 | 
				
			||||||
 | 
					import { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const divvyAllianceVaultController: RequestHandler = async (req, res) => {
 | 
				
			||||||
 | 
					    // Afaict, there's no way to put anything other than credits in the alliance vault (anymore?), so just no-op if this is not a request to divvy credits.
 | 
				
			||||||
 | 
					    if (req.query.credits == "1") {
 | 
				
			||||||
 | 
					        // Check requester is a warlord in their guild
 | 
				
			||||||
 | 
					        const account = await getAccountForRequest(req);
 | 
				
			||||||
 | 
					        const guildMember = (await GuildMember.findOne({ accountId: account._id, status: 0 }))!;
 | 
				
			||||||
 | 
					        if (guildMember.rank > 1) {
 | 
				
			||||||
 | 
					            res.status(400).end();
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Check guild has treasurer permissions in the alliance
 | 
				
			||||||
 | 
					        const allianceMember = (await AllianceMember.findOne({
 | 
				
			||||||
 | 
					            allianceId: req.query.allianceId,
 | 
				
			||||||
 | 
					            guildId: guildMember.guildId
 | 
				
			||||||
 | 
					        }))!;
 | 
				
			||||||
 | 
					        if (!(allianceMember.Permissions & GuildPermission.Treasurer)) {
 | 
				
			||||||
 | 
					            res.status(400).end();
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const allianceMembers = await AllianceMember.find({ allianceId: req.query.allianceId });
 | 
				
			||||||
 | 
					        const memberCounts: Record<string, number> = {};
 | 
				
			||||||
 | 
					        let totalMembers = 0;
 | 
				
			||||||
 | 
					        await parallelForeach(allianceMembers, async allianceMember => {
 | 
				
			||||||
 | 
					            const memberCount = await GuildMember.countDocuments({
 | 
				
			||||||
 | 
					                guildId: allianceMember.guildId
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            memberCounts[allianceMember.guildId.toString()] = memberCount;
 | 
				
			||||||
 | 
					            totalMembers += memberCount;
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        logger.debug(`alliance has ${totalMembers} members between all its clans`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const alliance = (await Alliance.findById(allianceMember.allianceId, "VaultRegularCredits"))!;
 | 
				
			||||||
 | 
					        if (alliance.VaultRegularCredits) {
 | 
				
			||||||
 | 
					            let creditsHandedOutInTotal = 0;
 | 
				
			||||||
 | 
					            await parallelForeach(allianceMembers, async allianceMember => {
 | 
				
			||||||
 | 
					                const memberCount = memberCounts[allianceMember.guildId.toString()];
 | 
				
			||||||
 | 
					                const cutPercentage = memberCount / totalMembers;
 | 
				
			||||||
 | 
					                const creditsToHandOut = Math.trunc(alliance.VaultRegularCredits! * cutPercentage);
 | 
				
			||||||
 | 
					                logger.debug(
 | 
				
			||||||
 | 
					                    `${allianceMember.guildId.toString()} has ${memberCount} member(s) = ${Math.trunc(cutPercentage * 100)}% of alliance; giving ${creditsToHandOut} credit(s)`
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					                if (creditsToHandOut != 0) {
 | 
				
			||||||
 | 
					                    await Guild.updateOne(
 | 
				
			||||||
 | 
					                        { _id: allianceMember.guildId },
 | 
				
			||||||
 | 
					                        { $inc: { VaultRegularCredits: creditsToHandOut } }
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                    creditsHandedOutInTotal += creditsToHandOut;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            alliance.VaultRegularCredits -= creditsHandedOutInTotal;
 | 
				
			||||||
 | 
					            logger.debug(
 | 
				
			||||||
 | 
					                `handed out ${creditsHandedOutInTotal} credits; alliance vault now has ${alliance.VaultRegularCredits} credit(s)`
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        await alliance.save();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    res.end();
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const parallelForeach = async <T>(data: T[], op: (datum: T) => Promise<void>): Promise<void> => {
 | 
				
			||||||
 | 
					    const promises: Promise<void>[] = [];
 | 
				
			||||||
 | 
					    for (const datum of data) {
 | 
				
			||||||
 | 
					        promises.push(op(datum));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    await Promise.all(promises);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@ -33,6 +33,7 @@ import { declineAllianceInviteController } from "@/src/controllers/api/declineAl
 | 
				
			|||||||
import { declineGuildInviteController } from "@/src/controllers/api/declineGuildInviteController";
 | 
					import { declineGuildInviteController } from "@/src/controllers/api/declineGuildInviteController";
 | 
				
			||||||
import { deleteSessionController } from "@/src/controllers/api/deleteSessionController";
 | 
					import { deleteSessionController } from "@/src/controllers/api/deleteSessionController";
 | 
				
			||||||
import { destroyDojoDecoController } from "@/src/controllers/api/destroyDojoDecoController";
 | 
					import { destroyDojoDecoController } from "@/src/controllers/api/destroyDojoDecoController";
 | 
				
			||||||
 | 
					import { divvyAllianceVaultController } from "@/src/controllers/api/divvyAllianceVaultController";
 | 
				
			||||||
import { dojoComponentRushController } from "@/src/controllers/api/dojoComponentRushController";
 | 
					import { dojoComponentRushController } from "@/src/controllers/api/dojoComponentRushController";
 | 
				
			||||||
import { dojoController } from "@/src/controllers/api/dojoController";
 | 
					import { dojoController } from "@/src/controllers/api/dojoController";
 | 
				
			||||||
import { dronesController } from "@/src/controllers/api/dronesController";
 | 
					import { dronesController } from "@/src/controllers/api/dronesController";
 | 
				
			||||||
@ -149,6 +150,7 @@ apiRouter.get("/credits.php", creditsController);
 | 
				
			|||||||
apiRouter.get("/declineAllianceInvite.php", declineAllianceInviteController);
 | 
					apiRouter.get("/declineAllianceInvite.php", declineAllianceInviteController);
 | 
				
			||||||
apiRouter.get("/declineGuildInvite.php", declineGuildInviteController);
 | 
					apiRouter.get("/declineGuildInvite.php", declineGuildInviteController);
 | 
				
			||||||
apiRouter.get("/deleteSession.php", deleteSessionController);
 | 
					apiRouter.get("/deleteSession.php", deleteSessionController);
 | 
				
			||||||
 | 
					apiRouter.get("/divvyAllianceVault.php", divvyAllianceVaultController);
 | 
				
			||||||
apiRouter.get("/dojo", dojoController);
 | 
					apiRouter.get("/dojo", dojoController);
 | 
				
			||||||
apiRouter.get("/drones.php", dronesController);
 | 
					apiRouter.get("/drones.php", dronesController);
 | 
				
			||||||
apiRouter.get("/getDailyDealStockLevels.php", getDailyDealStockLevelsController);
 | 
					apiRouter.get("/getDailyDealStockLevels.php", getDailyDealStockLevelsController);
 | 
				
			||||||
 | 
				
			|||||||
@ -315,7 +315,5 @@ export interface IAllianceMemberDatabase {
 | 
				
			|||||||
    Permissions: number;
 | 
					    Permissions: number;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO: GET /api/divvyAllianceVault.php?accountId=6633b81e9dba0b714f28ff02&nonce=5702391171614479&ct=MSI&guildId=663e9be9f741eeb5782f9df0&allianceId=000000000000000000000069&credits=1
 | 
					 | 
				
			||||||
// TODO: GET /api/divvyAllianceVault.php?accountId=6633b81e9dba0b714f28ff02&nonce=5702391171614479&ct=MSI&guildId=663e9be9f741eeb5782f9df0&allianceId=000000000000000000000069&credits=0
 | 
					 | 
				
			||||||
// TODO: GET /api/removeFromAlliance.php?accountId=6633b81e9dba0b714f28ff02&nonce=5702391171614479&ct=MSI&guildId=663e9be9f741eeb5782f9df0
 | 
					// TODO: GET /api/removeFromAlliance.php?accountId=6633b81e9dba0b714f28ff02&nonce=5702391171614479&ct=MSI&guildId=663e9be9f741eeb5782f9df0
 | 
				
			||||||
// TODO: GET /api/setAllianceGuildPermissions.php?accountId=6633b81e9dba0b714f28ff02&nonce=5702391171614479&ct=MSI&guildId=000000000000000000000042&perms=2
 | 
					// TODO: GET /api/setAllianceGuildPermissions.php?accountId=6633b81e9dba0b714f28ff02&nonce=5702391171614479&ct=MSI&guildId=000000000000000000000042&perms=2
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user