XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

SpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 1 Star 0
返回提交历史

XFEstudio/SpaceNinjaServer

feat: divvy alliance vault (#1455)

Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1455 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>

b3374eb6
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

3 个文件 +76 -2
Added src/controllers/api/divvyAllianceVaultController.ts +74 -0
@@ -0,0 +1,74 @@
1 import { Alliance, AllianceMember, Guild, GuildMember } from "@/src/models/guildModel";
2 import { getAccountForRequest } from "@/src/services/loginService";
3 import { GuildPermission } from "@/src/types/guildTypes";
4 import { logger } from "@/src/utils/logger";
5 import { RequestHandler } from "express";
6
7 export const divvyAllianceVaultController: RequestHandler = async (req, res) => {
8 // 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.
9 if (req.query.credits == "1") {
10 // Check requester is a warlord in their guild
11 const account = await getAccountForRequest(req);
12 const guildMember = (await GuildMember.findOne({ accountId: account._id, status: 0 }))!;
13 if (guildMember.rank > 1) {
14 res.status(400).end();
15 return;
16 }
17
18 // Check guild has treasurer permissions in the alliance
19 const allianceMember = (await AllianceMember.findOne({
20 allianceId: req.query.allianceId,
21 guildId: guildMember.guildId
22 }))!;
23 if (!(allianceMember.Permissions & GuildPermission.Treasurer)) {
24 res.status(400).end();
25 return;
26 }
27
28 const allianceMembers = await AllianceMember.find({ allianceId: req.query.allianceId });
29 const memberCounts: Record<string, number> = {};
30 let totalMembers = 0;
31 await parallelForeach(allianceMembers, async allianceMember => {
32 const memberCount = await GuildMember.countDocuments({
33 guildId: allianceMember.guildId
34 });
35 memberCounts[allianceMember.guildId.toString()] = memberCount;
36 totalMembers += memberCount;
37 });
38 logger.debug(`alliance has ${totalMembers} members between all its clans`);
39
40 const alliance = (await Alliance.findById(allianceMember.allianceId, "VaultRegularCredits"))!;
41 if (alliance.VaultRegularCredits) {
42 let creditsHandedOutInTotal = 0;
43 await parallelForeach(allianceMembers, async allianceMember => {
44 const memberCount = memberCounts[allianceMember.guildId.toString()];
45 const cutPercentage = memberCount / totalMembers;
46 const creditsToHandOut = Math.trunc(alliance.VaultRegularCredits! * cutPercentage);
47 logger.debug(
48 `${allianceMember.guildId.toString()} has ${memberCount} member(s) = ${Math.trunc(cutPercentage * 100)}% of alliance; giving ${creditsToHandOut} credit(s)`
49 );
50 if (creditsToHandOut != 0) {
51 await Guild.updateOne(
52 { _id: allianceMember.guildId },
53 { $inc: { VaultRegularCredits: creditsToHandOut } }
54 );
55 creditsHandedOutInTotal += creditsToHandOut;
56 }
57 });
58 alliance.VaultRegularCredits -= creditsHandedOutInTotal;
59 logger.debug(
60 `handed out ${creditsHandedOutInTotal} credits; alliance vault now has ${alliance.VaultRegularCredits} credit(s)`
61 );
62 }
63 await alliance.save();
64 }
65 res.end();
66 };
67
68 const parallelForeach = async <T>(data: T[], op: (datum: T) => Promise<void>): Promise<void> => {
69 const promises: Promise<void>[] = [];
70 for (const datum of data) {
71 promises.push(op(datum));
72 }
73 await Promise.all(promises);
74 };
Modified src/routes/api.ts +2 -0
@@ -33,6 +33,7 @@ import { declineAllianceInviteController } from "@/src/controllers/api/declineAl
33 33 import { declineGuildInviteController } from "@/src/controllers/api/declineGuildInviteController";
34 34 import { deleteSessionController } from "@/src/controllers/api/deleteSessionController";
35 35 import { destroyDojoDecoController } from "@/src/controllers/api/destroyDojoDecoController";
36 import { divvyAllianceVaultController } from "@/src/controllers/api/divvyAllianceVaultController";
36 37 import { dojoComponentRushController } from "@/src/controllers/api/dojoComponentRushController";
37 38 import { dojoController } from "@/src/controllers/api/dojoController";
38 39 import { dronesController } from "@/src/controllers/api/dronesController";
@@ -149,6 +150,7 @@ apiRouter.get("/credits.php", creditsController);
149 150 apiRouter.get("/declineAllianceInvite.php", declineAllianceInviteController);
150 151 apiRouter.get("/declineGuildInvite.php", declineGuildInviteController);
151 152 apiRouter.get("/deleteSession.php", deleteSessionController);
153 apiRouter.get("/divvyAllianceVault.php", divvyAllianceVaultController);
152 154 apiRouter.get("/dojo", dojoController);
153 155 apiRouter.get("/drones.php", dronesController);
154 156 apiRouter.get("/getDailyDealStockLevels.php", getDailyDealStockLevelsController);
Modified src/types/guildTypes.ts +0 -2
@@ -318,7 +318,5 @@ export interface IAllianceMemberDatabase {
318 318 Permissions: number;
319 319 }
320 320
321 // TODO: GET /api/divvyAllianceVault.php?accountId=6633b81e9dba0b714f28ff02&nonce=5702391171614479&ct=MSI&guildId=663e9be9f741eeb5782f9df0&allianceId=000000000000000000000069&credits=1
322 // TODO: GET /api/divvyAllianceVault.php?accountId=6633b81e9dba0b714f28ff02&nonce=5702391171614479&ct=MSI&guildId=663e9be9f741eeb5782f9df0&allianceId=000000000000000000000069&credits=0
323 321 // TODO: GET /api/removeFromAlliance.php?accountId=6633b81e9dba0b714f28ff02&nonce=5702391171614479&ct=MSI&guildId=663e9be9f741eeb5782f9df0
324 322 // TODO: GET /api/setAllianceGuildPermissions.php?accountId=6633b81e9dba0b714f28ff02&nonce=5702391171614479&ct=MSI&guildId=000000000000000000000042&perms=2