var mongoose = require('mongoose'); mongoose.model('Host', new mongoose.Schema({ hostname: String, ip: String, region: String, provider: String, memory: String, status: String, ipGateway: String, memFree: Number, cpuUsage: Number, diskFree: Number, lastSeen: { type: Number, default: Date.now }, lostInUse: { type: [Number], default: [] }, statsHistory: [{ timestamp: Number, memFree: Number, cpuUsage: Number, diskFree: Number }] })); // Update for each new game mongoose.model('User', new mongoose.Schema({ email: String, discordID: {type: String, default: ""}, customerId: String, usedPaypal: {type: Boolean, default: false}, passwordHash: String, resetPasswordToken: String, resetPasswordExpires: Date, sessionToken: {type: String, default: null}, indifferentBroccoli: {type: Boolean, default: false}, paymentLink: {type: String, default: null}, palpocalypseEligible: {type: Boolean, default: false}, palpocalypseClaimed: {type: Boolean, default: false}, //Admin machineStats: [{ name: String, memoryFree: Number, cpuUsagePercentage: Number, diskFree: Number }], //Subusers subUserServers: [{ linuxUsername: String, permissions: { type: Object, default: {} } }], subusers: [{ email: String, inviteToken: String, inviteExpires: Date, }], // Activity log activities: [{ serverId: mongoose.Schema.Types.ObjectId, action: String, timestamp: { type: Number, default: Date.now } }], serverOrder: [String], servers: [{ // Public server page info tags: String, thumbnailImageLink: String, links: [String], // Server settings status: {type: String, default: "Setting Up"}, isTrial: {type: Boolean, default: false}, trialExpiry: {type: Date, default: null}, sentExpiryNotification: {type: Boolean, default: false}, sentTrialEndedNotification: {type: Boolean, default: false}, sentWelcomeFeedbackRequest: {type: Boolean, default: false}, sentUpcomingCancellationNotice : {type: Boolean, default: false}, linuxUsername: String, linuxPassword: String, //todo: store hash telnetPassword: String, controlPanelPassword: String, subscriptionId: {type:String,default:null}, subscriptionId_PayPal: {type:String,default:null}, subscriptionId_PayPalFrozen: {type:String,default:null}, subscriptionActive: {type: Boolean, default: false}, subscriptionStatus: {type: String, default: null}, subscriptionScheduledFreeze: {type: String, default: null}, subscriptionScheduledFreezeJobId: {type: String, default: null}, subscriptionScheduledCancel: {type: String, default: null}, subscriptionScheduledCancelJobId: {type: String, default: null}, ip: String, ipGateway: {type: String, default: null}, serverPort: {type: Number, default: null}, serverPortGateway: {type: Number, default: null}, region: {type: String, default: "na-east"}, game: String, discordAdmins: {type: [String], default: []}, // Generic game settings serverName: String, serverPassword: String, //todo: store hash? gameWorld: String, // pre-Alpha 17 serverDescription: String, serverMaxPlayerCount: Number, worldName: String, // StarRupture settings sessionName: {type: String, default: "IndifferentWorld"}, saveGameInterval: {type: Number, default: 300}, saveGameName: {type: String, default: "AutoSave0.sav"}, loadSavedGame: {type: Boolean, default: true}, scheduledRestarts: { type: [{ command: {type: String, default: "restart"}, rconCommand: String, minute: Number, hour: Number, day: Number, intervalValue: Number, intervalUnit: String, intervalMinute: Number }], default: [] }, admins: [{ steamId: String, permissionLevel: Number }], backups: [{ timestamp: Number }], ActiveMods: [{ modId: String }], playersOnline: [{ name: String, raw: { score: Number, time: Number } }], //-----7 Day to Die-----// serverIsPublic: String, // pre-Alpha 17 adminPassword: String, //todo: store hash?, serverWebsiteUrl: String, gameName: String, gameDifficulty: Number, gameMode: String, // don't make the GameModeSurvival or else anyone can place blocks anywhere zombiesRun: Number, buildCreate: String, dayNightLength: Number, dayLightLength: Number, playerKillingMode: Number, persistentPlayerProfiles: String, playerSafeZoneLevel: Number, playerSafeZoneHours: Number, deathPenalty: Number, dropOnDeath: Number, dropOnQuit: Number, bloodMoonEnemyCount: Number, enemySpawnMode: String, enemyDifficulty: Number, blockDurabilityModifier: Number, lootAbundance: Number, lootRespawnDays: Number, landClaimSize: Number, landClaimDeadZone: Number, landClaimExpiryTime: Number, landClaimDecayMode: Number, landClaimOnlineDurabilityModifier: Number, landClaimOfflineDurabilityModifier: Number, airDropFrequency: Number, airDropMarker: String, maxSpawnedZombies: Number, maxSpawnedAnimals: Number, eacEnabled: String, maxUncoveredMapChunksPerPlayer: Number, bedrollDeadZoneSize: Number, questProgressionDailyLimit: Number, maxChunkAge: Number, serverAllowCrossplay: {type: String, default: "false"}, biomeProgression: {type: String, default: "true"}, stormFreq: {type: Number, default: 100}, allowSpawnNearFriend: {type: Number, default: 2}, ignoreEOSSanctions: {type: String, default: "false"}, playerCount: Number, jarRefund: {type: Number, default: 0}, // Alpha >= 17 only version: Number, serverVisibility: Number, serverReservedSlots: Number, serverReservedSlotsPermission: Number, serverDisabledNetworkProtocols: String, worldGenSeed: String, worldGenSize: Number, //todo: figure out max telnetFailedLoginLimit: Number, // todo: figure out max or don't use telnetFailedLoginsBlocktime: Number, // todo: figure out max or don't use terminalWindowEnabled: Boolean, //pre Alpha 17.2 default was false partySharedKillRange: Number, hideCommandExecutionLog: Number, serverLoginConfirmationText: String, zombieFeralSense: Number, zombieMove: Number, zombieMoveNight: Number, zombieFeralMove: Number, zombieBMMove: Number, // Alpha >= 17.2 only bloodMoonFrequency: Number, bloodMoonRange: Number, bloodMoonWarning: Number, xpMultiplier: Number, blockDamagePlayer: Number, blockDamageAI: Number, blockDamageAIBM: Number, landClaimCount: Number, // Alpha >= 18 only serverMaxAllowedViewDistance: Number, serverMaxWorldTransferSpeedKiBs: Number, bedrollExpiryTime: Number, sevenDaysRegion: String, language: String, //-----Abiotic Factor-----// //-----ARK-----// BETA: {type: String, default: "public"}, AdminLogging: Boolean, AllowCaveBuildingPvE: Boolean, AllowFlyerCarryPvE: Boolean, AllowHideDamageSourceFromLogs: Boolean, AllowSharedConnections: Boolean, AllowTekSuitPowersInGenesis: Boolean, allowThirdPersonPlayer: Boolean, alwaysNotifyPlayerJoined: Boolean, alwaysNotifyPlayerLeft: Boolean, AutoSavePeriodMinutes: Number, bAllowPlatformSaddleMultiFloors: Boolean, BanListURL: String, bForceCanRideFliers: Boolean, ClampResourceHarvestDamage: Boolean, Cluster: [{ serverName: String, gameWorld: String, clusterId: String, serverId: String, serverPort: Number, serverMaxPlayerCount: Number }], CrossARKAllowForeignDinoDownloads: Boolean, Crossplay: {type: Boolean, default: false}, NoBattlEye: {type: Boolean, default: false}, ForceAllowCaveFlyers: {type: Boolean, default: false}, ShowFloatingDamageText: {type: Boolean, default: false}, CryopodNerfDamageMult: Number, CryopodNerfDuration: Number, CryopodNerfIncomingDamageMultPercent: Number, CustomDynamicConfigUrl: String, DayCycleSpeedScale: Number, DayTimeSpeedScale: Number, DifficultyOffset: Number, DinoCharacterFoodDrainMultiplier: Number, DinoCharacterHealthRecoveryMultiplier: Number, DinoCharacterStaminaDrainMultiplier: Number, DinoCountMultiplier: Number, DinoDamageMultiplier: Number, DinoResistanceMultiplier: Number, DisableDinoDecayPvE: Boolean, DisablePvEGamma: Boolean, DisableStructureDecayPvE: Boolean, DisableWeatherFog: Boolean, EnableCryopodNerf: Boolean, EnableCryoSicknessPVE: Boolean, EnablePvPGamma: Boolean, GameIniSettings: [{ text: String }], globalVoiceChat: Boolean, HarvestAmountMultiplier: Number, HarvestHealthMultiplier: Number, ItemStackSizeMultiplier: Number, MaxGateFrameOnSaddles: Number, MaxPlatformSaddleStructureLimit: Number, MaxPlayers: Number, MaxStructuresInRange: Number, MaxTamedDinos: Number, MaxTributeDinos: Number, MaxTributeItems: Number, NightTimeSpeedScale: Number, noTributeDownloads: Boolean, PerPlatformMaxStructuresMultiplier: Number, PlatformSaddleBuildAreaBoundsMultiplier: Number, PlayerCharacterFoodDrainMultiplier: Number, PlayerCharacterHealthRecoveryMultiplier: Number, PlayerCharacterStaminaDrainMultiplier: Number, PlayerCharacterWaterDrainMultiplier: Number, PlayerDamageMultiplier: Number, PlayerResistanceMultiplier: Number, proximityChat: Boolean, PvEDinoDecayPeriodMultiplier: Number, PvEStructureDecayDestructionPeriod: Number, PvEStructureDecayPeriodMultiplier: Number, PvPStructureDecay: Boolean, RandomSupplyCratePoints: Boolean, ResourcesRespawnPeriodMultiplier: Number, ServerAdminPassword: String, serverForceNoHud: Boolean, serverHardcore: Boolean, serverPVE: Boolean, ShowMapPlayerLocation: Boolean, SpectatorPassword: String, StructureDamageMultiplier: Number, StructureResistanceMultiplier: Number, TamingSpeedMultiplier: Number, TheMaxStructuresInRange: Number, TribeNameChangeCooldown: Number, TributeCharacterExpirationSeconds: Number, TributeDinoExpirationSeconds: Number, TributeItemExpirationSeconds: Number, XPMultiplier: Number, gameIni: String, //-----Conan Exiles-----// modList: String, //-----Core Keeper-----// gameID: String, worldSeed: {type: Number, default: 0}, worldIndex: {type: Number, default: 0}, worldMode: {type: Number, default: 0}, season: {type: Number, default: -1}, corekeeperMods: {type: String, default: ""}, //-----Counter Strike 2 (CS2)-----// //-----DayZ-----// enableWhitelist: { type: Boolean, default: false }, disable3rdPerson: { type: Boolean, default: false }, disableCrosshair: { type: Boolean, default: false }, disablePersonalLight: { type: Boolean, default: false }, disableVoicechat: { type: Boolean, default: false }, modList: {type: String, default: ""}, //-----ECO-----// //-----Enshrouded-----// //-----Factorio-----// spaceAgeEnabled: {type: Boolean, default: true}, autoUpdateMods: {type: Boolean, default: false}, visibilityPublic: {type: Boolean, default: true}, factorioUsername: {type: String, default: ""}, factorioPassword: {type: String, default: ""}, factorioToken: {type: String, default: ""}, requireUserVerification: {type: Boolean, default: true}, allowCommands: {type: String, default: "admins-only"}, afkAutokickInterval: {type: Number, default: 0}, autoPause: {type: Boolean, default: true}, autoPauseWhenPlayersConnect: {type: Boolean, default: false}, onlyAdminsCanPause: {type: Boolean, default: true}, //-----FiveM-----// licenseKey: {type: String, default: ""}, locale: String, //-----The Front-----// extraArgs: String, //-----Garry's Mod-----// workshopCollection: String, serverCheats: Boolean, customParameters: String, GLST: String, //-----Hytale-----// viewDistance: {type: Number, default: 12}, MaxViewRadius: {type: Number, default: 32}, serverMOTD: {type: String, default: ""}, defaultWorld: {type: String, default: "default"}, selectedWorld: {type: String, default: "default"}, IsPvpEnabled: {type: Boolean, default: false}, IsFallDamageEnabled: {type: Boolean, default: true}, IsGameTimePaused: {type: Boolean, default: false}, IsSpawningNPC: {type: Boolean, default: true}, IsSpawnMarkersEnabled: {type: Boolean, default: true}, IsAllNPCFrozen: {type: Boolean, default: false}, IsCompassUpdating: {type: Boolean, default: true}, IsObjectiveMarkersEnabled: {type: Boolean, default: true}, itemsLossMode: {type: String, default: "Configured"}, itemsAmountLossPercentage: {type: Number, default: 10}, itemsDurabilityLossPercentage: {type: Number, default: 10}, gameMode: {type: String, default: "Adventure"}, hytaleOAuthUrl: String, hytaleAuthLinkClicked: {type: Boolean, default: false}, //-----Palworld-----// AutoResetGuildTimeNoOnlinePlayers: {type: Number, default: 72}, bActiveUNKO: {type: Boolean, default: false}, BanListURL: {type: String, default: "https://api.palworldgame.com/api/banlist.txt"}, BaseCampMaxNum: {type: Number, default: 128}, BaseCampWorkerMaxNum: {type: Number, default: 15}, bAutoResetGuildNoOnlinePlayers: {type: Boolean, default: false}, bCanPickupOtherGuildDeathPenaltyDrop: {type: Boolean, default: false}, bEnableAimAssistKeyboard: {type: Boolean, default: false}, bEnableAimAssistPad: {type: Boolean, default: true}, bEnableDefenseOtherGuildPlayer: {type: Boolean, default: false}, bEnableFastTravel: {type: Boolean, default: true}, bEnableFriendlyFire: {type: Boolean, default: false}, bEnableInvaderEnemy: {type: Boolean, default: true}, bEnableNonLoginPenalty: {type: Boolean, default: true}, bEnablePlayerToPlayerDamage: {type: Boolean, default: false}, bExistPlayerAfterLogout: {type: Boolean, default: false}, bIsMultiplay: {type: Boolean, default: false}, bIsPvP: {type: Boolean, default: false}, bIsStartLocationSelectByMap: {type: Boolean, default: true}, BuildObjectDamageRate: {type: Number, default: 1}, BuildObjectDeteriorationDamageRate: {type: Number, default: 1}, bUseAuth: {type: Boolean, default: true}, CollectionDropRate: {type: Number, default: 1}, CollectionObjectHpRate: {type: Number, default: 1}, CollectionObjectRespawnSpeedRate: {type: Number, default: 1}, CoopPlayerMaxNum: {type: Number, default: 4}, DayTimeSpeedRate: {type: Number, default: 1}, DeathPenalty: {type: String, default: "All"}, Difficulty: {type: String, default: "None"}, DropItemAliveMaxHours: {type: Number, default: 1}, DropItemMaxNum: {type: Number, default: 3000}, DropItemMaxNum_UNKO: {type: Number, default: 100}, EnemyDropItemRate: {type: Number, default: 1}, ExpRate: {type: Number, default: 1}, GuildPlayerMaxNum: {type: Number, default: 20}, NightTimeSpeedRate: {type: Number, default: 1}, PalAutoHPRegeneRate: {type: Number, default: 1}, PalAutoHpRegeneRateInSleep: {type: Number, default: 1}, PalCaptureRate: {type: Number, default: 1}, PalDamageRateAttack: {type: Number, default: 1}, PalDamageRateDefense: {type: Number, default: 1}, PalEggDefaultHatchingTime: {type: Number, default: 72}, PalSpawnNumRate: {type: Number, default: 1}, PalStaminaDecreaceRate: {type: Number, default: 1}, PalStomachDecreaceRate: {type: Number, default: 1}, PlayerAutoHPRegeneRate: {type: Number, default: 1}, PlayerAutoHpRegeneRateInSleep: {type: Number, default: 1}, PlayerDamageRateAttack: {type: Number, default: 1}, PlayerDamageRateDefense: {type: Number, default: 1}, PlayerStaminaDecreaceRate: {type: Number, default: 1}, PlayerStomachDecreaceRate: {type: Number, default: 1}, palRegion: {type: String, default: ""}, WorkSpeedRate: {type: Number, default: 1}, Community: {type: Boolean, default: false}, BaseCampMaxNumInGuild : {type: Number, default: 3}, ConnectPlatform: {type: String, default: "Steam"}, SupplyDropSpan : {type: Number, default: 180}, palworldVersion: {type: String, default: "Latest"}, RandomizerType: {type: String, default: "None"}, RandomizerSeed: {type: String, default: ""}, ChatPostLimitPerMinute: {type: Number, default: 10}, EnablePredatorBossPal: {type: Boolean, default: true}, BuildObjectHpRate: {type: Number, default: 1}, Hardcore: {type: Boolean, default: false}, CharacterRecreateInHardcore: {type: Boolean, default: false}, PalLost: {type: Boolean, default: false}, BuildAreaLimit: {type: Boolean, default: false}, ItemWeightRate: {type: Number, default: 1}, MaxBuildingLimitNum: {type: Number, default: 0}, CrossplayPlatforms: {type: String, default: "(Steam,Xbox,PS5,Mac)"}, AllowGlobalPalboxExport: {type: Boolean, default: true}, AllowGlobalPalboxImport: {type: Boolean, default: false}, randomPalLevels: {type: Boolean, default: false}, equipmentDurabilityDamageRate: {type: Number, default: 1}, itemContainerForceMarkDirtyInterval: {type: Number, default: 1}, itemCorruptionMultiplier: {type: Number, default: 1}, //-----Project Zomboid-----// autoRestartEnabled: {type: Boolean, default: false}, build42Unstable: {type: Boolean, default: false}, PZVersion: {type: String, default: "41.78.16"}, //-----Rust-----// mapSize: Number, maxMapSize: Number, mapSeed: Number, oxideEnabled: Boolean, //-----Valheim-----// valheimPlusEnabled: Boolean, valheimPlusFork: {type: String, default: "valheimPlus"}, //-----Satisfactory-----// serverVersion: {type: String, default: "public"}, satisfactoryAdminPassword: {type: String, default: ''}, satisfactoryHealth: {type: String, default: ''}, satisfactoryActiveSession: {type: String, default: ''}, satisfactoryTechTier: {type: Number, default: 0}, satisfactoryTickRate: {type: Number, default: 0}, satisfactoryGameDuration: {type: Number, default: 0}, satisfactoryActiveSchematic: {type: String, default: ''}, satisfactoryIsGamePaused: {type: Boolean, default: false}, //-----Sons of the Forest-----// //-----Soulmask-----// pvMode: {type: String, default: "pvp"}, //-----Terraria-----// //----Already made/Non-config.json----// //gameDifficulty: Number - 7days //WorldGenSize: Number - 7days MaxSlots: Number, //uses serverMaxPlayerCount MOTD: String, secure: Number, //----Booleans----// UseServerName: Boolean, DebugLogs: Boolean, DisableLoginBeforeJoin: Boolean, IgnoreChestStacksOnLoad: Boolean, Autosave: Boolean, AnnounceSave: Boolean, SaveWorldOnCrash: Boolean, SaveWorldOnLastPlayerExit: Boolean, InfiniteInvasion: Boolean, SpawnProtection: Boolean, RangeChecks: Boolean, HardcoreOnly: Boolean, MediumCoreOnly: Boolean, DisableBuild: Boolean, DisableHardmode: Boolean, DisableDungeonGuardian: Boolean, DisableClownBombs: Boolean, DisableSnowBalls: Boolean, DisableTombstones: Boolean, DisableInvisPvP: Boolean, RegionProtectChests: Boolean, RegionProtectGemLocks: Boolean, IgnoreProjUpdate: Boolean, IgnoreProjKill: Boolean, AllowCutTilesAndBreakables: Boolean, AllowIce: Boolean, AllowCrimsonCreep: Boolean, AllowCorruptionCreep: Boolean, AllowHallowCreep: Boolean, PreventBannedItemSpawn: Boolean, PreventDeadModification: Boolean, PreventInvalidPlaceStyle: Boolean, ForceXmas: Boolean, ForceHalloween: Boolean, AllowAllowedGroupsToSpawnBannedItems: Boolean, AnonymousBossInvasions: Boolean, RememberLeavePos: Boolean, KickOnMediumcoreDeath: Boolean, BanOnMediumCoreDeath: Boolean, KickOnHardcoreDeath: Boolean, BanOnHardcoreDeath: Boolean, EnableWhitelist: Boolean, EnableIPBans: Boolean, EnableUUIDBans: Boolean, EnableBanOnUsernames: Boolean, KickProxyUsers: Boolean, RequireLogin: Boolean, AllowLoginAnyUsername: Boolean, AllowRegisterAnyUsername: Boolean, DisableUUIDLogin: Boolean, KickEmptyUUID: Boolean, KickOnTilePaintThresholdBroken: Boolean, KickOnTileLiquidThresholdBroken: Boolean, KickOnTileKillThresholdBroken: Boolean, KickOnTilePlaceThresholdBroken: Boolean, KickOnDamageThresholdBroken: Boolean, KickOnProjectileThresholdBroken: Boolean, KickOnHealOtherThresholdBroken: Boolean, ProjIgnoreShrapnel: Boolean, DisableSpewLogs: Boolean, DisableSecondUpdateLogs: Boolean, EnableGeoIP: Boolean, DisplayIPToAdmins: Boolean, EnableChatAboveHeads: Boolean, //----Numbers----// ReservedSlots: Number, InvasionMultiplier: Number, DefaultSpawnRate: Number, DefaultMaximumSpawns: Number, SpawnProtectionRadius: Number, MaxRangeForDisabled: Number, StatueSpawn200: Number, StatueSpawn600: Number, StatueSpawnWorld: Number, RespawnSeconds: Number, RespawnBossSeconds: Number, MaxHP: Number, MaxMP: Number, BombExplosionRadius: Number, MaximumLoginAttempts: Number, MinimumPasswordLength: Number, BCryptWorkFactor: Number, TilePaintThreshold: Number, TileKillThreshold: Number, TilePlaceThreshold: Number, TileLiquidThreshold: Number, MaxDamage: Number, MaxProjDamage: Number, ProjectileThreshold: Number, HealOtherThreshold: Number, //----Strings----// PvPMode: String, ForceTime: String, DefaultRegistrationGroupName: String, DefaultGuestGroupName: String, MediumcoreKickReason: String, MediumcoreBanReason: String, HardcoreKickReason: String, HardcoreBanReason: String, WhitelistKickReason: String, ServerFullReason: String, ServerFullNoReservedReason: String, HashAlgorithm: String, CommandSpecifier: String, CommandSilentSpecifier: String, SuperAdminChatPrefix: String, SuperAdminChatSuffix: String, ChatFormat: String, ChatAboveHeadsFormat: String, //-----Minecraft-----// saveName: String, enableCommandBlock: Boolean, allowFlight: Boolean, iconLink: String, resourcePackLink: String, resourcePackLinkSHA1: String, requireResourcePack: Boolean, resourcePackPrompt: String, enforceWhitelist: Boolean, maxBuildHeight: Number, allowNether: Boolean, generateStructures: Boolean, spawnAnimals: Boolean, spawnNPCS: Boolean, spawnMonsters: Boolean, forceGamemode: Boolean, enableHardcore: Boolean, enablePvP: Boolean, playerIdleTimeout: Number, serverMaxAllowedViewDistance: Number, levelType: String, generatorSettings: String, enableRcon: Boolean, rconPassword: String, broadcastRconToOps: Boolean, broadcastConsoleToOps: Boolean, opPermissionLevel: Number, functionPermissionLevel: Number, serverType: {type: String, default: "VANILLA"}, serverTypeVersion: {type: String, default: ""}, gameDifficultyString: String, maxPlayers: Number, modpackurl: String, modpackName: String, modpackVersion: String, mcVersion: {type: String, default: "LATEST"}, javaVersion: {type: String, default: "latest"}, maxTickTime: Number, spawnProtectionRadius: Number, selectedMods: [{ // For Minecraft name: String, slug: String, // For Project Zomboid title: String, workshopId: String, modId: String, mapFolder: String, }], //-----VRising-----// vrisingBepInExEnabled: Boolean, //-----Icarus-----// shutdownIfNotJoinedFor: Number, shutdownIfEmptyFor: Number, //-----Vintage Story-----// serverLanguage: String, serverWelcomeMessage: String, whitelistMode: Number, allowPvp: Boolean, verifyPlayerAuth: Boolean, allowFireSpread: Boolean, allowFallingBlocks: Boolean, passTimeWhenEmpty: Boolean, clientConnectionTimeout: Number, maxChunkRadius: Number, chatRateLimit: Number, maxOwnedGroupChannelsPerUser: Number, seed: String, allowCreativeMode: Boolean, playStyle: String, worldType: String, mapSizeX: Number, mapSizeY: Number, mapSizeZ: Number, gameMode: String, startingClimate: String, spawnRadius: Number, graceTimer: Number, deathPunishment: String, droppedItemsTimer: Number, seasons: String, playerlives: Number, lungCapacity: Number, daysPerMonth: Number, harshWinters: Boolean, blockGravity: String, caveIns: String, allowUndergroundFarming: Boolean, noLiquidSourceTransport: Boolean, bodyTemperatureResistance: Number, creatureHostility: String, creatureStrength: Number, creatureSwimSpeed: Number, playerHealthPoints: Number, playerHungerSpeed: Number, playerHealthRegenSpeed: Number, playerMoveSpeed: Number, foodSpoilSpeed: Number, saplingGrowthRate: Number, toolDurability: Number, toolMiningSpeed: Number, propickNodeSearchRadius: Number, microblockChiseling: String, allowCoordinateHud: Boolean, allowMap: Boolean, colorAccurateWorldmap: Boolean, loreContent: Boolean, clutterObtainable: String, lightningFires: Boolean, allowTimeswitch: Boolean, temporalStability: Boolean, temporalStorms: String, tempstormDurationMul: Number, temporalRifts: String, temporalGearRespawnUses: Number, temporalStormSleeping: Number, worldClimate: String, landcover: Number, oceanscale: Number, upheavelCommonness: Number, geologicActivity: Number, landformScale: Number, worldWidth: Number, worldLength: Number, worldEdge: String, polarEquatorDistance: Number, globalTemperature: Number, globalPrecipitation: Number, globalForestation: Number, globalDepositSpawnRate: Number, surfaceCopperDeposits: Number, surfaceTinDeposits: Number, snowAccum: Boolean, allowLandClaiming: Boolean, classExclusiveRecipes: Boolean, auctionHouse: Boolean, vsVersion: String }] })); mongoose.model('DashboardMetrics', new mongoose.Schema({ timestamp: { type: Date, default: Date.now, expires: 31536000 }, activeUsers: Number, workerId: String })); mongoose.model('ErrorLog', new mongoose.Schema({ timestamp: { type: Date, default: Date.now, expires: 2592000 }, // 30 days statusCode: Number, message: String, stack: String, url: String, method: String, userId: String, userEmail: String, authenticated: Boolean, sessionValid: Boolean })); // ===== Broccolini Bot Models ===== const ticketSchema = new mongoose.Schema({ gmailThreadId: { type: String, required: true, unique: true, index: true }, discordThreadId: String, broccoliniTicketId: Number, lastSyncedBroccoliniArticleId: Number, senderEmail: { type: String, required: true }, subject: String, createdAt: { type: Date, default: Date.now }, status: { type: String, default: 'open', enum: ['open', 'closed'] }, transcriptMessageId: String, claimedBy: String, escalated: { type: Boolean, default: false }, escalationTier: { type: Number, default: 0 }, ticketNumber: Number, renameCount: { type: Number, default: 0 }, renameWindowStart: Date, priority: { type: String, default: 'normal', enum: ['low', 'normal', 'medium', 'high'] }, ticketTag: String, lastActivity: Date, reminderSent: { type: Boolean, default: false }, welcomeMessageId: String, claimerId: String, staffChannelId: String, parentCategoryId: String, unclaimedRemindersSent: { type: [Number], default: [] }, lastMessageAuthorIsStaff: { type: Boolean, default: false } }); ticketSchema.index({ status: 1, lastActivity: 1 }); ticketSchema.index({ senderEmail: 1, status: 1 }); ticketSchema.index({ discordThreadId: 1 }); mongoose.model('Ticket', ticketSchema); mongoose.model('TicketCounter', new mongoose.Schema({ senderLocal: { type: String, required: true, unique: true }, counter: { type: Number, default: 1 } })); mongoose.model('Transcript', new mongoose.Schema({ gmailThreadId: { type: String, required: true }, transcriptMessageId: String, createdAt: { type: Date, default: Date.now } })); mongoose.model('Tag', new mongoose.Schema({ name: { type: String, required: true, unique: true }, content: { type: String, required: true }, createdAt: { type: Date, default: Date.now }, createdBy: String, useCount: { type: Number, default: 0 } })); mongoose.model('CloseRequest', new mongoose.Schema({ ticketId: { type: String, required: true, unique: true }, requestedBy: { type: String, required: true }, reason: String, createdAt: { type: Date, required: true } })); mongoose.model('GuildSettings', new mongoose.Schema({ guildId: { type: String, required: true, unique: true }, emailRouting: { type: String, enum: ['thread', 'category'], default: 'category' }, updatedAt: { type: Date, default: Date.now } })); mongoose.model('StaffSettings', new mongoose.Schema({ userId: { type: String, required: true, unique: true }, guildId: { type: String, required: true }, notifyDm: { type: Boolean, default: false }, updatedAt: { type: Date, default: Date.now } })); mongoose.model('StaffNotification', new mongoose.Schema({ userId: { type: String, required: true, unique: true }, guildId: String, channelId: String, cooldownHours: { type: Number, default: 1 }, updatedAt: { type: Date, default: Date.now } })); mongoose.model('StaffSignature', new mongoose.Schema({ userId: { type: String, required: true, unique: true }, guildId: { type: String, required: true }, valediction: { type: String, default: '' }, displayName: { type: String, default: '' }, tagline: { type: String, default: '' }, updatedAt: { type: Date, default: Date.now } }));