From d24aac2ab27f49f836c7903f3477c6315664e5e2 Mon Sep 17 00:00:00 2001 From: Sainan Date: Tue, 11 Mar 2025 10:31:56 -0700 Subject: [PATCH] feat: clan name discriminators (#1147) Closes #1145 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1147 --- src/controllers/api/addToGuildController.ts | 2 +- src/controllers/api/createGuildController.ts | 10 +++++++--- src/controllers/api/getGuildController.ts | 8 +++++++- src/services/guildService.ts | 14 ++++++++++++++ 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/controllers/api/addToGuildController.ts b/src/controllers/api/addToGuildController.ts index 3c95085c5..a7a3f250f 100644 --- a/src/controllers/api/addToGuildController.ts +++ b/src/controllers/api/addToGuildController.ts @@ -46,7 +46,7 @@ export const addToGuildController: RequestHandler = async (req, res) => { arg: [ { Key: "clan", - Tag: guild.Name + "#000" + Tag: guild.Name } ], sub: "/Lotus/Language/Menu/Mailbox_ClanInvite_Title", diff --git a/src/controllers/api/createGuildController.ts b/src/controllers/api/createGuildController.ts index dc0930b28..cef7e4236 100644 --- a/src/controllers/api/createGuildController.ts +++ b/src/controllers/api/createGuildController.ts @@ -2,7 +2,11 @@ import { RequestHandler } from "express"; import { getAccountIdForRequest } from "@/src/services/loginService"; import { getJSONfromString } from "@/src/helpers/stringHelpers"; import { Guild, GuildMember } from "@/src/models/guildModel"; -import { updateInventoryForConfirmedGuildJoin } from "@/src/services/guildService"; +import { + createUniqueClanName, + getGuildClient, + updateInventoryForConfirmedGuildJoin +} from "@/src/services/guildService"; export const createGuildController: RequestHandler = async (req, res) => { const accountId = await getAccountIdForRequest(req); @@ -10,7 +14,7 @@ export const createGuildController: RequestHandler = async (req, res) => { // Create guild on database const guild = new Guild({ - Name: payload.guildName + Name: await createUniqueClanName(payload.guildName) }); await guild.save(); @@ -24,7 +28,7 @@ export const createGuildController: RequestHandler = async (req, res) => { await updateInventoryForConfirmedGuildJoin(accountId, guild._id); - res.json(guild); + res.json(await getGuildClient(guild, accountId)); }; interface ICreateGuildRequest { diff --git a/src/controllers/api/getGuildController.ts b/src/controllers/api/getGuildController.ts index be6975304..9dcfcbf1d 100644 --- a/src/controllers/api/getGuildController.ts +++ b/src/controllers/api/getGuildController.ts @@ -3,7 +3,7 @@ import { Guild } from "@/src/models/guildModel"; import { getAccountIdForRequest } from "@/src/services/loginService"; import { logger } from "@/src/utils/logger"; import { getInventory } from "@/src/services/inventoryService"; -import { getGuildClient } from "@/src/services/guildService"; +import { createUniqueClanName, getGuildClient } from "@/src/services/guildService"; const getGuildController: RequestHandler = async (req, res) => { const accountId = await getAccountIdForRequest(req); @@ -11,6 +11,12 @@ const getGuildController: RequestHandler = async (req, res) => { if (inventory.GuildId) { const guild = await Guild.findOne({ _id: inventory.GuildId }); if (guild) { + // Handle guilds created before we added discriminators + if (guild.Name.indexOf("#") == -1) { + guild.Name = await createUniqueClanName(guild.Name); + await guild.save(); + } + if (guild.CeremonyResetDate && Date.now() >= guild.CeremonyResetDate.getTime()) { logger.debug(`ascension ceremony is over`); guild.CeremonyEndo = undefined; diff --git a/src/services/guildService.ts b/src/services/guildService.ts index a27c25b22..3d53a2116 100644 --- a/src/services/guildService.ts +++ b/src/services/guildService.ts @@ -18,6 +18,7 @@ import { ExportDojoRecipes, IDojoBuild } from "warframe-public-export-plus"; import { logger } from "../utils/logger"; import { config } from "./configService"; import { Account } from "../models/loginModel"; +import { getRandomInt } from "./rngService"; export const getGuildForRequest = async (req: Request): Promise => { const accountId = await getAccountIdForRequest(req); @@ -315,3 +316,16 @@ export const updateInventoryForConfirmedGuildJoin = async ( await inventory.save(); }; + +export const createUniqueClanName = async (name: string): Promise => { + const initialDiscriminator = getRandomInt(0, 999); + let discriminator = initialDiscriminator; + do { + const fullName = name + "#" + discriminator.toString().padStart(3, "0"); + if (!(await Guild.exists({ Name: fullName }))) { + return fullName; + } + discriminator = (discriminator + 1) % 1000; + } while (discriminator != initialDiscriminator); + throw new Error(`clan name is so unoriginal it's already been done 1000 times: ${name}`); +};