forked from OpenWF/SpaceNinjaServer
Using SortId instead of actually changing the component ids. What's strange is that providing/omitting SortId does seem to make a difference in regards to deco positioning, which is presumably what the POST body would be for. I've opted to simply always provide the SortId in hopes that this avoids the need for repositioning entirely. Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
295 lines
8.8 KiB
TypeScript
295 lines
8.8 KiB
TypeScript
import {
|
|
IGuildDatabase,
|
|
IDojoComponentDatabase,
|
|
ITechProjectDatabase,
|
|
IDojoDecoDatabase,
|
|
ILongMOTD,
|
|
IGuildMemberDatabase,
|
|
IGuildLogEntryNumber,
|
|
IGuildRank,
|
|
IGuildLogRoomChange,
|
|
IGuildLogEntryRoster,
|
|
IGuildLogEntryContributable,
|
|
IDojoLeaderboardEntry,
|
|
IGuildAdDatabase,
|
|
IAllianceDatabase,
|
|
IAllianceMemberDatabase
|
|
} from "@/src/types/guildTypes";
|
|
import { Document, Model, model, Schema, Types } from "mongoose";
|
|
import { fusionTreasuresSchema, typeCountSchema } from "./inventoryModels/inventoryModel";
|
|
import { pictureFrameInfoSchema } from "./personalRoomsModel";
|
|
|
|
const dojoDecoSchema = new Schema<IDojoDecoDatabase>({
|
|
Type: String,
|
|
Pos: [Number],
|
|
Rot: [Number],
|
|
Name: String,
|
|
Sockets: Number,
|
|
RegularCredits: Number,
|
|
MiscItems: { type: [typeCountSchema], default: undefined },
|
|
CompletionTime: Date,
|
|
RushPlatinum: Number,
|
|
PictureFrameInfo: pictureFrameInfoSchema,
|
|
Pending: Boolean
|
|
});
|
|
|
|
const dojoLeaderboardEntrySchema = new Schema<IDojoLeaderboardEntry>(
|
|
{
|
|
s: Number,
|
|
r: Number,
|
|
n: String
|
|
},
|
|
{ _id: false }
|
|
);
|
|
|
|
const dojoComponentSchema = new Schema<IDojoComponentDatabase>({
|
|
SortId: Schema.Types.ObjectId,
|
|
pf: { type: String, required: true },
|
|
ppf: String,
|
|
pi: Schema.Types.ObjectId,
|
|
op: String,
|
|
pp: String,
|
|
Name: String,
|
|
Message: String,
|
|
RegularCredits: Number,
|
|
MiscItems: { type: [typeCountSchema], default: undefined },
|
|
CompletionTime: Date,
|
|
CompletionLogPending: Boolean,
|
|
RushPlatinum: Number,
|
|
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 },
|
|
Settings: String,
|
|
Leaderboard: { type: [dojoLeaderboardEntrySchema], default: undefined }
|
|
});
|
|
|
|
const techProjectSchema = new Schema<ITechProjectDatabase>(
|
|
{
|
|
ItemType: String,
|
|
ReqCredits: Number,
|
|
ReqItems: [typeCountSchema],
|
|
State: Number,
|
|
CompletionDate: Date
|
|
},
|
|
{ _id: false }
|
|
);
|
|
|
|
const longMOTDSchema = new Schema<ILongMOTD>(
|
|
{
|
|
message: String,
|
|
authorName: String,
|
|
authorGuildName: String
|
|
},
|
|
{ _id: false }
|
|
);
|
|
|
|
const guildRankSchema = new Schema<IGuildRank>(
|
|
{
|
|
Name: String,
|
|
Permissions: Number
|
|
},
|
|
{ _id: false }
|
|
);
|
|
|
|
const defaultRanks: IGuildRank[] = [
|
|
{
|
|
Name: "/Lotus/Language/Game/Rank_Creator",
|
|
Permissions: 16351
|
|
},
|
|
{
|
|
Name: "/Lotus/Language/Game/Rank_Warlord",
|
|
Permissions: 16351
|
|
},
|
|
{
|
|
Name: "/Lotus/Language/Game/Rank_General",
|
|
Permissions: 4318
|
|
},
|
|
{
|
|
Name: "/Lotus/Language/Game/Rank_Officer",
|
|
Permissions: 4314
|
|
},
|
|
{
|
|
Name: "/Lotus/Language/Game/Rank_Leader",
|
|
Permissions: 4106
|
|
},
|
|
{
|
|
Name: "/Lotus/Language/Game/Rank_Sage",
|
|
Permissions: 4304
|
|
},
|
|
{
|
|
Name: "/Lotus/Language/Game/Rank_Soldier",
|
|
Permissions: 4098
|
|
},
|
|
{
|
|
Name: "/Lotus/Language/Game/Rank_Initiate",
|
|
Permissions: 4096
|
|
},
|
|
{
|
|
Name: "/Lotus/Language/Game/Rank_Utility",
|
|
Permissions: 4096
|
|
}
|
|
];
|
|
|
|
const guildLogRoomChangeSchema = new Schema<IGuildLogRoomChange>(
|
|
{
|
|
dateTime: Date,
|
|
entryType: Number,
|
|
details: String,
|
|
componentId: Types.ObjectId
|
|
},
|
|
{ _id: false }
|
|
);
|
|
|
|
const guildLogEntryContributableSchema = new Schema<IGuildLogEntryContributable>(
|
|
{
|
|
dateTime: Date,
|
|
entryType: Number,
|
|
details: String
|
|
},
|
|
{ _id: false }
|
|
);
|
|
|
|
const guildLogEntryRosterSchema = new Schema<IGuildLogEntryRoster>(
|
|
{
|
|
dateTime: Date,
|
|
entryType: Number,
|
|
details: String
|
|
},
|
|
{ _id: false }
|
|
);
|
|
|
|
const guildLogEntryNumberSchema = new Schema<IGuildLogEntryNumber>(
|
|
{
|
|
dateTime: Date,
|
|
entryType: Number,
|
|
details: Number
|
|
},
|
|
{ _id: false }
|
|
);
|
|
|
|
const guildSchema = new Schema<IGuildDatabase>(
|
|
{
|
|
Name: { type: String, required: true, unique: true },
|
|
MOTD: { type: String, default: "" },
|
|
LongMOTD: { type: longMOTDSchema, default: undefined },
|
|
Ranks: { type: [guildRankSchema], default: defaultRanks },
|
|
TradeTax: { type: Number, default: 0 },
|
|
Tier: { type: Number, default: 1 },
|
|
Emblem: { type: Boolean },
|
|
AutoContributeFromVault: { type: Boolean },
|
|
AllianceId: { type: Types.ObjectId },
|
|
DojoComponents: { type: [dojoComponentSchema], default: [] },
|
|
DojoCapacity: { type: Number, default: 100 },
|
|
DojoEnergy: { type: Number, default: 5 },
|
|
VaultRegularCredits: Number,
|
|
VaultPremiumCredits: Number,
|
|
VaultMiscItems: { type: [typeCountSchema], default: undefined },
|
|
VaultShipDecorations: { type: [typeCountSchema], default: undefined },
|
|
VaultFusionTreasures: { type: [fusionTreasuresSchema], default: undefined },
|
|
TechProjects: { type: [techProjectSchema], default: undefined },
|
|
ActiveDojoColorResearch: { type: String, default: "" },
|
|
Class: { type: Number, default: 0 },
|
|
XP: { type: Number, default: 0 },
|
|
ClaimedXP: { type: [String], default: undefined },
|
|
CeremonyClass: Number,
|
|
CeremonyContributors: { type: [Types.ObjectId], default: undefined },
|
|
CeremonyResetDate: Date,
|
|
CeremonyEndo: Number,
|
|
RoomChanges: { type: [guildLogRoomChangeSchema], default: undefined },
|
|
TechChanges: { type: [guildLogEntryContributableSchema], default: undefined },
|
|
RosterActivity: { type: [guildLogEntryRosterSchema], default: undefined },
|
|
ClassChanges: { type: [guildLogEntryNumberSchema], default: undefined }
|
|
},
|
|
{ id: false }
|
|
);
|
|
|
|
type GuildDocumentProps = {
|
|
DojoComponents: Types.DocumentArray<IDojoComponentDatabase>;
|
|
};
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
type GuildModel = Model<IGuildDatabase, {}, GuildDocumentProps>;
|
|
|
|
export const Guild = model<IGuildDatabase, GuildModel>("Guild", guildSchema);
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
export type TGuildDatabaseDocument = Document<unknown, {}, IGuildDatabase> &
|
|
Omit<
|
|
IGuildDatabase & {
|
|
_id: Types.ObjectId;
|
|
} & {
|
|
__v: number;
|
|
},
|
|
keyof GuildDocumentProps
|
|
> &
|
|
GuildDocumentProps;
|
|
|
|
const guildMemberSchema = new Schema<IGuildMemberDatabase>({
|
|
accountId: Types.ObjectId,
|
|
guildId: Types.ObjectId,
|
|
status: { type: Number, required: true },
|
|
rank: { type: Number, default: 7 },
|
|
RequestMsg: String,
|
|
RequestExpiry: Date,
|
|
RegularCreditsContributed: Number,
|
|
PremiumCreditsContributed: Number,
|
|
MiscItemsContributed: { type: [typeCountSchema], default: undefined },
|
|
ShipDecorationsContributed: { type: [typeCountSchema], default: undefined }
|
|
});
|
|
|
|
guildMemberSchema.index({ accountId: 1, guildId: 1 }, { unique: true });
|
|
guildMemberSchema.index({ RequestExpiry: 1 }, { expireAfterSeconds: 0 });
|
|
|
|
export const GuildMember = model<IGuildMemberDatabase>("GuildMember", guildMemberSchema);
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
export type TGuildMemberDatabaseDocument = Document<unknown, {}, IGuildMemberDatabase> &
|
|
IGuildMemberDatabase & {
|
|
_id: Types.ObjectId;
|
|
__v: number;
|
|
};
|
|
|
|
const guildAdSchema = new Schema<IGuildAdDatabase>({
|
|
GuildId: { type: Schema.Types.ObjectId, required: true },
|
|
Emblem: Boolean,
|
|
Expiry: { type: Date, required: true },
|
|
Features: { type: Number, required: true },
|
|
GuildName: { type: String, required: true },
|
|
MemberCount: { type: Number, required: true },
|
|
RecruitMsg: { type: String, required: true },
|
|
Tier: { type: Number, required: true }
|
|
});
|
|
|
|
guildAdSchema.index({ GuildId: 1 }, { unique: true });
|
|
guildAdSchema.index({ Expiry: 1 }, { expireAfterSeconds: 0 });
|
|
|
|
export const GuildAd = model<IGuildAdDatabase>("GuildAd", guildAdSchema);
|
|
|
|
const allianceSchema = new Schema<IAllianceDatabase>({
|
|
Name: String,
|
|
MOTD: longMOTDSchema,
|
|
LongMOTD: longMOTDSchema,
|
|
Emblem: Boolean,
|
|
VaultRegularCredits: Number
|
|
});
|
|
|
|
allianceSchema.index({ Name: 1 }, { unique: true });
|
|
|
|
export const Alliance = model<IAllianceDatabase>("Alliance", allianceSchema);
|
|
|
|
const allianceMemberSchema = new Schema<IAllianceMemberDatabase>({
|
|
allianceId: { type: Schema.Types.ObjectId, required: true },
|
|
guildId: { type: Schema.Types.ObjectId, required: true },
|
|
Pending: { type: Boolean, required: true },
|
|
Permissions: { type: Number, required: true }
|
|
});
|
|
|
|
allianceMemberSchema.index({ allianceId: 1, guildId: 1 }, { unique: true });
|
|
|
|
export const AllianceMember = model<IAllianceMemberDatabase>("AllianceMember", allianceMemberSchema);
|