feat: polychrome (#1495)
Reviewed-on: OpenWF/SpaceNinjaServer#1495 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									7fd4d50e07
								
							
						
					
					
						commit
						74c7d86090
					
				@ -64,7 +64,12 @@ export const placeDecoInComponentController: RequestHandler = async (req, res) =
 | 
			
		||||
        }
 | 
			
		||||
        if (!meta || (meta.price == 0 && meta.ingredients.length == 0)) {
 | 
			
		||||
            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)) {
 | 
			
		||||
                let enoughMiscItems = true;
 | 
			
		||||
                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 },
 | 
			
		||||
    CompletionTime: Date,
 | 
			
		||||
    RushPlatinum: Number,
 | 
			
		||||
    PictureFrameInfo: pictureFrameInfoSchema
 | 
			
		||||
    PictureFrameInfo: pictureFrameInfoSchema,
 | 
			
		||||
    Pending: Boolean
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const dojoLeaderboardEntrySchema = new Schema<IDojoLeaderboardEntry>(
 | 
			
		||||
@ -57,6 +58,11 @@ const dojoComponentSchema = new Schema<IDojoComponentDatabase>({
 | 
			
		||||
    DestructionTime: Date,
 | 
			
		||||
    Decos: [dojoDecoSchema],
 | 
			
		||||
    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 }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -105,6 +105,7 @@ import { setActiveQuestController } from "@/src/controllers/api/setActiveQuestCo
 | 
			
		||||
import { setActiveShipController } from "@/src/controllers/api/setActiveShipController";
 | 
			
		||||
import { setAllianceGuildPermissionsController } from "@/src/controllers/api/setAllianceGuildPermissionsController";
 | 
			
		||||
import { setBootLocationController } from "@/src/controllers/api/setBootLocationController";
 | 
			
		||||
import { setDojoComponentColorsController } from "@/src/controllers/api/setDojoComponentColorsController";
 | 
			
		||||
import { setDojoComponentMessageController } from "@/src/controllers/api/setDojoComponentMessageController";
 | 
			
		||||
import { setEquippedInstrumentController } from "@/src/controllers/api/setEquippedInstrumentController";
 | 
			
		||||
import { setGuildMotdController } from "@/src/controllers/api/setGuildMotdController";
 | 
			
		||||
@ -261,6 +262,7 @@ apiRouter.post("/saveLoadout.php", saveLoadoutController);
 | 
			
		||||
apiRouter.post("/saveSettings.php", saveSettingsController);
 | 
			
		||||
apiRouter.post("/saveVaultAutoContribute.php", saveVaultAutoContributeController);
 | 
			
		||||
apiRouter.post("/sell.php", sellController);
 | 
			
		||||
apiRouter.post("/setDojoComponentColors.php", setDojoComponentColorsController);
 | 
			
		||||
apiRouter.post("/setDojoComponentMessage.php", setDojoComponentMessageController);
 | 
			
		||||
apiRouter.post("/setEquippedInstrument.php", setEquippedInstrumentController);
 | 
			
		||||
apiRouter.post("/setGuildMotd.php", setGuildMotdController);
 | 
			
		||||
 | 
			
		||||
@ -141,6 +141,7 @@ export const getDojoClient = async (
 | 
			
		||||
        DojoComponents: []
 | 
			
		||||
    };
 | 
			
		||||
    const roomsToRemove: Types.ObjectId[] = [];
 | 
			
		||||
    const decosToRemoveNoRefund: { componentId: Types.ObjectId; decoId: Types.ObjectId }[] = [];
 | 
			
		||||
    let needSave = false;
 | 
			
		||||
    for (const dojoComponent of guild.DojoComponents) {
 | 
			
		||||
        if (!componentId || dojoComponent._id.equals(componentId)) {
 | 
			
		||||
@ -212,6 +213,21 @@ export const getDojoClient = async (
 | 
			
		||||
                        PictureFrameInfo: deco.PictureFrameInfo
 | 
			
		||||
                    };
 | 
			
		||||
                    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);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        clientDeco.RegularCredits = deco.RegularCredits;
 | 
			
		||||
@ -220,6 +236,10 @@ export const getDojoClient = async (
 | 
			
		||||
                    clientComponent.Decos.push(clientDeco);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            clientComponent.PendingColors = dojoComponent.PendingColors;
 | 
			
		||||
            clientComponent.Colors = dojoComponent.Colors;
 | 
			
		||||
            clientComponent.PendingLights = dojoComponent.PendingLights;
 | 
			
		||||
            clientComponent.Lights = dojoComponent.Lights;
 | 
			
		||||
            dojo.DojoComponents.push(clientComponent);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@ -230,6 +250,15 @@ export const getDojoClient = async (
 | 
			
		||||
        }
 | 
			
		||||
        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) {
 | 
			
		||||
        await guild.save();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -161,6 +161,7 @@ export interface IDojoClient {
 | 
			
		||||
 | 
			
		||||
export interface IDojoComponentClient {
 | 
			
		||||
    id: IOid;
 | 
			
		||||
    SortId?: IOid;
 | 
			
		||||
    pf: string; // Prefab (.level)
 | 
			
		||||
    ppf: string;
 | 
			
		||||
    pi?: IOid; // Parent ID. N/A to root.
 | 
			
		||||
@ -175,16 +176,25 @@ export interface IDojoComponentClient {
 | 
			
		||||
    DestructionTime?: IMongoDate;
 | 
			
		||||
    Decos?: IDojoDecoClient[];
 | 
			
		||||
    DecoCapacity?: number;
 | 
			
		||||
    PaintBot?: IOid;
 | 
			
		||||
    PendingColors?: number[];
 | 
			
		||||
    Colors?: number[];
 | 
			
		||||
    PendingLights?: number[];
 | 
			
		||||
    Lights?: number[];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface IDojoComponentDatabase
 | 
			
		||||
    extends Omit<IDojoComponentClient, "id" | "pi" | "CompletionTime" | "DestructionTime" | "Decos"> {
 | 
			
		||||
    extends Omit<
 | 
			
		||||
        IDojoComponentClient,
 | 
			
		||||
        "id" | "SortId" | "pi" | "CompletionTime" | "DestructionTime" | "Decos" | "PaintBot"
 | 
			
		||||
    > {
 | 
			
		||||
    _id: Types.ObjectId;
 | 
			
		||||
    pi?: Types.ObjectId;
 | 
			
		||||
    CompletionTime?: Date;
 | 
			
		||||
    CompletionLogPending?: boolean;
 | 
			
		||||
    DestructionTime?: Date;
 | 
			
		||||
    Decos?: IDojoDecoDatabase[];
 | 
			
		||||
    PaintBot?: Types.ObjectId;
 | 
			
		||||
    Leaderboard?: IDojoLeaderboardEntry[];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -200,6 +210,7 @@ export interface IDojoDecoClient {
 | 
			
		||||
    CompletionTime?: IMongoDate;
 | 
			
		||||
    RushPlatinum?: number;
 | 
			
		||||
    PictureFrameInfo?: IPictureFrameInfo;
 | 
			
		||||
    Pending?: boolean;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface IDojoDecoDatabase extends Omit<IDojoDecoClient, "id" | "CompletionTime"> {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user