feat: polychrome #1495
@ -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) {
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										34
									
								
								src/controllers/api/setDojoComponentColorsController.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								src/controllers/api/setDojoComponentColorsController.ts
									
									
									
									
									
										Normal 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[];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -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 }
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -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);
 | 
				
			||||||
 | 
				
			|||||||
@ -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();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -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"> {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user