From 63712121af8104ed76ae5419c57af51e105b0f95 Mon Sep 17 00:00:00 2001 From: Sainan Date: Thu, 16 May 2024 01:34:38 +0200 Subject: [PATCH] feat: more work on clans (#214) Co-authored-by: Sainan --- src/controllers/api/createGuildController.ts | 6 +-- src/controllers/api/dojoController.ts | 5 ++ src/controllers/api/getGuildController.ts | 52 ++++++++++++++++++- src/controllers/api/getGuildDojoController.ts | 51 ++++++++++++++++++ src/controllers/api/getGuildLogController.ts | 11 ++++ src/controllers/api/guildTechController.ts | 5 ++ src/models/guildModel.ts | 24 +++++---- src/routes/api.ts | 8 +++ src/types/guildTypes.ts | 36 +++++++++++++ 9 files changed, 183 insertions(+), 15 deletions(-) create mode 100644 src/controllers/api/dojoController.ts create mode 100644 src/controllers/api/getGuildDojoController.ts create mode 100644 src/controllers/api/getGuildLogController.ts create mode 100644 src/controllers/api/guildTechController.ts diff --git a/src/controllers/api/createGuildController.ts b/src/controllers/api/createGuildController.ts index cb101aba..88cace67 100644 --- a/src/controllers/api/createGuildController.ts +++ b/src/controllers/api/createGuildController.ts @@ -2,7 +2,7 @@ import { RequestHandler } from "express"; import { getJSONfromString } from "@/src/helpers/stringHelpers"; import { Inventory } from "@/src/models/inventoryModels/inventoryModel"; import { Guild } from "@/src/models/guildModel"; -import { IGuild, ICreateGuildRequest } from "@/src/types/guildTypes"; +import { ICreateGuildRequest } from "@/src/types/guildTypes"; const createGuildController: RequestHandler = async (req, res) => { const payload: ICreateGuildRequest = getJSONfromString(req.body.toString()); @@ -10,7 +10,7 @@ const createGuildController: RequestHandler = async (req, res) => { // Create guild on database const guild = new Guild({ Name: payload.guildName - } satisfies IGuild); + }); await guild.save(); // Update inventory @@ -19,7 +19,7 @@ const createGuildController: RequestHandler = async (req, res) => { // Set GuildId inventory.GuildId = guild._id; - // Give clan key + // Give clan key (TODO: This should only be a blueprint) inventory.LevelKeys ??= []; inventory.LevelKeys.push({ ItemType: "/Lotus/Types/Keys/DojoKey", diff --git a/src/controllers/api/dojoController.ts b/src/controllers/api/dojoController.ts new file mode 100644 index 00000000..c14d9316 --- /dev/null +++ b/src/controllers/api/dojoController.ts @@ -0,0 +1,5 @@ +import { RequestHandler } from "express"; + +export const dojoController: RequestHandler = (_req, res) => { + res.json("-1"); // Tell client to use authorised request. +}; diff --git a/src/controllers/api/getGuildController.ts b/src/controllers/api/getGuildController.ts index 81dfde24..a91bf5dd 100644 --- a/src/controllers/api/getGuildController.ts +++ b/src/controllers/api/getGuildController.ts @@ -1,6 +1,7 @@ import { RequestHandler } from "express"; import { Inventory } from "@/src/models/inventoryModels/inventoryModel"; import { Guild } from "@/src/models/guildModel"; +import { toOid } from "@/src/helpers/inventoryHelpers"; const getGuildController: RequestHandler = async (req, res) => { if (!req.query.accountId) { @@ -15,7 +16,56 @@ const getGuildController: RequestHandler = async (req, res) => { if (inventory.GuildId) { const guild = await Guild.findOne({ _id: inventory.GuildId }); if (guild) { - res.json(guild); + res.json({ + _id: toOid(guild._id), + Name: guild.Name, + Members: [ + { + _id: { $oid: req.query.accountId }, + Rank: 0, + Status: 0 + } + ], + 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 + } + ], + Tier: 1 + }); return; } } diff --git a/src/controllers/api/getGuildDojoController.ts b/src/controllers/api/getGuildDojoController.ts new file mode 100644 index 00000000..b38b23a9 --- /dev/null +++ b/src/controllers/api/getGuildDojoController.ts @@ -0,0 +1,51 @@ +import { RequestHandler } from "express"; +import { Types } from "mongoose"; +import { Guild } from "@/src/models/guildModel"; +import { IDojoClient } from "@/src/types/guildTypes"; +import { toOid, toMongoDate } from "@/src/helpers/inventoryHelpers"; + +export const getGuildDojoController: RequestHandler = async (req, res) => { + const guildId = req.query.guildId as string; + + const guild = await Guild.findOne({ _id: guildId }); + if (!guild) { + res.status(404).end(); + return; + } + + // Populate dojo info if not present + if (!guild.DojoComponents || guild.DojoComponents.length == 0) { + guild.DojoComponents = [ + { + _id: new Types.ObjectId(), + pf: "/Lotus/Levels/ClanDojo/DojoHall.level", + ppf: "", + CompletionTime: new Date(Date.now()) + } + ]; + guild.save(); + } + + const dojo: IDojoClient = { + _id: { $oid: guildId }, + Name: guild.Name, + Tier: 1, + FixedContributions: true, + DojoRevision: 1, + RevisionTime: Math.round(Date.now() / 1000), + Energy: 5, + Capacity: 100, + DojoRequestStatus: 0, + DojoComponents: [] + }; + guild.DojoComponents.forEach(dojoComponent => { + dojo.DojoComponents.push({ + id: toOid(dojoComponent._id), + pf: dojoComponent.pf, + ppf: dojoComponent.ppf, + CompletionTime: toMongoDate(dojoComponent.CompletionTime), + DecoCapacity: 600 + }); + }); + res.json(dojo); +}; diff --git a/src/controllers/api/getGuildLogController.ts b/src/controllers/api/getGuildLogController.ts new file mode 100644 index 00000000..2919ce31 --- /dev/null +++ b/src/controllers/api/getGuildLogController.ts @@ -0,0 +1,11 @@ +import { RequestHandler } from "express"; + +export const getGuildLogController: RequestHandler = (_req, res) => { + res.json({ + RoomChanges: [], + TechChanges: [], + RosterActivity: [], + StandingsUpdates: [], + ClassChanges: [] + }); +}; diff --git a/src/controllers/api/guildTechController.ts b/src/controllers/api/guildTechController.ts new file mode 100644 index 00000000..9e4243da --- /dev/null +++ b/src/controllers/api/guildTechController.ts @@ -0,0 +1,5 @@ +import { RequestHandler } from "express"; + +export const guildTechController: RequestHandler = (_req, res) => { + res.status(500).end(); // This is what I got for a fresh clan. +}; diff --git a/src/models/guildModel.ts b/src/models/guildModel.ts index 601e73e3..157007a0 100644 --- a/src/models/guildModel.ts +++ b/src/models/guildModel.ts @@ -1,16 +1,18 @@ -import { IGuild } from "@/src/types/guildTypes"; +import { IGuildDatabase, IDojoComponentDatabase } from "@/src/types/guildTypes"; import { model, Schema } from "mongoose"; -import { toOid } from "@/src/helpers/inventoryHelpers"; -const guildSchema = new Schema({ - Name: { type: String, required: true } +const dojoComponentSchema = new Schema({ + pf: { type: String, required: true }, + ppf: String, + CompletionTime: Date }); -guildSchema.set("toJSON", { - virtuals: true, - transform(_document, guild) { - guild._id = toOid(guild._id); - } -}); +const guildSchema = new Schema( + { + Name: { type: String, required: true }, + DojoComponents: [dojoComponentSchema] + }, + { id: false } +); -export const Guild = model("Guild", guildSchema); +export const Guild = model("Guild", guildSchema); diff --git a/src/routes/api.ts b/src/routes/api.ts index 5770ee11..8ca15002 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -48,6 +48,10 @@ import { sellController } from "@/src/controllers/api/sellController"; import { upgradesController } from "@/src/controllers/api/upgradesController"; import { setSupportedSyndicateController } from "@/src/controllers/api/setSupportedSyndicateController"; import { getDailyDealStockLevelsController } from "@/src/controllers/api/getDailyDealStockLevelsController"; +import { getGuildLogController } from "../controllers/api/getGuildLogController"; +import { guildTechController } from "../controllers/api/guildTechController"; +import { dojoController } from "@/src/controllers/api/dojoController"; +import { getGuildDojoController } from "@/src/controllers/api/getGuildDojoController"; const apiRouter = express.Router(); @@ -77,6 +81,9 @@ apiRouter.get("/setActiveShip.php", setActiveShipController); apiRouter.get("/getGuild.php", getGuildController); apiRouter.get("/setSupportedSyndicate.php", setSupportedSyndicateController); apiRouter.get("/getDailyDealStockLevels.php", getDailyDealStockLevelsController); +apiRouter.get("/getGuildLog.php", getGuildLogController); +apiRouter.get("/dojo", dojoController); +apiRouter.get("/getGuildDojo.php", getGuildDojoController); // post // eslint-disable-next-line @typescript-eslint/no-misused-promises @@ -106,5 +113,6 @@ apiRouter.post("/addFriendImage.php", addFriendImageController); apiRouter.post("/createGuild.php", createGuildController); apiRouter.post("/sell.php", sellController); apiRouter.post("/upgrades.php", upgradesController); +apiRouter.post("/guildTech.php", guildTechController); export { apiRouter }; diff --git a/src/types/guildTypes.ts b/src/types/guildTypes.ts index c5f1f6f2..c969db6a 100644 --- a/src/types/guildTypes.ts +++ b/src/types/guildTypes.ts @@ -1,7 +1,43 @@ +import { Types } from "mongoose"; +import { IOid, IMongoDate } from "@/src/types/commonTypes"; + export interface IGuild { Name: string; } +export interface IGuildDatabase extends IGuild { + _id: Types.ObjectId; + DojoComponents?: IDojoComponentDatabase[]; +} + export interface ICreateGuildRequest { guildName: string; } + +export interface IDojoClient { + _id: IOid; // ID of the guild + Name: string; + Tier: number; + FixedContributions: boolean; + DojoRevision: number; + RevisionTime: number; + Energy: number; + Capacity: number; + DojoRequestStatus: number; + DojoComponents: IDojoComponentClient[]; +} + +export interface IDojoComponentClient { + id: IOid; + pf: string; + ppf: string; + CompletionTime: IMongoDate; + DecoCapacity: number; +} + +export interface IDojoComponentDatabase { + _id: Types.ObjectId; + pf: string; + ppf: string; + CompletionTime: Date; +}