Compare commits
No commits in common. "0588d6e5c6995265cf1d7bf3d4ad10eebc0ad606" and "d4d887a5a40582a330abee9e2c4a29502cf22340" have entirely different histories.
0588d6e5c6
...
d4d887a5a4
8
package-lock.json
generated
8
package-lock.json
generated
@ -18,7 +18,7 @@
|
|||||||
"morgan": "^1.10.0",
|
"morgan": "^1.10.0",
|
||||||
"ncp": "^2.0.0",
|
"ncp": "^2.0.0",
|
||||||
"typescript": ">=5.5 <5.6.0",
|
"typescript": ">=5.5 <5.6.0",
|
||||||
"warframe-public-export-plus": "^0.5.50",
|
"warframe-public-export-plus": "^0.5.49",
|
||||||
"warframe-riven-info": "^0.1.2",
|
"warframe-riven-info": "^0.1.2",
|
||||||
"winston": "^3.17.0",
|
"winston": "^3.17.0",
|
||||||
"winston-daily-rotate-file": "^5.0.0"
|
"winston-daily-rotate-file": "^5.0.0"
|
||||||
@ -3789,9 +3789,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/warframe-public-export-plus": {
|
"node_modules/warframe-public-export-plus": {
|
||||||
"version": "0.5.50",
|
"version": "0.5.49",
|
||||||
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.50.tgz",
|
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.49.tgz",
|
||||||
"integrity": "sha512-KlhdY/Q5sRAIn/RhmdviKBoX3gk+Jtuen0cWnFB2zqK7eKYMDtd79bKOtTPtnK9zCNzh6gFug2wEeDVam3Bwlw=="
|
"integrity": "sha512-11HA8qEMhFfl12W2qIjjk7fhas+/5G2yXbrOEb8FRZby6tWka0CyUnB6tLT+PCqBEIoU+kwhz0g7CLh3Zmy7Pw=="
|
||||||
},
|
},
|
||||||
"node_modules/warframe-riven-info": {
|
"node_modules/warframe-riven-info": {
|
||||||
"version": "0.1.2",
|
"version": "0.1.2",
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
"morgan": "^1.10.0",
|
"morgan": "^1.10.0",
|
||||||
"ncp": "^2.0.0",
|
"ncp": "^2.0.0",
|
||||||
"typescript": ">=5.5 <5.6.0",
|
"typescript": ">=5.5 <5.6.0",
|
||||||
"warframe-public-export-plus": "^0.5.50",
|
"warframe-public-export-plus": "^0.5.49",
|
||||||
"warframe-riven-info": "^0.1.2",
|
"warframe-riven-info": "^0.1.2",
|
||||||
"winston": "^3.17.0",
|
"winston": "^3.17.0",
|
||||||
"winston-daily-rotate-file": "^5.0.0"
|
"winston-daily-rotate-file": "^5.0.0"
|
||||||
|
@ -1,10 +1,7 @@
|
|||||||
import { Alliance, GuildMember } from "@/src/models/guildModel";
|
import { Alliance, GuildMember } from "@/src/models/guildModel";
|
||||||
import {
|
import {
|
||||||
addGuildMemberMiscItemContribution,
|
addGuildMemberMiscItemContribution,
|
||||||
addGuildMemberShipDecoContribution,
|
|
||||||
addVaultFusionTreasures,
|
|
||||||
addVaultMiscItems,
|
addVaultMiscItems,
|
||||||
addVaultShipDecos,
|
|
||||||
getGuildForRequestEx
|
getGuildForRequestEx
|
||||||
} from "@/src/services/guildService";
|
} from "@/src/services/guildService";
|
||||||
import {
|
import {
|
||||||
@ -54,21 +51,26 @@ export const contributeToVaultController: RequestHandler = async (req, res) => {
|
|||||||
}
|
}
|
||||||
if (request.MiscItems.length) {
|
if (request.MiscItems.length) {
|
||||||
addVaultMiscItems(guild, request.MiscItems);
|
addVaultMiscItems(guild, request.MiscItems);
|
||||||
|
|
||||||
for (const item of request.MiscItems) {
|
for (const item of request.MiscItems) {
|
||||||
addGuildMemberMiscItemContribution(guildMember, item);
|
addGuildMemberMiscItemContribution(guildMember, item);
|
||||||
|
|
||||||
addMiscItems(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]);
|
addMiscItems(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (request.ShipDecorations.length) {
|
if (request.ShipDecorations.length) {
|
||||||
addVaultShipDecos(guild, request.ShipDecorations);
|
guild.VaultShipDecorations ??= [];
|
||||||
|
guildMember.ShipDecorationsContributed ??= [];
|
||||||
for (const item of request.ShipDecorations) {
|
for (const item of request.ShipDecorations) {
|
||||||
addGuildMemberShipDecoContribution(guildMember, item);
|
guild.VaultShipDecorations.push(item);
|
||||||
|
guildMember.ShipDecorationsContributed.push(item);
|
||||||
addShipDecorations(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]);
|
addShipDecorations(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (request.FusionTreasures.length) {
|
if (request.FusionTreasures.length) {
|
||||||
addVaultFusionTreasures(guild, request.FusionTreasures);
|
guild.VaultFusionTreasures ??= [];
|
||||||
for (const item of request.FusionTreasures) {
|
for (const item of request.FusionTreasures) {
|
||||||
|
guild.VaultFusionTreasures.push(item);
|
||||||
addFusionTreasures(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]);
|
addFusionTreasures(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ import { getAccountIdForRequest } from "@/src/services/loginService";
|
|||||||
import { GuildPermission } from "@/src/types/guildTypes";
|
import { GuildPermission } from "@/src/types/guildTypes";
|
||||||
import { RequestHandler } from "express";
|
import { RequestHandler } from "express";
|
||||||
import { Types } from "mongoose";
|
import { Types } from "mongoose";
|
||||||
import { ExportDojoRecipes, ExportResources } from "warframe-public-export-plus";
|
import { ExportDojoRecipes } from "warframe-public-export-plus";
|
||||||
|
|
||||||
export const placeDecoInComponentController: RequestHandler = async (req, res) => {
|
export const placeDecoInComponentController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
@ -24,37 +24,23 @@ export const placeDecoInComponentController: RequestHandler = async (req, res) =
|
|||||||
}
|
}
|
||||||
|
|
||||||
component.Decos ??= [];
|
component.Decos ??= [];
|
||||||
if (request.MoveId) {
|
const deco =
|
||||||
const deco = component.Decos.find(x => x._id.equals(request.MoveId))!;
|
component.Decos[
|
||||||
deco.Pos = request.Pos;
|
component.Decos.push({
|
||||||
deco.Rot = request.Rot;
|
_id: new Types.ObjectId(),
|
||||||
} else {
|
Type: request.Type,
|
||||||
const deco =
|
Pos: request.Pos,
|
||||||
component.Decos[
|
Rot: request.Rot,
|
||||||
component.Decos.push({
|
Name: request.Name
|
||||||
_id: new Types.ObjectId(),
|
}) - 1
|
||||||
Type: request.Type,
|
];
|
||||||
Pos: request.Pos,
|
|
||||||
Rot: request.Rot,
|
const meta = Object.values(ExportDojoRecipes.decos).find(x => x.resultType == request.Type);
|
||||||
Name: request.Name,
|
if (meta) {
|
||||||
Sockets: request.Sockets
|
if (meta.capacityCost) {
|
||||||
}) - 1
|
component.DecoCapacity -= meta.capacityCost;
|
||||||
];
|
|
||||||
const meta = Object.values(ExportDojoRecipes.decos).find(x => x.resultType == request.Type);
|
|
||||||
if (meta) {
|
|
||||||
if (meta.capacityCost) {
|
|
||||||
component.DecoCapacity -= meta.capacityCost;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
const itemType = Object.entries(ExportResources).find(arr => arr[1].deco == deco.Type)![0];
|
|
||||||
if (deco.Sockets !== undefined) {
|
|
||||||
guild.VaultFusionTreasures!.find(x => x.ItemType == itemType && x.Sockets == deco.Sockets)!.ItemCount -=
|
|
||||||
1;
|
|
||||||
} else {
|
|
||||||
guild.VaultShipDecorations!.find(x => x.ItemType == itemType)!.ItemCount -= 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (!meta || (meta.price == 0 && meta.ingredients.length == 0)) {
|
if (meta.price == 0 && meta.ingredients.length == 0) {
|
||||||
deco.CompletionTime = new Date();
|
deco.CompletionTime = new Date();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -70,9 +56,4 @@ interface IPlaceDecoInComponentRequest {
|
|||||||
Pos: number[];
|
Pos: number[];
|
||||||
Rot: number[];
|
Rot: number[];
|
||||||
Name?: string;
|
Name?: string;
|
||||||
Sockets?: number;
|
|
||||||
Scale?: number; // only provided alongside MoveId and seems to always be 1
|
|
||||||
MoveId?: string;
|
|
||||||
ShipDeco?: boolean;
|
|
||||||
VaultDeco?: boolean;
|
|
||||||
}
|
}
|
||||||
|
@ -17,19 +17,16 @@ import {
|
|||||||
} from "@/src/types/guildTypes";
|
} from "@/src/types/guildTypes";
|
||||||
import { Document, Model, model, Schema, Types } from "mongoose";
|
import { Document, Model, model, Schema, Types } from "mongoose";
|
||||||
import { fusionTreasuresSchema, typeCountSchema } from "./inventoryModels/inventoryModel";
|
import { fusionTreasuresSchema, typeCountSchema } from "./inventoryModels/inventoryModel";
|
||||||
import { pictureFrameInfoSchema } from "./personalRoomsModel";
|
|
||||||
|
|
||||||
const dojoDecoSchema = new Schema<IDojoDecoDatabase>({
|
const dojoDecoSchema = new Schema<IDojoDecoDatabase>({
|
||||||
Type: String,
|
Type: String,
|
||||||
Pos: [Number],
|
Pos: [Number],
|
||||||
Rot: [Number],
|
Rot: [Number],
|
||||||
Name: String,
|
Name: String,
|
||||||
Sockets: Number,
|
|
||||||
RegularCredits: Number,
|
RegularCredits: Number,
|
||||||
MiscItems: { type: [typeCountSchema], default: undefined },
|
MiscItems: { type: [typeCountSchema], default: undefined },
|
||||||
CompletionTime: Date,
|
CompletionTime: Date,
|
||||||
RushPlatinum: Number,
|
RushPlatinum: Number
|
||||||
PictureFrameInfo: pictureFrameInfoSchema
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const dojoLeaderboardEntrySchema = new Schema<IDojoLeaderboardEntry>(
|
const dojoLeaderboardEntrySchema = new Schema<IDojoLeaderboardEntry>(
|
||||||
|
@ -12,7 +12,7 @@ import {
|
|||||||
} from "@/src/types/shipTypes";
|
} from "@/src/types/shipTypes";
|
||||||
import { Schema, model } from "mongoose";
|
import { Schema, model } from "mongoose";
|
||||||
|
|
||||||
export const pictureFrameInfoSchema = new Schema<IPictureFrameInfo>(
|
const pictureFrameInfoSchema = new Schema<IPictureFrameInfo>(
|
||||||
{
|
{
|
||||||
Image: String,
|
Image: String,
|
||||||
Filter: String,
|
Filter: String,
|
||||||
|
@ -21,13 +21,13 @@ import {
|
|||||||
} from "@/src/types/guildTypes";
|
} from "@/src/types/guildTypes";
|
||||||
import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
|
import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
|
||||||
import { Types } from "mongoose";
|
import { Types } from "mongoose";
|
||||||
import { ExportDojoRecipes, ExportResources, IDojoBuild, IDojoResearch } from "warframe-public-export-plus";
|
import { ExportDojoRecipes, IDojoBuild, IDojoResearch } 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";
|
import { getRandomInt } from "./rngService";
|
||||||
import { Inbox } from "../models/inboxModel";
|
import { Inbox } from "../models/inboxModel";
|
||||||
import { IFusionTreasure, ITypeCount } from "../types/inventoryTypes/inventoryTypes";
|
import { ITypeCount } from "../types/inventoryTypes/inventoryTypes";
|
||||||
import { IInventoryChanges } from "../types/purchaseTypes";
|
import { IInventoryChanges } from "../types/purchaseTypes";
|
||||||
|
|
||||||
export const getGuildForRequest = async (req: Request): Promise<TGuildDatabaseDocument> => {
|
export const getGuildForRequest = async (req: Request): Promise<TGuildDatabaseDocument> => {
|
||||||
@ -202,9 +202,7 @@ export const getDojoClient = async (
|
|||||||
Type: deco.Type,
|
Type: deco.Type,
|
||||||
Pos: deco.Pos,
|
Pos: deco.Pos,
|
||||||
Rot: deco.Rot,
|
Rot: deco.Rot,
|
||||||
Name: deco.Name,
|
Name: deco.Name
|
||||||
Sockets: deco.Sockets,
|
|
||||||
PictureFrameInfo: deco.PictureFrameInfo
|
|
||||||
};
|
};
|
||||||
if (deco.CompletionTime) {
|
if (deco.CompletionTime) {
|
||||||
clientDeco.CompletionTime = toMongoDate(deco.CompletionTime);
|
clientDeco.CompletionTime = toMongoDate(deco.CompletionTime);
|
||||||
@ -287,28 +285,8 @@ export const removeDojoDeco = (
|
|||||||
1
|
1
|
||||||
)[0];
|
)[0];
|
||||||
const meta = Object.values(ExportDojoRecipes.decos).find(x => x.resultType == deco.Type);
|
const meta = Object.values(ExportDojoRecipes.decos).find(x => x.resultType == deco.Type);
|
||||||
if (meta) {
|
if (meta && meta.capacityCost) {
|
||||||
if (meta.capacityCost) {
|
component.DecoCapacity! += meta.capacityCost;
|
||||||
component.DecoCapacity! += meta.capacityCost;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
const itemType = Object.entries(ExportResources).find(arr => arr[1].deco == deco.Type)![0];
|
|
||||||
if (deco.Sockets !== undefined) {
|
|
||||||
addVaultFusionTreasures(guild, [
|
|
||||||
{
|
|
||||||
ItemType: itemType,
|
|
||||||
ItemCount: 1,
|
|
||||||
Sockets: deco.Sockets
|
|
||||||
}
|
|
||||||
]);
|
|
||||||
} else {
|
|
||||||
addVaultShipDecos(guild, [
|
|
||||||
{
|
|
||||||
ItemType: itemType,
|
|
||||||
ItemCount: 1
|
|
||||||
}
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
moveResourcesToVault(guild, deco);
|
moveResourcesToVault(guild, deco);
|
||||||
};
|
};
|
||||||
@ -333,38 +311,12 @@ export const getVaultMiscItemCount = (guild: TGuildDatabaseDocument, itemType: s
|
|||||||
|
|
||||||
export const addVaultMiscItems = (guild: TGuildDatabaseDocument, miscItems: ITypeCount[]): void => {
|
export const addVaultMiscItems = (guild: TGuildDatabaseDocument, miscItems: ITypeCount[]): void => {
|
||||||
guild.VaultMiscItems ??= [];
|
guild.VaultMiscItems ??= [];
|
||||||
for (const item of miscItems) {
|
for (const miscItem of miscItems) {
|
||||||
const vaultItem = guild.VaultMiscItems.find(x => x.ItemType == item.ItemType);
|
const vaultMiscItem = guild.VaultMiscItems.find(x => x.ItemType == miscItem.ItemType);
|
||||||
if (vaultItem) {
|
if (vaultMiscItem) {
|
||||||
vaultItem.ItemCount += item.ItemCount;
|
vaultMiscItem.ItemCount += miscItem.ItemCount;
|
||||||
} else {
|
} else {
|
||||||
guild.VaultMiscItems.push(item);
|
guild.VaultMiscItems.push(miscItem);
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const addVaultShipDecos = (guild: TGuildDatabaseDocument, shipDecos: ITypeCount[]): void => {
|
|
||||||
guild.VaultShipDecorations ??= [];
|
|
||||||
for (const item of shipDecos) {
|
|
||||||
const vaultItem = guild.VaultShipDecorations.find(x => x.ItemType == item.ItemType);
|
|
||||||
if (vaultItem) {
|
|
||||||
vaultItem.ItemCount += item.ItemCount;
|
|
||||||
} else {
|
|
||||||
guild.VaultShipDecorations.push(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const addVaultFusionTreasures = (guild: TGuildDatabaseDocument, fusionTreasures: IFusionTreasure[]): void => {
|
|
||||||
guild.VaultFusionTreasures ??= [];
|
|
||||||
for (const item of fusionTreasures) {
|
|
||||||
const vaultItem = guild.VaultFusionTreasures.find(
|
|
||||||
x => x.ItemType == item.ItemType && x.Sockets == item.Sockets
|
|
||||||
);
|
|
||||||
if (vaultItem) {
|
|
||||||
vaultItem.ItemCount += item.ItemCount;
|
|
||||||
} else {
|
|
||||||
guild.VaultFusionTreasures.push(item);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -379,16 +331,6 @@ export const addGuildMemberMiscItemContribution = (guildMember: IGuildMemberData
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const addGuildMemberShipDecoContribution = (guildMember: IGuildMemberDatabase, item: ITypeCount): void => {
|
|
||||||
guildMember.ShipDecorationsContributed ??= [];
|
|
||||||
const shipDecoContribution = guildMember.ShipDecorationsContributed.find(x => x.ItemType == item.ItemType);
|
|
||||||
if (shipDecoContribution) {
|
|
||||||
shipDecoContribution.ItemCount += item.ItemCount;
|
|
||||||
} else {
|
|
||||||
guildMember.ShipDecorationsContributed.push(item);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const processDojoBuildMaterialsGathered = (guild: TGuildDatabaseDocument, build: IDojoBuild): void => {
|
export const processDojoBuildMaterialsGathered = (guild: TGuildDatabaseDocument, build: IDojoBuild): void => {
|
||||||
if (build.guildXpValue) {
|
if (build.guildXpValue) {
|
||||||
guild.ClaimedXP ??= [];
|
guild.ClaimedXP ??= [];
|
||||||
|
@ -10,9 +10,6 @@ import { logger } from "@/src/utils/logger";
|
|||||||
import { Types } from "mongoose";
|
import { Types } from "mongoose";
|
||||||
import { addShipDecorations, getInventory } from "./inventoryService";
|
import { addShipDecorations, getInventory } from "./inventoryService";
|
||||||
import { config } from "./configService";
|
import { config } from "./configService";
|
||||||
import { Guild } from "../models/guildModel";
|
|
||||||
import { hasGuildPermission } from "./guildService";
|
|
||||||
import { GuildPermission } from "../types/guildTypes";
|
|
||||||
|
|
||||||
export const setShipCustomizations = async (
|
export const setShipCustomizations = async (
|
||||||
accountId: string,
|
accountId: string,
|
||||||
@ -157,17 +154,6 @@ export const handleSetShipDecorations = async (
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const handleSetPlacedDecoInfo = async (accountId: string, req: ISetPlacedDecoInfoRequest): Promise<void> => {
|
export const handleSetPlacedDecoInfo = async (accountId: string, req: ISetPlacedDecoInfoRequest): Promise<void> => {
|
||||||
if (req.GuildId && req.ComponentId) {
|
|
||||||
const guild = (await Guild.findById(req.GuildId))!;
|
|
||||||
if (await hasGuildPermission(guild, accountId, GuildPermission.Decorator)) {
|
|
||||||
const component = guild.DojoComponents.id(req.ComponentId)!;
|
|
||||||
const deco = component.Decos!.find(x => x._id.equals(req.DecoId))!;
|
|
||||||
deco.PictureFrameInfo = req.PictureFrameInfo;
|
|
||||||
await guild.save();
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const personalRooms = await getPersonalRooms(accountId);
|
const personalRooms = await getPersonalRooms(accountId);
|
||||||
|
|
||||||
const room = personalRooms.Ship.Rooms.find(room => room.Name === req.Room);
|
const room = personalRooms.Ship.Rooms.find(room => room.Name === req.Room);
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import { Types } from "mongoose";
|
import { Types } from "mongoose";
|
||||||
import { IOid, IMongoDate } from "@/src/types/commonTypes";
|
import { IOid, IMongoDate } from "@/src/types/commonTypes";
|
||||||
import { IFusionTreasure, IMiscItem, ITypeCount } from "@/src/types/inventoryTypes/inventoryTypes";
|
import { IFusionTreasure, IMiscItem, ITypeCount } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||||
import { IPictureFrameInfo } from "./shipTypes";
|
|
||||||
|
|
||||||
export interface IGuildClient {
|
export interface IGuildClient {
|
||||||
_id: IOid;
|
_id: IOid;
|
||||||
@ -191,12 +190,10 @@ export interface IDojoDecoClient {
|
|||||||
Pos: number[];
|
Pos: number[];
|
||||||
Rot: number[];
|
Rot: number[];
|
||||||
Name?: string; // for teleporters
|
Name?: string; // for teleporters
|
||||||
Sockets?: number;
|
|
||||||
RegularCredits?: number;
|
RegularCredits?: number;
|
||||||
MiscItems?: IMiscItem[];
|
MiscItems?: IMiscItem[];
|
||||||
CompletionTime?: IMongoDate;
|
CompletionTime?: IMongoDate;
|
||||||
RushPlatinum?: number;
|
RushPlatinum?: number;
|
||||||
PictureFrameInfo?: IPictureFrameInfo;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IDojoDecoDatabase extends Omit<IDojoDecoClient, "id" | "CompletionTime"> {
|
export interface IDojoDecoDatabase extends Omit<IDojoDecoClient, "id" | "CompletionTime"> {
|
||||||
|
@ -127,9 +127,7 @@ export interface ISetPlacedDecoInfoRequest {
|
|||||||
DecoId: string;
|
DecoId: string;
|
||||||
Room: string;
|
Room: string;
|
||||||
PictureFrameInfo: IPictureFrameInfo;
|
PictureFrameInfo: IPictureFrameInfo;
|
||||||
BootLocation?: string;
|
BootLocation: string;
|
||||||
ComponentId?: string;
|
|
||||||
GuildId?: string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IPictureFrameInfo {
|
export interface IPictureFrameInfo {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user