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: leave alliance/kick alliance members (#1459)

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

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

代码差异

4 个文件 +61 -5
Added src/controllers/api/removeFromAllianceController.ts +38 -0
@@ -0,0 +1,38 @@
1 import { AllianceMember, Guild, GuildMember } from "@/src/models/guildModel";
2 import { deleteAlliance } from "@/src/services/guildService";
3 import { getAccountForRequest } from "@/src/services/loginService";
4 import { GuildPermission } from "@/src/types/guildTypes";
5 import { RequestHandler } from "express";
6
7 export const removeFromAllianceController: RequestHandler = async (req, res) => {
8 // Check requester is a warlord in their guild
9 const account = await getAccountForRequest(req);
10 const guildMember = (await GuildMember.findOne({ accountId: account._id, status: 0 }))!;
11 if (guildMember.rank > 1) {
12 res.status(400).json({ Error: 104 });
13 return;
14 }
15
16 let allianceMember = (await AllianceMember.findOne({ guildId: guildMember.guildId }))!;
17 if (!guildMember.guildId.equals(req.query.guildId as string)) {
18 // Removing a guild that is not our own needs additional permissions
19 if (!(allianceMember.Permissions & GuildPermission.Ruler)) {
20 res.status(400).json({ Error: 104 });
21 return;
22 }
23
24 // Update allianceMember to point to the alliance to kick
25 allianceMember = (await AllianceMember.findOne({ guildId: req.query.guildId }))!;
26 }
27
28 if (allianceMember.Permissions & GuildPermission.Ruler) {
29 await deleteAlliance(allianceMember.allianceId);
30 } else {
31 await Promise.all([
32 await Guild.updateOne({ _id: allianceMember.guildId }, { $unset: { AllianceId: "" } }),
33 await AllianceMember.deleteOne({ _id: allianceMember._id })
34 ]);
35 }
36
37 res.end();
38 };
Modified src/routes/api.ts +2 -0
@@ -92,6 +92,7 @@ import { purchaseController } from "@/src/controllers/api/purchaseController";
92 92 import { queueDojoComponentDestructionController } from "@/src/controllers/api/queueDojoComponentDestructionController";
93 93 import { redeemPromoCodeController } from "@/src/controllers/api/redeemPromoCodeController";
94 94 import { releasePetController } from "@/src/controllers/api/releasePetController";
95 import { removeFromAllianceController } from "@/src/controllers/api/removeFromAllianceController";
95 96 import { removeFromGuildController } from "@/src/controllers/api/removeFromGuildController";
96 97 import { rerollRandomModController } from "@/src/controllers/api/rerollRandomModController";
97 98 import { retrievePetFromStasisController } from "@/src/controllers/api/retrievePetFromStasisController";
@@ -173,6 +174,7 @@ apiRouter.get("/marketRecommendations.php", marketRecommendationsController);
173 174 apiRouter.get("/marketSearchRecommendations.php", marketRecommendationsController);
174 175 apiRouter.get("/modularWeaponSale.php", modularWeaponSaleController);
175 176 apiRouter.get("/queueDojoComponentDestruction.php", queueDojoComponentDestructionController);
177 apiRouter.get("/removeFromAlliance.php", removeFromAllianceController);
176 178 apiRouter.get("/setActiveQuest.php", setActiveQuestController);
177 179 apiRouter.get("/setActiveShip.php", setActiveShipController);
178 180 apiRouter.get("/setBootLocation.php", setBootLocationController);
Modified src/services/guildService.ts +19 -2
@@ -1,7 +1,7 @@
1 1 import { Request } from "express";
2 2 import { getAccountIdForRequest } from "@/src/services/loginService";
3 3 import { getInventory } from "@/src/services/inventoryService";
4 import { AllianceMember, Guild, GuildAd, GuildMember, TGuildDatabaseDocument } from "@/src/models/guildModel";
4 import { Alliance, AllianceMember, Guild, GuildAd, GuildMember, TGuildDatabaseDocument } from "@/src/models/guildModel";
5 5 import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
6 6 import {
7 7 GuildPermission,
@@ -613,9 +613,26 @@ export const deleteGuild = async (guildId: Types.ObjectId): Promise<void> => {
613 613
614 614 await GuildAd.deleteOne({ GuildId: guildId });
615 615
616 // If guild is the creator of an alliance, delete that as well.
617 const allianceMember = await AllianceMember.findOne({ guildId, Pending: false });
618 if (allianceMember) {
619 if (allianceMember.Permissions & GuildPermission.Ruler) {
620 await deleteAlliance(allianceMember.allianceId);
621 }
622 }
623
616 624 await AllianceMember.deleteMany({ guildId });
625 };
626
627 export const deleteAlliance = async (allianceId: Types.ObjectId): Promise<void> => {
628 const allianceMembers = await AllianceMember.find({ allianceId, Pending: false });
629 await parallelForeach(allianceMembers, async allianceMember => {
630 await Guild.updateOne({ _id: allianceMember.guildId }, { $unset: { AllianceId: "" } });
631 });
632
633 await AllianceMember.deleteMany({ allianceId });
617 634
618 // TODO: If this guild was the founding guild of an alliance (ruler permission), that would need to be forcefully deleted now as well.
635 await Alliance.deleteOne({ _id: allianceId });
619 636 };
620 637
621 638 export const getAllianceClient = async (
Modified src/types/guildTypes.ts +2 -3
@@ -71,11 +71,11 @@ export interface ILongMOTD {
71 71
72 72 // 32 seems to be reserved
73 73 export enum GuildPermission {
74 Ruler = 1, // Clan: Change hierarchy. Alliance: Kick clans.
74 Ruler = 1, // Clan: Change hierarchy. Alliance (Creator only): Kick clans.
75 75 Advertiser = 8192,
76 76 Recruiter = 2, // Send invites (Clans & Alliances)
77 77 Regulator = 4, // Kick members
78 Promoter = 8, // Clan: Promote and demote members. Alliance: Change clan permissions.
78 Promoter = 8, // Clan: Promote and demote members. Alliance (Creator only): Change clan permissions.
79 79 Architect = 16, // Create and destroy rooms
80 80 Decorator = 1024, // Create and destroy decos
81 81 Treasurer = 64, // Clan: Contribute from vault and edit tax rate. Alliance: Divvy vault.
@@ -318,5 +318,4 @@ export interface IAllianceMemberDatabase {
318 318 Permissions: number;
319 319 }
320 320
321 // TODO: GET /api/removeFromAlliance.php?accountId=6633b81e9dba0b714f28ff02&nonce=5702391171614479&ct=MSI&guildId=663e9be9f741eeb5782f9df0
322 321 // TODO: GET /api/setAllianceGuildPermissions.php?accountId=6633b81e9dba0b714f28ff02&nonce=5702391171614479&ct=MSI&guildId=000000000000000000000042&perms=2