diff --git a/src/controllers/api/removeFromGuildController.ts b/src/controllers/api/removeFromGuildController.ts index b46e1bb1..705d597f 100644 --- a/src/controllers/api/removeFromGuildController.ts +++ b/src/controllers/api/removeFromGuildController.ts @@ -1,7 +1,7 @@ import { GuildMember } from "@/src/models/guildModel"; import { Inbox } from "@/src/models/inboxModel"; import { Account } from "@/src/models/loginModel"; -import { getGuildForRequest, hasGuildPermission } from "@/src/services/guildService"; +import { deleteGuild, getGuildForRequest, hasGuildPermission } from "@/src/services/guildService"; import { getInventory } from "@/src/services/inventoryService"; import { getAccountForRequest, getSuffixedName } from "@/src/services/loginService"; import { GuildPermission } from "@/src/types/guildTypes"; @@ -18,50 +18,54 @@ export const removeFromGuildController: RequestHandler = async (req, res) => { } 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.LevelKeys.findIndex(x => x.ItemType == "/Lotus/Types/Keys/DojoKey"); - if (itemIndex != -1) { - inventory.LevelKeys.splice(itemIndex, 1); - } else { - const recipeIndex = inventory.Recipes.findIndex(x => x.ItemType == "/Lotus/Types/Keys/DojoKeyBlueprint"); - if (recipeIndex != -1) { - inventory.Recipes.splice(recipeIndex, 1); - } - } - - await inventory.save(); - - // TODO: Handle clan leader kicking themselves (guild should be deleted in this case, I think) - } else if (guildMember.status == 2) { - // Delete the inbox message for the invite - await Inbox.deleteOne({ - ownerId: guildMember.accountId, - contextInfo: guild._id.toString(), - acceptAction: "GUILD_INVITE" - }); - } - await GuildMember.deleteOne({ _id: guildMember._id }); - - guild.RosterActivity ??= []; - if (isKick) { - const kickee = (await Account.findById(payload.userId))!; - guild.RosterActivity.push({ - dateTime: new Date(), - entryType: 12, - details: getSuffixedName(kickee) + "," + getSuffixedName(account) - }); + if (guildMember.rank == 0) { + await deleteGuild(guild._id); } else { - guild.RosterActivity.push({ - dateTime: new Date(), - entryType: 7, - details: getSuffixedName(account) - }); + if (guildMember.status == 0) { + const inventory = await getInventory(payload.userId); + inventory.GuildId = undefined; + + // Remove clan key or blueprint from kicked member + const itemIndex = inventory.LevelKeys.findIndex(x => x.ItemType == "/Lotus/Types/Keys/DojoKey"); + if (itemIndex != -1) { + inventory.LevelKeys.splice(itemIndex, 1); + } else { + const recipeIndex = inventory.Recipes.findIndex( + x => x.ItemType == "/Lotus/Types/Keys/DojoKeyBlueprint" + ); + if (recipeIndex != -1) { + inventory.Recipes.splice(recipeIndex, 1); + } + } + + await inventory.save(); + } else if (guildMember.status == 2) { + // Delete the inbox message for the invite + await Inbox.deleteOne({ + ownerId: guildMember.accountId, + contextInfo: guild._id.toString(), + acceptAction: "GUILD_INVITE" + }); + } + await GuildMember.deleteOne({ _id: guildMember._id }); + + guild.RosterActivity ??= []; + if (isKick) { + const kickee = (await Account.findById(payload.userId))!; + guild.RosterActivity.push({ + dateTime: new Date(), + entryType: 12, + details: getSuffixedName(kickee) + "," + getSuffixedName(account) + }); + } else { + guild.RosterActivity.push({ + dateTime: new Date(), + entryType: 7, + details: getSuffixedName(account) + }); + } + await guild.save(); } - await guild.save(); res.json({ _id: payload.userId, diff --git a/src/controllers/custom/deleteAccountController.ts b/src/controllers/custom/deleteAccountController.ts index e5c466b4..fad4485b 100644 --- a/src/controllers/custom/deleteAccountController.ts +++ b/src/controllers/custom/deleteAccountController.ts @@ -9,10 +9,17 @@ import { Ship } from "@/src/models/shipModel"; import { Stats } from "@/src/models/statsModel"; import { GuildMember } from "@/src/models/guildModel"; import { Leaderboard } from "@/src/models/leaderboardModel"; +import { deleteGuild } from "@/src/services/guildService"; export const deleteAccountController: RequestHandler = async (req, res) => { const accountId = await getAccountIdForRequest(req); - // TODO: Handle the account being the creator of a guild + + // If account is the founding warlord of a guild, delete that guild as well. + const guildMember = await GuildMember.findOne({ accountId, rank: 0, status: 0 }); + if (guildMember) { + await deleteGuild(guildMember.guildId); + } + await Promise.all([ Account.deleteOne({ _id: accountId }), GuildMember.deleteMany({ accountId: accountId }), diff --git a/src/services/guildService.ts b/src/services/guildService.ts index 76a6dae2..cdaf52fd 100644 --- a/src/services/guildService.ts +++ b/src/services/guildService.ts @@ -22,6 +22,7 @@ import { logger } from "../utils/logger"; import { config } from "./configService"; import { Account } from "../models/loginModel"; import { getRandomInt } from "./rngService"; +import { Inbox } from "../models/inboxModel"; export const getGuildForRequest = async (req: Request): Promise => { const accountId = await getAccountIdForRequest(req); @@ -360,3 +361,14 @@ export const removePigmentsFromGuildMembers = async (guildId: string | Types.Obj } } }; + +export const deleteGuild = async (guildId: Types.ObjectId): Promise => { + await Guild.deleteOne({ _id: guildId }); + await GuildMember.deleteMany({ guildId }); + + // If guild sent any invites, delete those inbox messages as well. + await Inbox.deleteMany({ + contextInfo: guildId.toString(), + acceptAction: "GUILD_INVITE" + }); +};