From c542d3df4b4f7fdf9c2e52dc2925a16415a543ab Mon Sep 17 00:00:00 2001 From: Sainan Date: Mon, 10 Mar 2025 19:17:49 +0100 Subject: [PATCH] feat: removeFromGuild --- .../api/removeFromGuildController.ts | 45 +++++++++++++++++++ src/routes/api.ts | 2 + 2 files changed, 47 insertions(+) create mode 100644 src/controllers/api/removeFromGuildController.ts diff --git a/src/controllers/api/removeFromGuildController.ts b/src/controllers/api/removeFromGuildController.ts new file mode 100644 index 00000000..c28700e4 --- /dev/null +++ b/src/controllers/api/removeFromGuildController.ts @@ -0,0 +1,45 @@ +import { GuildMember } from "@/src/models/guildModel"; +import { getGuildForRequest } from "@/src/services/guildService"; +import { getInventory } from "@/src/services/inventoryService"; +import { RequestHandler } from "express"; + +export const removeFromGuildController: RequestHandler = async (req, res) => { + const guild = await getGuildForRequest(req); + // TODO: Check permissions + const payload = JSON.parse(String(req.body)) as IRemoveFromGuildRequest; + + const guildMember = (await GuildMember.findOne({ accountId: payload.userId, guildId: guild._id }))!; + if (guildMember.status == 0) { + const inventory = await getInventory(payload.userId); + inventory.GuildId = undefined; + + // Remove clan key or blueprint from kicked member + const itemIndex = inventory.MiscItems.findIndex(x => x.ItemType == "/Lotus/Types/Keys/DojoKey"); + if (itemIndex != -1) { + inventory.MiscItems.splice(itemIndex, 1); + } else { + const recipeIndex = inventory.Recipes.findIndex(x => x.ItemType == "/Lotus/Types/Keys/DojoKeyBlueprint"); + if (recipeIndex != -1) { + inventory.Recipes.splice(itemIndex, 1); + } + } + + await inventory.save(); + + // TODO: Handle clan leader kicking themselves (guild should be deleted in this case, I think) + } else if (guildMember.status == 2) { + // TODO: Maybe the inbox message for the sent invite should be deleted? + } + await GuildMember.deleteOne({ _id: guildMember._id }); + + res.json({ + _id: payload.userId, + ItemToRemove: "/Lotus/Types/Keys/DojoKey", + RecipeToRemove: "/Lotus/Types/Keys/DojoKeyBlueprint" + }); +}; + +interface IRemoveFromGuildRequest { + userId: string; + kicker?: string; +} diff --git a/src/routes/api.ts b/src/routes/api.ts index 67e783e1..b0b44163 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -70,6 +70,7 @@ import { playerSkillsController } from "@/src/controllers/api/playerSkillsContro import { projectionManagerController } from "@/src/controllers/api/projectionManagerController"; import { purchaseController } from "@/src/controllers/api/purchaseController"; import { queueDojoComponentDestructionController } from "@/src/controllers/api/queueDojoComponentDestructionController"; +import { removeFromGuildController } from "@/src/controllers/api/removeFromGuildController"; import { rerollRandomModController } from "@/src/controllers/api/rerollRandomModController"; import { saveDialogueController } from "@/src/controllers/api/saveDialogueController"; import { saveLoadoutController } from "@/src/controllers/api/saveLoadout"; @@ -195,6 +196,7 @@ apiRouter.post("/placeDecoInComponent.php", placeDecoInComponentController); apiRouter.post("/playerSkills.php", playerSkillsController); apiRouter.post("/projectionManager.php", projectionManagerController); apiRouter.post("/purchase.php", purchaseController); +apiRouter.post("/removeFromGuild.php", removeFromGuildController); apiRouter.post("/rerollRandomMod.php", rerollRandomModController); apiRouter.post("/saveDialogue.php", saveDialogueController); apiRouter.post("/saveLoadout.php", saveLoadoutController);