diff --git a/src/controllers/api/customizeGuildRanksController.ts b/src/controllers/api/customizeGuildRanksController.ts new file mode 100644 index 00000000..3e237a81 --- /dev/null +++ b/src/controllers/api/customizeGuildRanksController.ts @@ -0,0 +1,16 @@ +import { getGuildForRequest } from "@/src/services/guildService"; +import { IGuildRank } from "@/src/types/guildTypes"; +import { RequestHandler } from "express"; + +export const customizeGuildRanksController: RequestHandler = async (req, res) => { + const guild = await getGuildForRequest(req); + const payload = JSON.parse(String(req.body)) as ICustomizeGuildRanksRequest; + // TODO: Verify permissions + guild.Ranks = payload.GuildRanks; + await guild.save(); + res.end(); +}; + +interface ICustomizeGuildRanksRequest { + GuildRanks: IGuildRank[]; +} diff --git a/src/models/guildModel.ts b/src/models/guildModel.ts index 3c786ca8..ec2a8159 100644 --- a/src/models/guildModel.ts +++ b/src/models/guildModel.ts @@ -6,7 +6,8 @@ import { ILongMOTD, IGuildMemberDatabase, IGuildLogClassChange, - IGuildLogTechChange + IGuildLogTechChange, + IGuildRank } from "@/src/types/guildTypes"; import { Document, Model, model, Schema, Types } from "mongoose"; import { fusionTreasuresSchema, typeCountSchema } from "./inventoryModels/inventoryModel"; @@ -58,6 +59,53 @@ const longMOTDSchema = new Schema( { _id: false } ); +const guildRankSchema = new Schema( + { + Name: String, + Permissions: Number + }, + { _id: false } +); + +const defaultRanks: IGuildRank[] = [ + { + Name: "/Lotus/Language/Game/Rank_Creator", + Permissions: 16351 + }, + { + Name: "/Lotus/Language/Game/Rank_Warlord", + Permissions: 16351 + }, + { + Name: "/Lotus/Language/Game/Rank_General", + Permissions: 4318 + }, + { + Name: "/Lotus/Language/Game/Rank_Officer", + Permissions: 4314 + }, + { + Name: "/Lotus/Language/Game/Rank_Leader", + Permissions: 4106 + }, + { + Name: "/Lotus/Language/Game/Rank_Sage", + Permissions: 4304 + }, + { + Name: "/Lotus/Language/Game/Rank_Soldier", + Permissions: 4098 + }, + { + Name: "/Lotus/Language/Game/Rank_Initiate", + Permissions: 4096 + }, + { + Name: "/Lotus/Language/Game/Rank_Utility", + Permissions: 4096 + } +]; + const guildLogTechChangeSchema = new Schema( { dateTime: Date, @@ -81,6 +129,7 @@ const guildSchema = new Schema( Name: { type: String, required: true, unique: true }, MOTD: { type: String, default: "" }, LongMOTD: { type: longMOTDSchema, default: undefined }, + Ranks: { type: [guildRankSchema], default: defaultRanks }, DojoComponents: { type: [dojoComponentSchema], default: [] }, DojoCapacity: { type: Number, default: 100 }, DojoEnergy: { type: Number, default: 5 }, diff --git a/src/routes/api.ts b/src/routes/api.ts index c2cf107f..b2e27b53 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -22,6 +22,7 @@ import { contributeToDojoComponentController } from "@/src/controllers/api/contr import { contributeToVaultController } from "@/src/controllers/api/contributeToVaultController"; import { createGuildController } from "@/src/controllers/api/createGuildController"; import { creditsController } from "@/src/controllers/api/creditsController"; +import { customizeGuildRanksController } from "@/src/controllers/api/customizeGuildRanksController"; import { declineGuildInviteController } from "@/src/controllers/api/declineGuildInviteController"; import { deleteSessionController } from "@/src/controllers/api/deleteSessionController"; import { destroyDojoDecoController } from "@/src/controllers/api/destroyDojoDecoController"; @@ -171,6 +172,7 @@ apiRouter.post("/contributeGuildClass.php", contributeGuildClassController); apiRouter.post("/contributeToDojoComponent.php", contributeToDojoComponentController); apiRouter.post("/contributeToVault.php", contributeToVaultController); apiRouter.post("/createGuild.php", createGuildController); +apiRouter.post("/customizeGuildRanks.php", customizeGuildRanksController); apiRouter.post("/destroyDojoDeco.php", destroyDojoDecoController); apiRouter.post("/dojoComponentRush.php", dojoComponentRushController); apiRouter.post("/drones.php", dronesController); diff --git a/src/services/guildService.ts b/src/services/guildService.ts index 3d53a211..061e685f 100644 --- a/src/services/guildService.ts +++ b/src/services/guildService.ts @@ -86,44 +86,7 @@ export const getGuildClient = async (guild: TGuildDatabaseDocument, accountId: s MOTD: guild.MOTD, LongMOTD: guild.LongMOTD, Members: members, - Ranks: [ - { - Name: "/Lotus/Language/Game/Rank_Creator", - Permissions: 16351 - }, - { - Name: "/Lotus/Language/Game/Rank_Warlord", - Permissions: 14303 - }, - { - Name: "/Lotus/Language/Game/Rank_General", - Permissions: 4318 - }, - { - Name: "/Lotus/Language/Game/Rank_Officer", - Permissions: 4314 - }, - { - Name: "/Lotus/Language/Game/Rank_Leader", - Permissions: 4106 - }, - { - Name: "/Lotus/Language/Game/Rank_Sage", - Permissions: 4304 - }, - { - Name: "/Lotus/Language/Game/Rank_Soldier", - Permissions: 4098 - }, - { - Name: "/Lotus/Language/Game/Rank_Initiate", - Permissions: 4096 - }, - { - Name: "/Lotus/Language/Game/Rank_Utility", - Permissions: 4096 - } - ], + Ranks: guild.Ranks, Tier: 1, Vault: getGuildVault(guild), Class: guild.Class, diff --git a/src/types/guildTypes.ts b/src/types/guildTypes.ts index de04588d..df7f7031 100644 --- a/src/types/guildTypes.ts +++ b/src/types/guildTypes.ts @@ -26,6 +26,7 @@ export interface IGuildDatabase { Name: string; MOTD: string; LongMOTD?: ILongMOTD; + Ranks: IGuildRank[]; DojoComponents: IDojoComponentDatabase[]; DojoCapacity: number; @@ -57,6 +58,27 @@ export interface ILongMOTD { //authorGuildName: ""; } +// 32 seems to be reserved +export enum GuildPermission { + Ruler = 1, // Change clan hierarchy + Advertiser = 8192, + Recruiter = 2, // Invite members + Regulator = 4, // Kick members + Promoter = 8, // Promote and demote members + Architect = 16, // Create and destroy rooms + Decorator = 1024, // Create and destroy decos + Treasurer = 64, // Contribute from vault and edit tax rate + Tech = 128, // Queue research + ChatModerator = 512, + Herald = 2048, // Change MOTD + Fabricator = 4096 // Replicate research +} + +export interface IGuildRank { + Name: string; + Permissions: number; +} + export interface IGuildMemberDatabase { accountId: Types.ObjectId; guildId: Types.ObjectId;