feat: polychrome #1495

Merged
Sainan merged 1 commits from polychrome into main 2025-04-07 05:30:01 -07:00
6 changed files with 90 additions and 3 deletions

View File

@ -64,7 +64,12 @@ export const placeDecoInComponentController: RequestHandler = async (req, res) =
} }
if (!meta || (meta.price == 0 && meta.ingredients.length == 0)) { if (!meta || (meta.price == 0 && meta.ingredients.length == 0)) {
deco.CompletionTime = new Date(); deco.CompletionTime = new Date();
} else if (guild.AutoContributeFromVault && guild.VaultRegularCredits && guild.VaultMiscItems) { } else if (
guild.AutoContributeFromVault &&
guild.VaultRegularCredits &&
guild.VaultMiscItems &&
deco.Type != "/Lotus/Objects/Tenno/Props/TnoPaintBotDojoDeco"
) {
if (guild.VaultRegularCredits >= scaleRequiredCount(guild.Tier, meta.price)) { if (guild.VaultRegularCredits >= scaleRequiredCount(guild.Tier, meta.price)) {
let enoughMiscItems = true; let enoughMiscItems = true;
for (const ingredient of meta.ingredients) { for (const ingredient of meta.ingredients) {

View File

@ -0,0 +1,34 @@
import { getJSONfromString } from "@/src/helpers/stringHelpers";
import { getDojoClient, getGuildForRequestEx, hasAccessToDojo, hasGuildPermission } from "@/src/services/guildService";
import { getInventory } from "@/src/services/inventoryService";
import { getAccountIdForRequest } from "@/src/services/loginService";
import { GuildPermission } from "@/src/types/guildTypes";
import { RequestHandler } from "express";
export const setDojoComponentColorsController: RequestHandler = async (req, res) => {
const accountId = await getAccountIdForRequest(req);
const inventory = await getInventory(accountId, "GuildId LevelKeys");
const guild = await getGuildForRequestEx(req, inventory);
if (!hasAccessToDojo(inventory) || !(await hasGuildPermission(guild, accountId, GuildPermission.Decorator))) {
res.json({ DojoRequestStatus: -1 });
return;
}
const data = getJSONfromString<ISetDojoComponentColorsRequest>(String(req.body));
const component = guild.DojoComponents.id(data.ComponentId)!;
//const deco = component.Decos!.find(x => x._id.equals(data.DecoId))!;
//deco.Pending = true;
//component.PaintBot = new Types.ObjectId(data.DecoId);
if ("lights" in req.query) {
component.PendingLights = data.Colours;
} else {
component.PendingColors = data.Colours;
}
await guild.save();
res.json(await getDojoClient(guild, 0, component._id));
};
interface ISetDojoComponentColorsRequest {
ComponentId: string;
DecoId: string;
Colours: number[];
}

View File

@ -29,7 +29,8 @@ const dojoDecoSchema = new Schema<IDojoDecoDatabase>({
MiscItems: { type: [typeCountSchema], default: undefined }, MiscItems: { type: [typeCountSchema], default: undefined },
CompletionTime: Date, CompletionTime: Date,
RushPlatinum: Number, RushPlatinum: Number,
PictureFrameInfo: pictureFrameInfoSchema PictureFrameInfo: pictureFrameInfoSchema,
Pending: Boolean
}); });
const dojoLeaderboardEntrySchema = new Schema<IDojoLeaderboardEntry>( const dojoLeaderboardEntrySchema = new Schema<IDojoLeaderboardEntry>(
@ -57,6 +58,11 @@ const dojoComponentSchema = new Schema<IDojoComponentDatabase>({
DestructionTime: Date, DestructionTime: Date,
Decos: [dojoDecoSchema], Decos: [dojoDecoSchema],
DecoCapacity: Number, DecoCapacity: Number,
PaintBot: Schema.Types.ObjectId,
PendingColors: { type: [Number], default: undefined },
Colors: { type: [Number], default: undefined },
PendingLights: { type: [Number], default: undefined },
Lights: { type: [Number], default: undefined },
Leaderboard: { type: [dojoLeaderboardEntrySchema], default: undefined } Leaderboard: { type: [dojoLeaderboardEntrySchema], default: undefined }
}); });

View File

@ -105,6 +105,7 @@ import { setActiveQuestController } from "@/src/controllers/api/setActiveQuestCo
import { setActiveShipController } from "@/src/controllers/api/setActiveShipController"; import { setActiveShipController } from "@/src/controllers/api/setActiveShipController";
import { setAllianceGuildPermissionsController } from "@/src/controllers/api/setAllianceGuildPermissionsController"; import { setAllianceGuildPermissionsController } from "@/src/controllers/api/setAllianceGuildPermissionsController";
import { setBootLocationController } from "@/src/controllers/api/setBootLocationController"; import { setBootLocationController } from "@/src/controllers/api/setBootLocationController";
import { setDojoComponentColorsController } from "@/src/controllers/api/setDojoComponentColorsController";
import { setDojoComponentMessageController } from "@/src/controllers/api/setDojoComponentMessageController"; import { setDojoComponentMessageController } from "@/src/controllers/api/setDojoComponentMessageController";
import { setEquippedInstrumentController } from "@/src/controllers/api/setEquippedInstrumentController"; import { setEquippedInstrumentController } from "@/src/controllers/api/setEquippedInstrumentController";
import { setGuildMotdController } from "@/src/controllers/api/setGuildMotdController"; import { setGuildMotdController } from "@/src/controllers/api/setGuildMotdController";
@ -261,6 +262,7 @@ apiRouter.post("/saveLoadout.php", saveLoadoutController);
apiRouter.post("/saveSettings.php", saveSettingsController); apiRouter.post("/saveSettings.php", saveSettingsController);
apiRouter.post("/saveVaultAutoContribute.php", saveVaultAutoContributeController); apiRouter.post("/saveVaultAutoContribute.php", saveVaultAutoContributeController);
apiRouter.post("/sell.php", sellController); apiRouter.post("/sell.php", sellController);
apiRouter.post("/setDojoComponentColors.php", setDojoComponentColorsController);
apiRouter.post("/setDojoComponentMessage.php", setDojoComponentMessageController); apiRouter.post("/setDojoComponentMessage.php", setDojoComponentMessageController);
apiRouter.post("/setEquippedInstrument.php", setEquippedInstrumentController); apiRouter.post("/setEquippedInstrument.php", setEquippedInstrumentController);
apiRouter.post("/setGuildMotd.php", setGuildMotdController); apiRouter.post("/setGuildMotd.php", setGuildMotdController);

View File

@ -141,6 +141,7 @@ export const getDojoClient = async (
DojoComponents: [] DojoComponents: []
}; };
const roomsToRemove: Types.ObjectId[] = []; const roomsToRemove: Types.ObjectId[] = [];
const decosToRemoveNoRefund: { componentId: Types.ObjectId; decoId: Types.ObjectId }[] = [];
let needSave = false; let needSave = false;
for (const dojoComponent of guild.DojoComponents) { for (const dojoComponent of guild.DojoComponents) {
if (!componentId || dojoComponent._id.equals(componentId)) { if (!componentId || dojoComponent._id.equals(componentId)) {
@ -212,6 +213,21 @@ export const getDojoClient = async (
PictureFrameInfo: deco.PictureFrameInfo PictureFrameInfo: deco.PictureFrameInfo
}; };
if (deco.CompletionTime) { if (deco.CompletionTime) {
if (
deco.Type == "/Lotus/Objects/Tenno/Props/TnoPaintBotDojoDeco" &&
Date.now() >= deco.CompletionTime.getTime()
) {
if (dojoComponent.PendingColors) {
dojoComponent.Colors = dojoComponent.PendingColors;
dojoComponent.PendingColors = undefined;
}
if (dojoComponent.PendingLights) {
dojoComponent.Lights = dojoComponent.PendingLights;
dojoComponent.PendingLights = undefined;
}
decosToRemoveNoRefund.push({ componentId: dojoComponent._id, decoId: deco._id });
continue;
}
clientDeco.CompletionTime = toMongoDate(deco.CompletionTime); clientDeco.CompletionTime = toMongoDate(deco.CompletionTime);
} else { } else {
clientDeco.RegularCredits = deco.RegularCredits; clientDeco.RegularCredits = deco.RegularCredits;
@ -220,6 +236,10 @@ export const getDojoClient = async (
clientComponent.Decos.push(clientDeco); clientComponent.Decos.push(clientDeco);
} }
} }
clientComponent.PendingColors = dojoComponent.PendingColors;
clientComponent.Colors = dojoComponent.Colors;
clientComponent.PendingLights = dojoComponent.PendingLights;
clientComponent.Lights = dojoComponent.Lights;
dojo.DojoComponents.push(clientComponent); dojo.DojoComponents.push(clientComponent);
} }
} }
@ -230,6 +250,15 @@ export const getDojoClient = async (
} }
needSave = true; needSave = true;
} }
for (const deco of decosToRemoveNoRefund) {
logger.debug(`removing polychrome`, deco);
const component = guild.DojoComponents.id(deco.componentId)!;
component.Decos!.splice(
component.Decos!.findIndex(x => x._id.equals(deco.decoId)),
1
);
needSave = true;
}
if (needSave) { if (needSave) {
await guild.save(); await guild.save();
} }

