返回提交历史
Added
src/controllers/api/divvyAllianceVaultController.ts
+74
-0
Modified
src/routes/api.ts
+2
-0
Modified
src/types/guildTypes.ts
+0
-2
XFEstudio/XFESpaceNinjaServer
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
代码差异
3 个文件
+76
-2
@@ -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
};
@@ -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);
@@ -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