feat: clan name discriminators (#1147)

Closes #1145

Reviewed-on: OpenWF/SpaceNinjaServer#1147
This commit is contained in:
Sainan 2025-03-11 10:31:56 -07:00
parent 1b54bcd1e0
commit d24aac2ab2
4 changed files with 29 additions and 5 deletions

View File

@ -46,7 +46,7 @@ export const addToGuildController: RequestHandler = async (req, res) => {
arg: [ arg: [
{ {
Key: "clan", Key: "clan",
Tag: guild.Name + "#000" Tag: guild.Name
} }
], ],
sub: "/Lotus/Language/Menu/Mailbox_ClanInvite_Title", sub: "/Lotus/Language/Menu/Mailbox_ClanInvite_Title",

View File

@ -2,7 +2,11 @@ import { RequestHandler } from "express";
import { getAccountIdForRequest } from "@/src/services/loginService"; import { getAccountIdForRequest } from "@/src/services/loginService";
import { getJSONfromString } from "@/src/helpers/stringHelpers"; import { getJSONfromString } from "@/src/helpers/stringHelpers";
import { Guild, GuildMember } from "@/src/models/guildModel"; 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) => { export const createGuildController: RequestHandler = async (req, res) => {
const accountId = await getAccountIdForRequest(req); const accountId = await getAccountIdForRequest(req);
@ -10,7 +14,7 @@ export const createGuildController: RequestHandler = async (req, res) => {
// Create guild on database // Create guild on database
const guild = new Guild({ const guild = new Guild({
Name: payload.guildName Name: await createUniqueClanName(payload.guildName)
}); });
await guild.save(); await guild.save();
@ -24,7 +28,7 @@ export const createGuildController: RequestHandler = async (req, res) => {
await updateInventoryForConfirmedGuildJoin(accountId, guild._id); await updateInventoryForConfirmedGuildJoin(accountId, guild._id);
res.json(guild); res.json(await getGuildClient(guild, accountId));
}; };
interface ICreateGuildRequest { interface ICreateGuildRequest {

View File

@ -3,7 +3,7 @@ import { Guild } from "@/src/models/guildModel";
import { getAccountIdForRequest } from "@/src/services/loginService"; import { getAccountIdForRequest } from "@/src/services/loginService";
import { logger } from "@/src/utils/logger"; import { logger } from "@/src/utils/logger";
import { getInventory } from "@/src/services/inventoryService"; 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 getGuildController: RequestHandler = async (req, res) => {
const accountId = await getAccountIdForRequest(req); const accountId = await getAccountIdForRequest(req);
@ -11,6 +11,12 @@ const getGuildController: RequestHandler = async (req, res) => {
if (inventory.GuildId) { if (inventory.GuildId) {
const guild = await Guild.findOne({ _id: inventory.GuildId }); const guild = await Guild.findOne({ _id: inventory.GuildId });
if (guild) { 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()) { if (guild.CeremonyResetDate && Date.now() >= guild.CeremonyResetDate.getTime()) {
logger.debug(`ascension ceremony is over`); logger.debug(`ascension ceremony is over`);
guild.CeremonyEndo = undefined; guild.CeremonyEndo = undefined;

View File

@ -18,6 +18,7 @@ import { ExportDojoRecipes, IDojoBuild } from "warframe-public-export-plus";
import { logger } from "../utils/logger"; import { logger } from "../utils/logger";
import { config } from "./configService"; import { config } from "./configService";
import { Account } from "../models/loginModel"; import { Account } from "../models/loginModel";
import { getRandomInt } from "./rngService";
export const getGuildForRequest = async (req: Request): Promise<TGuildDatabaseDocument> => { export const getGuildForRequest = async (req: Request): Promise<TGuildDatabaseDocument> => {
const accountId = await getAccountIdForRequest(req); const accountId = await getAccountIdForRequest(req);
@ -315,3 +316,16 @@ export const updateInventoryForConfirmedGuildJoin = async (
await inventory.save(); await inventory.save();
}; };
export const createUniqueClanName = async (name: string): Promise<string> => {
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}`);
};