View File

@ -161,6 +161,7 @@ export interface IDojoClient {
export interface IDojoComponentClient { export interface IDojoComponentClient {
id: IOid; id: IOid;
SortId?: IOid;
pf: string; // Prefab (.level) pf: string; // Prefab (.level)
ppf: string; ppf: string;
pi?: IOid; // Parent ID. N/A to root. pi?: IOid; // Parent ID. N/A to root.
@ -175,16 +176,25 @@ export interface IDojoComponentClient {
DestructionTime?: IMongoDate; DestructionTime?: IMongoDate;
Decos?: IDojoDecoClient[]; Decos?: IDojoDecoClient[];
DecoCapacity?: number; DecoCapacity?: number;
PaintBot?: IOid;
PendingColors?: number[];
Colors?: number[];
PendingLights?: number[];
Lights?: number[];
} }
export interface IDojoComponentDatabase export interface IDojoComponentDatabase
extends Omit<IDojoComponentClient, "id" | "pi" | "CompletionTime" | "DestructionTime" | "Decos"> { extends Omit<
IDojoComponentClient,
"id" | "SortId" | "pi" | "CompletionTime" | "DestructionTime" | "Decos" | "PaintBot"
> {
_id: Types.ObjectId; _id: Types.ObjectId;
pi?: Types.ObjectId; pi?: Types.ObjectId;
CompletionTime?: Date; CompletionTime?: Date;
CompletionLogPending?: boolean; CompletionLogPending?: boolean;
DestructionTime?: Date; DestructionTime?: Date;
Decos?: IDojoDecoDatabase[]; Decos?: IDojoDecoDatabase[];
PaintBot?: Types.ObjectId;
Leaderboard?: IDojoLeaderboardEntry[]; Leaderboard?: IDojoLeaderboardEntry[];
} }
@ -200,6 +210,7 @@ export interface IDojoDecoClient {
CompletionTime?: IMongoDate; CompletionTime?: IMongoDate;
RushPlatinum?: number; RushPlatinum?: number;
PictureFrameInfo?: IPictureFrameInfo; PictureFrameInfo?: IPictureFrameInfo;
Pending?: boolean;
} }
export interface IDojoDecoDatabase extends Omit<IDojoDecoClient, "id" | "CompletionTime"> { export interface IDojoDecoDatabase extends Omit<IDojoDecoClient, "id" | "CompletionTime"> {