@opfr/services 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/index.es.js +968 -894
  2. package/dist/index.umd.js +1 -1
  3. package/dist/services/index.d.ts +1 -0
  4. package/dist/services/index.d.ts.map +1 -1
  5. package/dist/services/recipe/data.d.ts +3 -0
  6. package/dist/services/recipe/data.d.ts.map +1 -0
  7. package/dist/services/recipe/definition/model.d.ts +5 -0
  8. package/dist/services/recipe/definition/model.d.ts.map +1 -0
  9. package/dist/services/recipe/definition/schema.d.ts +13 -0
  10. package/dist/services/recipe/definition/schema.d.ts.map +1 -0
  11. package/dist/services/recipe/helper.d.ts +12 -0
  12. package/dist/services/recipe/helper.d.ts.map +1 -0
  13. package/dist/services/recipe/index.d.ts +3 -0
  14. package/dist/services/recipe/index.d.ts.map +1 -0
  15. package/dist/services/recipe/process/create.d.ts +3 -0
  16. package/dist/services/recipe/process/create.d.ts.map +1 -0
  17. package/dist/services/recipe/process/findMany.d.ts +5 -0
  18. package/dist/services/recipe/process/findMany.d.ts.map +1 -0
  19. package/dist/services/recipe/process/findOne.d.ts +4 -0
  20. package/dist/services/recipe/process/findOne.d.ts.map +1 -0
  21. package/dist/services/recipe/process/updateOne.d.ts +5 -0
  22. package/dist/services/recipe/process/updateOne.d.ts.map +1 -0
  23. package/dist/services/recipe/service.d.ts +24 -0
  24. package/dist/services/recipe/service.d.ts.map +1 -0
  25. package/dist/services/recipe/types.d.ts +24 -0
  26. package/dist/services/recipe/types.d.ts.map +1 -0
  27. package/dist/services/user-inventory/helper.d.ts +6 -20
  28. package/dist/services/user-inventory/helper.d.ts.map +1 -1
  29. package/package.json +5 -5
package/dist/index.umd.js CHANGED
@@ -1 +1 @@
1
- (function(d,s){typeof exports=="object"&&typeof module<"u"?s(exports,require("mongoose"),require("@opfr/utils-lang"),require("node-cache"),require("@opfr/definitions"),require("events")):typeof define=="function"&&define.amd?define(["exports","mongoose","@opfr/utils-lang","node-cache","@opfr/definitions","events"],s):(d=typeof globalThis<"u"?globalThis:d||self,s(d.services={},d.mongoose,d["@opfr/utils-lang"],d["node-cache"],d["@opfr/definitions"],d.events))})(this,(function(d,s,o,Ye,f,Xe){"use strict";function Ve(a){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(a){for(const t in a)if(t!=="default"){const r=Object.getOwnPropertyDescriptor(a,t);Object.defineProperty(e,t,r.get?r:{enumerable:!0,get:()=>a[t]})}}return e.default=a,Object.freeze(e)}const de=Ve(Xe),j="___ALL_ENTITIES___";class m{cache;constructor(e){this.cache=new Ye({stdTTL:e,checkperiod:e*.2,useClones:!1})}async get(e){const t=this.normalizeKey(e),r=this.cache.get(t);if(r)return r;const n=await this.fetchFromDb(e);return n&&this.cache.set(t,n),n}async update(e,t,r){const n=await this.updateInDb(e,t,r);if(n){const i=this.getKey(n);this.cache.del(j),this.cache.set(this.normalizeKey(i),n)}return n}invalidate(e){this.cache.del(j),e&&this.cache.del(this.normalizeKey(e))}clearAll(){this.cache.flushAll()}}class $ extends m{async getAll(){const e=this.cache.get(j);if(e)return e;const t=await this.fetchManyFromDb({});return this.cache.set(j,t),t.forEach(r=>{this.cache.set(this.normalizeKey(this.getKey(r)),r)}),t}async getMany(e){const t=await this.fetchManyFromDb(e);return t.forEach(r=>{this.cache.set(this.normalizeKey(this.getKey(r)),r)}),t}}const be=new de.EventEmitter,h=(a,e,t)=>{be.emit(a,e,t)},Le=a=>{for(const[e,t]of Object.entries(a))be.on(e,(r,n)=>{t(r,n)})},w={CREW:"middleware/quest/CREW",CREW_META:"middleware/quest/CREW_META",CREW_ORNAMENTS:"middleware/quest/CREW_ORNAMENTS",CREW_QUEST:"middleware/quest/CREW_QUEST",CREW_STATS_ENGAGEMENT:"middleware/quest/CREW_STATS_ENGAGEMENT",CREW_STATS_FREQUENCY:"middleware/quest/CREW_STATS_FREQUENCY",USER:"middleware/quest/USER",USER_CREW:"middleware/quest/USER_CREW",USER_INVENTORY:"middleware/quest/USER_INVENTORY",USER_META:"middleware/quest/USER_META",USER_ORNAMENT:"middleware/quest/USER_ORNAMENT",USER_QUEST:"middleware/quest/USER_QUEST",USER_STATS_CASINO:"middleware/quest/USER_STATS_CASINO",USER_STATS_CREW:"middleware/quest/USER_STATS_CREW",USER_STATS_ECONOMY:"middleware/quest/USER_STATS_ECONOMY",USER_STATS_ENGAGEMENT:"middleware/quest/USER_STATS_ENGAGEMENT",USER_STATS_FLAGS:"middleware/quest/USER_STATS_FLAGS",USER_STATS_FREQUENCY:"middleware/quest/USER_STATS_FREQUENCY",USER_STATS_INVENTORY:"middleware/quest/USER_STATS_INVENTORY"},$e=new de.EventEmitter,P=(a,e,t)=>{$e.emit(a,e,t)},Je=a=>{for(const[e,t]of Object.entries(a))$e.on(e,(r,n)=>{t(r,n)})},z={USER_INVENTORY:"middleware/raid/USER_INVENTORY",USER_QUEST:"middleware/raid/USER_QUEST",USER_RAID:"middleware/raid/USER_RAID"},Ee=new s.Schema({createdBy:s.Schema.Types.ObjectId,name:String,description:String,channelId:String,memberLimit:{type:Number,default:f.CREW_DEFAULT_MEMBER_LIMIT},disintegration:{type:Number,default:f.CREW_DEFAULT_DISINTEGRATION},faction:String},{timestamps:!0,minimize:!1});Ee.post("findOneAndUpdate",async function(a){h(w.CREW,a._id,a)});const K=s.models?.Crew||s.model("Crew",Ee);class Ze extends m{async getCrewRank(e){return(await K.aggregate([{$lookup:{from:"crewmetas",localField:"_id",foreignField:"crew",as:"meta"}},{$unwind:"$meta"},{$setWindowFields:{sortBy:{"meta.xp":-1},output:{rank:{$rank:{}}}}},{$match:{_id:e}},{$project:{_id:1,rank:1}}]))[0]}getCrewRanking(){return K.aggregate([{$lookup:{from:"crewmetas",localField:"_id",foreignField:"crew",as:"meta"}},{$unwind:"$meta"},{$sort:{"meta.xp":-1}},{$limit:10},{$project:{_id:1,"meta.xp":1}}])}async increaseLimit(e){await this.update(e,{$inc:{memberLimit:1}})}async repair(e,t){await this.update(e,[{$set:{disintegration:{$min:[{$add:["$disintegration",t]},100]}}}])}async applyDisintegration(e){const t=await this.get(e);if(!t)return;const{memberLimit:r}=t,[n,i]=[r-2,(r-3)*2+3];await this.update(e,[{$set:{disintegration:{$max:[{$add:["$disintegration",-1*o.randomBetween(n,i)]},0]}}}])}}const et=async a=>{const e=await K.findById(a).lean();return e||null},tt=(a,e)=>K.findOneAndUpdate({_id:a},e,{returnDocument:"after"}).lean();class at extends Ze{constructor(){super(3600)}normalizeKey(e){return e.toString()}getKey({_id:e}){return e}fetchFromDb(e){return et(e)}updateInDb(e,t){return tt(e,t)}}const Ue=new at;class rt extends m{async hasXpBuff(e){const t=await this.get(e);if(!o.hasExpire(t.buffs.xp.expireAt))return t.buffs.xp}async calcXp(e,t){const r=await Ue.get(e);return r?Math.ceil(t*(r.disintegration/f.CREW_DEFAULT_DISINTEGRATION)*((await this.hasXpBuff(e))?.boost??1)):0}async addXp(e,t){await this.update(e,{$inc:{xp:t}})}async addBerry(e,t){await this.update(e,{$inc:{berry:t}})}async removeBerry(e,t){await this.update(e,{$inc:{berry:-t}})}async addXpBuff(e,t){const r=new Date;await this.update(e,[{$set:{"buffs.xp":{$cond:{if:{lt:["$buffs.xp.expireAt",r]},then:{boost:1.1,expireAt:{$add:[r,t*60*60*1e3]}},else:{boost:1.1,expireAt:{$add:["$buffs.xp.expireAt",t*60*60*1e3]}}}}}}])}}const y=a=>a.toObject({flattenMaps:!0,flattenObjectIds:!1}),Ie=new s.Schema({crew:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"Crew"},xp:{type:Number,default:0,index:-1},berry:{type:Number,default:0,index:-1},buffs:{xp:{boost:{type:Number,default:1.1},expireAt:{type:Date,default:new Date(0)}}}});Ie.post("findOneAndUpdate",async function(a){h(w.CREW_META,a.crew._id,a)});const le=s.models?.CrewMeta||s.model("CrewMeta",Ie),nt=async a=>await le.create({crew:a});async function st(a){const e=await le.findOne({crew:a}).lean();return e||y(await nt(a))}const it=(a,e)=>le.findOneAndUpdate({crew:a},e,{returnDocument:"after",upsert:!0}).lean();class ut extends rt{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({crew:e}){return e}fetchFromDb(e){return st(e)}updateInDb(e,t){return it(e,t)}}const oe=new ut;class ct extends m{async unlockBadge(e,t,r){t.isProgressive?await this.update(e,{$addToSet:{unlockedBadges:`${t.id}_${r}`}}):await this.update(e,{$addToSet:{unlockedBadges:t.id}})}}const Te=new s.Schema({crew:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"Crew"},unlockedBadges:{type:[String],default:[]}});Te.post("findOneAndUpdate",async function(a){h(w.CREW_ORNAMENTS,a.crew._id,a)});const pe=s.models?.CrewOrnaments||s.model("CrewOrnaments",Te),dt=a=>pe.create({crew:a});async function lt(a){const e=await pe.findOne({crew:a}).lean();return e||y(await dt(a))}const ot=(a,e)=>pe.findOneAndUpdate({crew:a},e,{upsert:!0,returnDocument:"after"}).lean();class pt extends ct{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({crew:e}){return e}fetchFromDb(e){return lt(e)}updateInDb(e,t){return ot(e,t)}}const yt=new pt;class ft extends ${async getStatus(e,t){return(await this.get({crew:e,questId:t})).status}async isCompleted(e,t){return await this.getStatus(e,t)==="COMPLETED"}async isStreaking(e,t){const{lastCompletionDate:r}=await this.get({crew:e,questId:t});return!!r&&o.sameDay(o.yesterday(),r)}async completeQuest(e){return this.update(e,[{$set:{lastCompletionDate:new Date,status:f.QuestStatus.COMPLETED}}],{upsert:!1})}}const Oe=new s.Schema({crew:{type:s.Schema.Types.ObjectId,required:!0,ref:"Crew",index:!0},questId:{type:String,required:!0,index:!0},status:{type:String,default:f.QuestStatus.IN_PROGRESS,index:!0},lastCompletionDate:Date},{minimize:!1});Oe.post("findOneAndUpdate",function(a){h(w.CREW_QUEST,a.crew._id,a)});const Q=s.models?.CrewQuest||s.model("CrewQuest",Oe);function mt(a){return Q.find(a).lean()}const ht=async a=>await Q.create({...a});async function wt(a){const e=await Q.findOne(a).lean();return e||y(await ht(a))}function St(a,e,t){return Q.findOneAndUpdate(a,e,{upsert:!0,...t,returnDocument:"after"}).lean()}class gt extends ft{constructor(){super(300)}normalizeKey({crew:e,questId:t}){return`${e.toString()}/${t}`}getKey({crew:e,questId:t}){return{crew:e,questId:t}}fetchFromDb(e){return wt(e)}fetchManyFromDb(e){return mt(e)}updateInDb(e,t,r){return St(e,t,r)}}const bt=new gt;class $t extends m{async setActualVoiceMembers(e,t){await this.update(e,{$set:{"currentVoiceState.amount":t,"currentVoiceState.connectedAt":new Date}})}async setMaxVoiceMembers(e,t){await this.update(e,{$set:{maxVoiceMembersReached:t}})}}const De=new s.Schema({crew:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"Crew"},maxVoiceMembersReached:{type:Number,default:0},currentVoiceState:{amount:{type:Number,default:0},connectedAt:{type:Date,default:new Date(0)}}});De.post("findOneAndUpdate",function(a){h(w.CREW_STATS_ENGAGEMENT,a.crew._id,a)});const ye=s.models?.CrewStatsEngagement||s.model("CrewStatsEngagement",De),Et=a=>ye.create({crew:a});async function Ut(a){const e=await ye.findOne({crew:a}).lean();return e||y(await Et(a))}const It=(a,e)=>ye.findOneAndUpdate({crew:a},e,{upsert:!0,returnDocument:"after"}).lean();class Tt extends $t{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({crew:e}){return e}fetchFromDb(e){return Ut(e)}updateInDb(e,t){return It(e,t)}}const Ot=new Tt;class Dt extends m{}const ve=new s.Schema({crew:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"Crew"},streak80Percent:{type:Number,default:0}});ve.post("findOneAndUpdate",function(a){h(w.CREW_STATS_FREQUENCY,a.crew._id,a)});const fe=s.models?.CrewStatsFrequency||s.model("CrewStatsFrequency",ve),vt=a=>fe.create({crew:a});async function Ct(a){const e=await fe.findOne({crew:a}).lean();return e||y(await vt(a))}const Rt=(a,e)=>fe.findOneAndUpdate({crew:a},e,{upsert:!0,returnDocument:"after"}).lean();class Mt extends Dt{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({crew:e}){return e}fetchFromDb(e){return Ct(e)}updateInDb(e,t){return Rt(e,t)}}const At=new Mt,Ce=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,ref:"User",index:!0},questId:{type:String,required:!0,index:!0},status:{type:String,default:f.QuestStatus.IN_PROGRESS,index:1},lastCompletionDate:Date,streak:Number},{minimize:!1});Ce.post("findOneAndUpdate",function(a){P(z.USER_QUEST,a.user._id,a),h(w.USER_QUEST,a.user._id,a)});const v=s.models?.UserQuest||s.model("UserQuest",Ce),_t=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},raid:{classic:{type:Date,default:new Date(0)},special:{type:Date,default:new Date(0)}},lockUserCommand:{type:Date,default:new Date(0)},commands:{work:{type:Date,default:new Date(0)},dice:{type:Date,default:new Date(0)},qod:{type:Date,default:new Date(0)},guess:{type:Date,default:new Date(0)},blackjack:{type:Date,default:new Date(0)},rps:{type:Date,default:new Date(0)}}}),H=s.models?.UserCooldown||s.model("UserCooldown",_t),Re=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},crew:{type:s.Schema.Types.ObjectId,ref:"Crew",required:!0,index:!0},permission:{type:String,default:"member",required:!0},percent:{type:Number,default:f.CREW_DEFAULT_XP_PERCENT}},{minimize:!1});Re.post("findOneAndUpdate",function(a){h(w.USER_CREW,a.user._id,a)});const C=s.models?.UserCrew||s.model("UserCrew",Re),Bt=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},xpYesterday:{type:Number,default:0},berryYesterday:{type:Number,default:0},previousOrnament:{unlockedBadges:{type:[String],default:[]},unlockedTitles:{type:[String],default:[]},unlockedBackgrounds:{type:[String],default:[]}},previousCompletedQuest:{type:[String],default:[]},previousMessageSent:{type:Number,default:0}}),W=s.models?.UserDailyReport||s.model("UserDailyReport",Bt),qt=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},encyclopedia:{type:[String],default:[]}}),G=s.models?.UserEncyclopedia||s.model("UserEncyclopedia",qt),kt=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User",index:1},guess:{type:{tries:Number,amount:Number,numberToGuess:Number,lastGuess:Number},default:null}}),Y=s.models?.UserGames||s.model("UserGames",kt),Me=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},equippedItems:{type:Object,default:{}},equipmentSave:{type:[Object],default:[]},equipmentList:{type:[{entityId:String,seed:Number}],default:[]},itemList:{type:Map,of:Number,default:{}},recipes:{type:[String],default:[]}},{minimize:!1});Me.post("findOneAndUpdate",function(a){P(z.USER_INVENTORY,a.user._id,a),h(w.USER_INVENTORY,a.user._id,a)});const X=s.models?.UserInventory||s.model("UserInventory",Me),Nt=new de.EventEmitter,xt=(a,e)=>{Nt.emit(a,e)},R={multiplier:{type:Number,default:0},origin:String,expireAt:{type:Date,default:null},startAt:{type:Date,default:null}},Ae=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},premium:{type:Date,default:null},booster:{type:Boolean,default:!1},scam:{type:Boolean,default:!1},berry:{type:Number,default:1e3,index:-1},xp:{lastMessageWithXp:{type:Date,default:new Date},voice:{lastConnection:{type:Date,default:new Date},minutesInVoiceToday:{type:Number,default:0}},amount:{type:Number,default:0,index:-1},boost:{type:Date,default:null}},buffs:{cooldown:{casino:{type:[R],default:[]},work:{type:[R],default:[]}},berry:{work:{type:[R],default:[]},global:{type:[R],default:[]}},drop:{work:{type:[R],default:[]}},xp:{global:{type:[R],default:[]}}},hp:{type:Number,default:100},workUnluckyStreak:{type:Number,default:0},characteristics:{vitality:{type:Number,default:0},strength:{type:Number,default:0},agility:{type:Number,default:0},chance:{type:Number,default:0},intelligence:{type:Number,default:0},wisdom:{type:Number,default:0}},resetCharacteristics:{free:{type:Boolean,default:!0},nextAvailable:{type:Date,default:null}},scrolls:{vitality:{type:Number,default:0},strength:{type:Number,default:0},agility:{type:Number,default:0},chance:{type:Number,default:0},intelligence:{type:Number,default:0},wisdom:{type:Number,default:0}}});Ae.post("findOneAndUpdate",async function(a){h(w.USER_META,a.user._id,a),a.hp<=0&&xt("death",a.user._id)});const O=s.models?.UserMeta||s.model("UserMeta",Ae),_e=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},unlockedFactionBadges:{type:[String],default:[]},unlockedBadges:{type:[String],default:[]},unlockedTitles:{type:[String],default:[]},selectedTitle:{type:String,default:null},unlockedBackgrounds:{type:[String],default:["default"]},selectedBackground:{type:String,default:"default"},unlockedProfileAssets:{type:[String],default:[]},unlockedBags:{type:[String],default:["default"]},selectedBag:{type:String,default:"default"}});_e.post("findOneAndUpdate",function(a){h(w.USER_ORNAMENT,a.user._id,a)});const V=s.models?.UserOrnament||s.model("UserOrnament",_e),Be=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},currentRaid:{type:{raidId:String,seed:String,progression:{type:[String],default:[]},buffItem:String,rewards:{type:s.Schema.Types.Mixed,default:{}}},default:void 0},obtainedConditions:{type:s.Schema.Types.Mixed,default:{},_id:!1},obtainedRewards:{type:s.Schema.Types.Mixed,default:{},_id:!1},unlocked:{type:s.Schema.Types.Mixed,default:{},_id:!1}},{minimize:!1});Be.post("findOneAndUpdate",function(a){P(z.USER_RAID,a.user._id,a)});const L=s.models?.UserRaid||s.model("UserRaid",Be),Ft=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},sort:{inventory:{type:String,default:"alpha"}},sendDailyReport:{type:Boolean,default:!1,index:!0},sendDailyQuest:{type:Boolean,default:!1},reminder:{raid:{classic:{type:Boolean,default:!1},special:{type:Boolean,default:!1}},commands:{work:{type:Boolean,default:!1},dice:{type:Boolean,default:!1},qod:{type:Boolean,default:!1},blackjack:{type:Boolean,default:!1},guess:{type:Boolean,default:!1},rps:{type:Boolean,default:!1}}}}),B=s.models?.UserSettings||s.model("UserSettings",Ft),jt=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},lastShopId:s.Schema.Types.ObjectId,limit:{type:s.Schema.Types.Mixed,default:{}}},{minimize:!1}),J=s.models?.UserShop||s.model("UserShop",jt),qe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},totalBet:{type:Number,default:0},lastGames:{type:[{gameType:String,endState:Number}],default:[]},drawCount:{type:Number,default:0},bet666:{count:{type:Number,default:0},last:{type:Date,default:0}},dice:{doubleSixCount:{type:Number,default:0},drawWithDoubleSixCount:{type:Number,default:0}},blackJack:{blackJackCount:{type:Number,default:0}},rps:{lastRpsPlayed:{type:String,default:"paper"},count:{type:Number,default:-1}},doubleOrQuit:{sevenDoubleInARowCount:{type:Number,default:0}},priceIsRight:{guessInOneTryCount:{type:Number,default:0}}});qe.post("findOneAndUpdate",function(a){h(w.USER_STATS_CASINO,a.user._id,a)});const M=s.models?.UserStatsCasino||s.model("UserStatsCasino",qe),ke=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},xpGivenToCrew:{type:Number,default:0},berryGivenToCrew:{type:Number,default:0},timeCrewBeyond10PercentXp:{type:Number,default:0},timeCrewAbove90PercentXp:{type:Number,default:0}});ke.post("findOneAndUpdate",function(a){h(w.USER_STATS_CREW,a.user._id,a)});const Z=s.models?.UserStatsCrew||s.model("UserStatsCrew",ke),Ne=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},workCount:{type:Number,default:0},raidFinishedCount:{type:Number,default:0},totalSpentInShop:{type:Number,default:0}});Ne.post("findOneAndUpdate",function(a){h(w.USER_STATS_ECONOMY,a.user._id,a)});const ee=s.models?.UserStatsEconomy||s.model("UserStatsEconomy",Ne),xe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},messageSent:{type:Number,default:0},totalMinutesInVoice:{type:Number,default:0},randomMessageClaimed:{type:Number,default:0},writeDifferentChatIds:{type:[String],default:[]}});xe.post("findOneAndUpdate",function(a){h(w.USER_STATS_ENGAGEMENT,a.user._id,a)});const te=s.models?.UserStatsEngagement||s.model("UserStatsEngagement",xe),Fe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},tagEveryone:{type:Boolean,default:!1},botPingCount:{type:Number,default:0},reportedSomeone:{type:Boolean,default:!1},hasCelebrateBirthday:{type:Boolean,default:!1},gamblingFlags:{betMin:{type:Boolean,default:!1},bet10M:{type:Boolean,default:!1},lose10M:{type:Boolean,default:!1},winBet10M:{type:Boolean,default:!1},loseEverything:{type:Boolean,default:!1}}});Fe.post("findOneAndUpdate",function(a){h(w.USER_STATS_FLAGS,a.user._id,a)});const ae=s.models?.UserStatsFlags||s.model("UserStatsFlags",Fe),je=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},edito:{readToday:{type:Number,default:0},lastTimeRead:{type:Date,default:new Date}}});je.post("findOneAndUpdate",function(a){h(w.USER_STATS_FREQUENCY,a.user._id,a)});const A=s.models?.UserStatsFrequency||s.model("UserStatsFrequency",je),Pe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},bottle:{totalUsed:{type:Number,default:0},usedToday:{type:Number,default:0},lastUsed:{type:Date,default:new Date}},chest:{totalOpened:{type:Number,default:0}},alcohols:{wines:{type:Number,default:0},rhums:{type:Number,default:0},beers:{type:Number,default:0},totalConsumed:{type:Number,default:0}},crafts:{cookedMeal:{type:Number,default:0},scrolls:{type:Number,default:0},totalCrafted:{type:Number,default:0}}});Pe.post("findOneAndUpdate",function(a){h(w.USER_STATS_INVENTORY,a.user._id,a)});const _=s.models?.UserStatsInventory||s.model("UserStatsInventory",Pe),me=new s.Schema({discordId:{type:String,required:!0,unique:!0},birthday:{type:Date,default:null,index:1},faction:{type:String,default:f.DEFAULT_FACTION,index:1},canChangeFaction:{type:Boolean,default:!1},canChooseFaction:{type:Boolean,default:!1}});me.post("findOneAndUpdate",function(a){h(w.USER,a._id,a)}),me.post("deleteOne",async function(){const a=this.getQuery()._id;await H.deleteOne({user:a}),await C.deleteOne({user:a}),await W.deleteOne({user:a}),await G.deleteOne({user:a}),await Y.deleteOne({user:a}),await X.deleteOne({user:a}),await O.deleteOne({user:a}),await V.deleteOne({user:a}),await v.deleteMany({user:a}),await L.deleteOne({user:a}),await B.deleteOne({user:a}),await J.deleteOne({user:a}),await M.deleteOne({user:a}),await Z.deleteOne({user:a}),await ee.deleteOne({user:a}),await te.deleteOne({user:a}),await ae.deleteOne({user:a}),await A.deleteOne({user:a}),await _.deleteOne({user:a})});const E=s.models?.User||s.model("User",me);class Pt extends ${getByObjectId(e){return this.update({_id:e},{})}getNextBirthdays(){const e=new Date,t=e.getFullYear();return E.aggregate([{$match:{birthday:{$ne:null}}},{$set:{birthdayThisYear:{$dateFromParts:{year:t,month:{$month:"$birthday"},day:{$dayOfMonth:"$birthday"}}}}},{$set:{nextBirthday:{$cond:[{$lt:["$birthdayThisYear",e]},{$dateFromParts:{year:{$add:[t,1]},month:{$month:"$birthday"},day:{$dayOfMonth:"$birthday"}}},"$birthdayThisYear"]}}},{$sort:{nextBirthday:1}},{$limit:10},{$project:{_id:0,discordId:1,birthday:1,nextBirthday:1}}])}async getFactionRank(e){const t=await this.get(e);return(await E.aggregate([{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$match:{faction:t.faction}},{$setWindowFields:{sortBy:{"meta.xp.amount":-1},output:{rank:{$rank:{}}}}},{$match:{_id:t._id}},{$project:{_id:0,rank:1}}]))[0]}getFactionRanking(e){return E.aggregate([{$match:{faction:e}},{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$sort:{"meta.xp.amount":-1}},{$limit:10},{$project:{_id:1,discordId:1,"meta.xp.amount":1}}])}getGlobalRanking(){return E.aggregate([{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$sort:{"meta.xp.amount":-1}},{$limit:10},{$project:{_id:1,discordId:1,"meta.xp.amount":1}}])}getBerryRanking(){return E.aggregate([{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$sort:{"meta.berry":-1}},{$limit:10},{$project:{_id:1,discordId:1,"meta.berry":1}}])}getQuestRanking(){return v.aggregate([{$match:{status:f.QuestStatus.COMPLETED}},{$group:{_id:"$user",questCount:{$sum:1}}},{$setWindowFields:{sortBy:{questCount:-1},output:{rank:{$rank:{}}}}},{$project:{_id:0,discordId:"$_id",questCount:1,rank:1}},{$sort:{rank:1}}])}getTodayAllBirthday(){const e=new Date;return E.aggregate([{$match:{birthday:{$ne:null}}},{$addFields:{birthMonth:{$month:"$birthday"},birthDay:{$dayOfMonth:"$birthday"}}},{$addFields:{currentMonth:{$month:e},currentDay:{$dayOfMonth:e}}},{$match:{$expr:{$and:[{$eq:["$birthMonth","$currentMonth"]},{$eq:["$birthDay","$currentDay"]}]}}}])}async canChooseFaction(e,t){typeof e=="string"?await this.update({discordId:e},{$set:{canChooseFaction:t}}):await this.update({_id:e},{$set:{canChooseFaction:t}})}async canChangeFaction(e,t){typeof e=="string"?await this.update({discordId:e},{$set:{canChangeFaction:t}}):await this.update({_id:e},{$set:{canChangeFaction:t}})}async setBirthday(e,t){await this.update({discordId:e},{$set:{birthday:t}})}async updateFaction(e,t){await this.update({discordId:e},{$set:{faction:t}})}}const zt=a=>E.find(a),Kt=a=>E.create({discordId:a});async function Qt(a){const e=await E.findOne({discordId:a}).lean();return e||y(await Kt(a))}const Ht=(a,e)=>E.findOneAndUpdate(a,e,{upsert:!0,returnDocument:"after"});class Wt extends Pt{constructor(){super(3600)}normalizeKey(e){return e}getKey({discordId:e}){return e}fetchFromDb(e){return Qt(e)}fetchManyFromDb(e){return zt(e)}updateInDb(e,t){return Ht(e,t)}}const ze=new Wt,Gt=["work","rps","blackjack","guess","qod","dice"],Yt=new s.Schema({user:{type:s.Schema.Types.ObjectId,ref:"User",required:!0,index:!0},date:{type:Date,index:-1,required:!0},type:{type:String,required:!0}},{minimize:!1}),q=s.models?.Reminder||s.model("Reminder",Yt),Xt=async a=>{await q.deleteMany(a)},Vt=async(a,e)=>{await q.deleteOne({user:a,type:e})};class Lt extends ${getAllPassedReminder(){return this.getMany({date:{$lte:new Date}})}async addReminder(e,t,r){await this.update({user:e,type:t},{$set:{date:r}},{upsert:!0})}async updateReminderDate(e,t,r){await this.update({user:e,type:t},[{$set:{date:{$add:["$date",r]}}}])}async removeReminder(e,t){await Vt(e,t),this.invalidate({user:e,type:t})}async deleteSelectedReminders(e){const t=await this.getMany({_id:{$in:e}});await Xt({_id:{$in:e}}),t.forEach(r=>{this.invalidate({user:r.user,type:r.type})})}}function Jt(a,e={}){return q.find(a,e).lean()}async function Zt(a){const e=await q.findOne(a).lean();return e||null}async function ea(a,e,t){return q.findOneAndUpdate(a,e,{...t,returnDocument:"after"}).lean()}class ta extends Lt{constructor(){super(300)}getKey(e){return{user:e.user,type:e.type}}normalizeKey({user:e,type:t}){return`${e.toString()}/${t}`}fetchFromDb(e){return Zt(e)}fetchManyFromDb(e,t){return Jt(e,t)}updateInDb(e,t,r={upsert:!1}){return ea(e,t,r)}}const k=new ta;class aa extends ${async isOrnamentIds(e,t=()=>!0){const n=(await this.getAll()).filter(t).map(({ornamentId:i})=>i);return e.every(i=>n.includes(i))}isOrnament(e){return!!e&&"ornamentId"in e}isTitle(e){return e.type==="title"}isBackground(e){return e.type==="background"}isQuestTitle(e){return this.isTitle(e)&&!("faction"in e)&&!("price"in e)}isFactionTitle(e){return this.isTitle(e)&&"faction"in e}isShopTitle(e){return this.isTitle(e)&&"price"in e}async getAllBackgrounds(){return(await this.getAll()).filter(this.isBackground)}async getAllTitles(){return(await this.getAll()).filter(this.isTitle)}async getAllFactionTitles(){return(await this.getAll()).filter(this.isFactionTitle)}async getAllQuestTitles(){return(await this.getAll()).filter(this.isQuestTitle)}async getAllShopTitles(){return(await this.getAll()).filter(this.isShopTitle)}formatBackgroundId(e){return e.ornamentId==="background_default"?"par défaut":`"${o.capitalizeAllWords(e.ornamentId.split("_").join(" "))}"`}pickOrnament(e){const t=Math.random();let r=0;if(Object.keys(e).map(i=>parseFloat(i)).reduce((i,u)=>i+u,0)!==1)throw RangeError("pickOrnament - Sum of all odds (keys) must be equal to 1");for(const[i,u]of Object.entries(e)){const l=parseFloat(i);if(t>=r+l){r+=l;continue}if(u.length!==0)return u[o.randomBetween(0,u.length)]}throw Error("pickOrnament - All ods array were empty")}pickEachRarityOrnament(e,t){if(t.length!==f.RANK_IDS_WITHOUT_BASIC.length)throw new RangeError("pickEachRarityOrnament - must give same number of odds than ranks");return o.filterNullAndUndefined(t.map((r,n)=>{const i=f.RANK_IDS_WITHOUT_BASIC[n],u=e[i];return Math.random()>r||!u||!u.length?null:o.pickFrom(u)}))}}const ra=new s.Schema({ornamentId:{unique:!0,index:1,required:!0,type:String},type:{required:!0,type:String},rankId:{required:!0,type:String},name:{required:!0,type:String},price:Number,odd:Number,size:Number,faction:String,roleId:String,strength:Number},{minimize:!1}),he=s.models?.Ornaments||s.model("Ornaments",ra),na=async(a,e={})=>he.find(a,e).lean();async function sa(a){const e=await he.findOne({ornamentId:a}).lean();return e||null}const ia=(a,e)=>he.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class ua extends aa{constructor(){super(3600)}updateInDb(e,t){return ia(e,t)}fetchFromDb(e){return sa(e)}fetchManyFromDb(e){return na(e)}getKey(e){return e.ornamentId}normalizeKey(e){return e}}const S=new ua,ca=new s.Schema({panoplyId:{unique:!0,index:1,required:!0,type:String},name:{required:!0,type:String},equipments:{required:!0,type:[{type:s.Schema.Types.ObjectId,ref:"Entities"}]},fullBonusStr:{type:String},halfBonusStr:{type:String},fullBonus:s.Schema.Types.Mixed,halfBonus:s.Schema.Types.Mixed},{minimize:!1}),N=s.models?.Panoplies||s.model("Panoplies",ca),da=a=>N.find(a).lean(),la=async a=>N.find(a).populate("equipments");async function oa(a){const e=await N.findOne({panoplyId:a}).lean();return e||null}const pa=async a=>N.findOne(a).populate("equipments");class ya extends ${getAllPopulated(){return la({})}getPopulated(e){return pa({panoplyId:e})}hasPanoply(e,t){const r=o.filterNullAndUndefined(Object.values(e)),n=t.equipments.filter(i=>r.find(u=>u.entityId===i.entityId)).length;if(n===t.equipments.length)return t.fullBonus;if(n>=t.equipments.length/2)return t.halfBonus}async getPanoplyBonus(e){const t=[],r=await this.getAllPopulated();for(const n of r){const i=o.filterNullAndUndefined(Object.values(e)),u=n.equipments.filter(l=>i.find(({entityId:c})=>c===l.entityId));u.length===n.equipments.length?t.push([n,"full"]):u.length>=n.equipments.length/2?t.push([n,"half"]):u.length>=1&&t.push([n,null])}return t}}const fa=async(a,e)=>N.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class ma extends ya{constructor(){super(3600)}normalizeKey(e){return e}getKey({panoplyId:e}){return e}updateInDb(e,t){return fa(e,t)}fetchFromDb(e){return oa(e)}fetchManyFromDb(e={}){return da(e)}}const U=new ma;class ha extends ${isEntity(e){return!!e&&"entityId"in e}isItem(e){return e.category!=="equipment"}isEquipment(e){return e.category==="equipment"}async isEntityId(e,t=()=>!0){return(await this.getAll()).filter(t).map(({entityId:n})=>n).includes(e)}async getSomeStoreItems(e){const t=(await this.getAll()).filter(this.isStoreItem);return this.getSomeItems(e,t)}async getSomeRepairItems(e){const t=(await this.getAll()).filter(this.isRepairItem);return o.shuffle(t).slice(0,e)}async getSomeObjectItems(e){const t=(await this.getAll()).filter(this.isObjectItem);return o.shuffle(t.filter(r=>!!r.shop?.price)).slice(0,e)}async idArrayToEntities(e){return(await this.getAll()).filter(t=>e.includes(t.entityId))}recordToEntities(e){return this.idArrayToEntities(Object.keys(e))}async recordToEntityTuple(e){const t=await this.getAll();return o.recordToArray(e).reduce((r,[n,i])=>{const u=t.find(({entityId:l})=>l===n);return u&&r.push([u,i]),r},[])}async getAllEntitiesLimit(){const e=await this.getAll();return o.arrayToRecord(e.map(t=>[t.entityId,t.shop?.limit??0]))}async getAllEntitiesBy(e){return(await this.getAll()).filter(e)}async fromDBToEquipableEquipment(e){const r=(await this.getAll()).filter(this.isEquipment).find(({entityId:n})=>n===e.entityId);if(!r)throw new Error(`cannot find any equipment: ${e.entityId}`);return this.seedEquipment(r,e.seed)}async getUserEquipmentsCharacteristics(e){let t={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};const r=await U.getAllPopulated();for(const n of f.EQUIPMENT_SLOT){const i=e[n];i&&(t=o.mergeObjects(t,(await this.fromDBToEquipableEquipment(i)).characteristics,(u,l)=>u+l))}for(const n of r){const i=U.hasPanoply(e,n);i&&!("target"in i)&&(t=o.mergeObjects(t,i,(u,l)=>u+l))}return t}getSomeItems(e,t){const r=[];for(;r.length<e;){const n=o.exclude(t,r,i=>i.entityId);r.push(S.pickOrnament(o.groupBy(n,i=>i.shop?.odd??0)))}return o.sortBy(r,n=>n.shop?.price??0)}filterCraftEntities(e){return e.filter(t=>t.usage?.craft)}filterDismantleEntities(e){return e.filter(t=>t.usage?.dismantle)}filterUsableEntities(e){return e.filter(t=>t.usage?.mode)}filterEnchantableEntities(e){return e.filter(t=>t.usage?.enchant)}hasCraftEntities(e){return!!e.find(t=>t.usage?.craft)}hasDismantleEntities(e){return!!e.find(t=>t.usage?.dismantle)}hasEnchantableEntities(e){return!!e.find(t=>t.usage?.enchant)}hasUsableEntities(e){return!!e.find(t=>t.usage?.mode)}isChestItem(e){return e.type==="chest"}isBottleItem(e){return e.type==="bottle"}isBoostItem(e){return e.type==="boost"}isRepairItem(e){return e.type==="repair"}isStoreItem(e){return e.type==="store"}isObjectItem(e){return e.type==="object"}isScrollItem(e){return e.type==="scroll"}isCookedMeal(e){return e.type==="cookedMeal"}isAlcoholItem(e){return e.type==="alcohol"}isSameEquipment(e,t){return e.entityId===t.entityId&&e.seed===t.seed}getEquipmentSlotType(e){return f.EQUIPMENT_FROM_SLOT_TO_TYPE[e]}seedEquipment(e,t){const r=o.seededRandom(t),n=o.sortBy(o.recordToArray(e.characteristics),([i])=>i);return{...e,seed:t,characteristics:Object.fromEntries(n.map(([i,u])=>[i,Array.isArray(u)?o.randomBetween(u[0],u[1]+1,r):u]))}}isEquipped(e,t){return!!Object.values(e).find(r=>r&&this.isSameEquipment(r,t))}calcILvl(e){return Object.values(e.characteristics).reduce((r,n)=>r+n,0)+e.level}}const wa=new s.Schema({type:{type:String,enum:f.EFFECT_KEYS,required:!0},params:{type:s.Schema.Types.Mixed}},{_id:!1}),Sa=new s.Schema({entityId:{unique:!0,required:!0,type:String},type:{required:!0,type:String},name:{required:!0,_id:!1,type:{key:{required:!0,type:String},context:String}},description:{_id:!1,type:{key:{required:!0,type:String},context:String}},image:{required:!0,type:String},emojis:{required:!0,type:String},category:{required:!0,type:String},effects:{type:[wa],default:[]},rankId:String,usage:{_id:!1,type:{mode:String,craft:Boolean,enchant:String,dismantle:{type:[{type:{entityId:String,quantity:Number},_id:!1}],default:void 0}},default:void 0},shop:{default:void 0,_id:!1,type:{price:{required:!0,type:Number},limit:Number,size:Number,odd:Number}},bottle:{default:void 0,_id:!1,type:{xp:{type:s.Schema.Types.Union,of:[Number,[Number]],required:!0},buffs:{required:!0,default:[],type:[{target:{type:String,required:!0},multiplier:{type:Number,required:!0},origin:{type:String,required:!0},startIn:{type:Number,default:null},endIn:{type:Number,default:null},_id:!1}]},hp:Number,tier:Number}},ms:Number,characteristics:{_id:!1,type:Object},level:Number,panoply:String},{minimize:!1}),re=s.models?.Entities||s.model("Entities",Sa),ga=async a=>await re.create({...a}),ba=async(a,e={})=>re.find(a,e).lean();async function $a(a){const e=await re.findOne({entityId:a}).lean();return e||null}const Ea=(a,e)=>re.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class Ua extends ha{constructor(){super(3600)}createInDb(e){return ga(e)}updateInDb(e,t){return Ea(e,t)}fetchFromDb(e){return $a(e)}fetchManyFromDb(e){return ba(e)}normalizeKey(e){return e}getKey(e){return e.entityId}}const p=new Ua,Ia=(a,e,t)=>C.create({user:a,crew:e,permission:t}),Ta=async a=>{await C.deleteOne({user:a})};class Oa extends ${async updatePercent(e,t){await this.update(e,{$set:{percent:t}})}async updatePermission(e,t){await this.update(e,{$set:{permission:t}})}async addUserToCrew(e,t,r){await Ia(e,t,r),this.invalidate(t)}async removeUserFromCrew(e,t){await Ta(e),this.invalidate(e),this.invalidate(t)}async getAllUserIdsFromCrew(e){const t=e.toString(),r=this.cache.get(t);if(r)return r.map(({user:i})=>i);const n=await this.getMany({crew:e});return this.cache.set(t,n),n.map(({user:i})=>i)}}const Da=a=>C.find(a).lean(),va=a=>C.findOne({user:a}).lean(),Ca=(a,e)=>C.findOneAndUpdate({user:a},e,{returnDocument:"after"}).lean();class Ra extends Oa{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return va(e)}fetchManyFromDb(e){return Da(e)}updateInDb(e,t){return Ca(e,t)}}const Ke=new Ra;class Ma extends m{hasAlreadyFoundEntity(e,t){return e.encyclopedia.includes(t)}async addEntities(e,t){await this.update(e,{$addToSet:{encyclopedia:{$each:t}}})}}const Aa=async a=>await G.create({user:a});async function _a(a){const e=await G.findOne({user:a}).lean();return e||y(await Aa(a))}const Ba=(a,e)=>G.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class qa extends Ma{constructor(){super(300)}fetchFromDb(e){return _a(e)}getKey({user:e}){return e}normalizeKey(e){return e.toString()}updateInDb(e,t){return Ba(e,t)}}const ne=new qa;class ka extends m{getPanoplyEffectiveBonus(e,t){const r=o.filterNullAndUndefined(Object.values(e.equippedItems)),n=t.equipments.filter(i=>r.find(u=>u.entityId===i.entityId)).length;if(n===t.equipments.length)return t.fullBonus;if(n>=t.equipments.length/2)return t.halfBonus}async getUserEquipmentsCharacteristics(e){let t={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};const r=await U.getAllPopulated();for(const n of f.EQUIPMENT_SLOT){const i=e.equippedItems?.[n];if(!i)continue;const u=await p.fromDBToEquipableEquipment(i);t=o.mergeObjects(t,u.characteristics,(l,c)=>l+c)}for(const n of r){const i=this.getPanoplyEffectiveBonus(e,n);i&&!("target"in i)&&(t=o.mergeObjects(t,i,(u,l)=>u+l))}return t}maxCraftQuantity(e,t){let r=1/0;for(const n of t)r=Math.min(r,Math.floor((e.itemList[n.entityId]??0)/n.size));return r}hasEnoughItemsForRecipe(e,t,r){for(const n of t)if((e.itemList[n.entityId]??0)<n.size*r)return!1;return!0}hasInventoryRequirements(e,t){return o.recordToArray(t).reduce((r,[n,i])=>r&&(e.itemList[n]??0)>=(i??0),!0)}hasEnoughEntity(e,t,r){return(e.itemList[r]??0)>=t}getItemList(e){return Object.fromEntries(e.itemList)}async calcBottleMultiplier(e,{bottle:{buffs:t}}){const r=await this.get(e),i=(await U.getPanoplyBonus(r.equippedItems)).find(([u,l])=>u.panoplyId==="herbalist"&&l!==null);return i&&i[1]==="full"?t.map(u=>({...u,multiplier:u.multiplier*1.25})):i&&i[1]==="half"?t.map(u=>({...u,multiplier:u.multiplier*1.1})):t}async calcMinStreakForWorkLoot(e){const t=(await U.getPanoplyBonus(e.equippedItems)).find(([r,n])=>r.panoplyId==="marine"&&n!==null);return t&&t[1]==="full"?10:t&&t[1]==="half"?20:1/0}async hasRevolutionaryBuff(e){const t=await this.get(e);return(await U.getPanoplyBonus(t.equippedItems)).find(([n,i])=>n.panoplyId==="revolutionary"&&i!==null)?.[1]??null}async getRecipeResult(e,t){const r=(await U.getPanoplyBonus(e.equippedItems)).find(([n,i])=>n.panoplyId==="little_blacksmith"&&i!==null);return r?.[1]==="full"&&t==="chest_3"?"chest_blacksmith_3":r?.[1]==="half"&&t==="chest_2"?"chest_blacksmith_2":r?.[1]==="half"&&t==="chest_1"?"chest_blacksmith_1":t}async addItem(e,t,r){await this.update(e,{$inc:{[`itemList.${t}`]:r}}),await ne.addEntities(e,[t])}async addItems(e,t){await this.update(e,{$inc:Object.fromEntries(Object.entries(t).filter(([,r])=>(r??0)>0).map(([r,n])=>[`itemList.${r}`,n]))}),await ne.addEntities(e,o.recordToArray(t).filter(([,r])=>r>0).map(([r])=>r))}async removeItem(e,t,r){r!==0&&await this.update(e,[{$set:{[`itemList.${t}`]:{$max:[{$add:[`$itemList.${t}`,-r]},0]}}}])}async removeEquipment(e,t,r){await this.update(e,{$pull:{equipmentList:{entityId:t,seed:r}}})}async removeAllItem(e,t){await this.update(e,{$set:{[`itemList.${t}`]:0}})}async addEquipments(e,t){await this.update(e,{$push:{equipmentList:{$each:t}}}),await ne.addEntities(e,t.map(r=>r.entityId))}async saveEquipments(e){await this.update(e,[{$set:{equipmentSave:{$push:["$equipmentSave","$equippedItems"]}}}])}async changeEquippedEquipment(e,t){const r=await this.get(e);r?.equipmentSave[t]&&await this.equip(e,r.equipmentSave[t])}async equip(e,t){const r=await I.getMaxHp(e),n=Object.fromEntries(o.recordToArray(t).map(([i,u])=>[`equippedItems.${i}`,u]));await this.update(e,{$set:n}),await I.updateHp(e,r)}async unequip(e,t){const r=await I.getMaxHp(e);await this.update(e,{$set:{[`equippedItems.${t}`]:null}}),await I.updateHp(e,r)}async craftItem(e,t,r,n,i){for(const{entityId:c,size:b}of t)await this.removeItem(e,c,b*n);const{entityId:u,size:l}=r;await p.isEntityId(u,p.isEquipment)?await this.addEquipments(e,[{entityId:u,seed:i}]):await p.isEntityId(u,p.isItem)&&await this.addItem(e,u,l*n)}async dismantleEntity(e,t,r,n,i){p.isEquipment(t)?await this.removeEquipment(e,t.entityId,i):p.isItem(t)&&await this.removeItem(e,t.entityId,n);for(const{entityId:u,quantity:l}of r)await p.isEntityId(u,p.isItem)&&await this.addItem(e,u,n*l);await this.removeItem(e,"tools",1)}async enchantItem(e,t,r,n){await this.removeItem(e,t,n*4),await this.removeItem(e,"enchanted_stone",n),await this.addItem(e,r,n)}async unlockRecipe(e,t){await this.update(e,{$addToSet:{recipes:t}})}}const Na=a=>X.create({user:a});async function xa(a){const e=await X.findOne({user:a}).lean();return e||y(await Na(a))}const Fa=(a,e)=>X.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class ja extends ka{constructor(){super(300)}fetchFromDb(e){return xa(e)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}updateInDb(e,t){return Fa(e,t)}}const g=new ja;class Pa extends ${getTotalCharacteristics({characteristics:e,scrolls:t}){return o.arrayToRecord(f.CHARACTERISTICS.map(r=>[r,f.getComputedCharacteristicValue(e[r])+t[r]]))}async isCooldownForXpPassed(e){const t=await this.get(e);return Date.now()-t.xp.lastMessageWithXp.getTime()>60*1e3}async getAllWithExpiredBuffs(){const e=new Date;return this.getMany({$or:[{"xp.boost":{$lt:e}},{"buffs.cooldown.casino":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.cooldown.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.berry.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.berry.global":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.drop.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.xp.global":{$elemMatch:{expireAt:{$lt:e}}}}]})}async calcXpBoost(e){const t=await this.get(e),{boost:r}=t.xp,n=r!==null&&Date.now()<r.getTime()?.2:0,i=Math.max(t.premium?.5:0,t.booster?.25:0);return n+i+t.buffs.xp.global.reduce((u,{expireAt:l,startAt:c,multiplier:b})=>c&&c>new Date||l&&o.hasExpire(l)?u:u+b,0)}calcMessageXp(e){const t=e.trim().length,r=2;return t<10?10*r:t>300?300*r:t*r}async getXpDeathPenalties(e){const t=await this.get(e),r=f.getCurrentLevel(t.xp.amount);return r<=10?5e3:r<=20?1e4:r<=30?2e4:r<=40?3e4:r<=50?5e4:r<=60?75e3:r<=70?15e4:r<=80?25e4:r<=90?4e5:r<=100?75e4:14e6}async calcXp(e,t,r){return t*=1+await this.calcXpBoost(e),Math.ceil(t*r)}async calcBerry(e,t,r){if(t<=0)return t;const n=r?1:await this.calcBuffMultiplier(e,"berry","global");return Math.ceil(t*(n||1))}async calcBuffMultiplier(e,t,r){return(await this.get(e)).buffs[t][r].reduce((u,{expireAt:l,startAt:c,multiplier:b})=>u+(new Date>=(c??new Date)&&(!l||!o.hasExpire(l))?b:0),1)}async getMaxHp(e){const t=await this.get(e),r=await g.get(e),{vitality:n}=this.getTotalCharacteristics(t),i=await g.getUserEquipmentsCharacteristics(r);return(n+i.vitality)*f.HP_PER_VITALITY+f.DEFAULT_MAX_HP}async getHpRatio(e){const t=await this.get(e),r=await this.getMaxHp(e);return Math.min(t.hp/r,1)}async hasCharacteristicRequirement(e,t){const r=await this.get(e),n=await g.get(e),i=await g.getUserEquipmentsCharacteristics(n),u=o.mergeObjects(this.getTotalCharacteristics(r),i,(l,c)=>l+c);if("sum"in t){let l=0;for(const c of t.characteristics)l+=u[c]??0;return l>=t.sum}else{for(const l of Object.keys(t))if(u[l]<(t[l]??0))return!1;return!0}}async getGlobalRank(e){return(await O.aggregate([{$setWindowFields:{sortBy:{"xp.amount":-1},output:{rank:{$rank:{}}}}},{$match:{user:e}},{$project:{rank:1}}]))[0]}async getBerryRank(e){return(await O.aggregate([{$setWindowFields:{sortBy:{berry:-1},output:{rank:{$rank:{}}}}},{$match:{user:e}},{$project:{rank:1}}]))[0]}async hasMalusBuff(e){const t=await this.get(e),r=[...t.buffs.xp.global,...t.buffs.berry.global,...t.buffs.berry.work,...t.buffs.cooldown.work,...t.buffs.cooldown.casino,...t.buffs.drop.work];for(const{multiplier:n,startAt:i,expireAt:u}of r)if(n<0&&(!u||!o.hasExpire(u))&&(i??new Date)<=new Date)return!0;return!1}async addBerry(e,t){await this.update(e,[{$set:{berry:{$max:[{$add:["$berry",t]},0]}}}])}async addXp(e,t){await this.update(e,{$inc:{"xp.amount":t}})}async updatePremium(e,t){await this.update(e,{$set:{premium:t}})}async updateBooster(e,t){await this.update(e,{$set:{booster:t}})}async updateBoost(e,t){const{xp:{boost:r}}=await this.update(e,[{$set:{"xp.boost":{$cond:{if:{$or:[{$not:"$xp.boost"},{$lt:["$xp.boost",new Date]}]},then:{$add:[new Date,t]},else:{$add:["$xp.boost",t]}}}}}]);return r}async updateBuff(e,t){if(Array.isArray(t)){for(const n of t)await this.updateBuff(e,n);return}const r=f.transformToDBBuff(t);await this.update(e,[{$set:{[`buffs.${t.target}`]:{$map:{input:`$buffs.${t.target}`,as:"buff",in:{$cond:{if:{$eq:[{$substr:["$$buff.origin",0,{$indexOfBytes:["$$buff.origin","/"]}]},t.origin.split("/")[0]]},then:{multiplier:t.multiplier,origin:t.origin,expireAt:r.expireAt?{$cond:{if:{$lt:["$$buff.expireAt",new Date]},then:r.expireAt,else:{$add:["$$buff.expireAt",(t.endIn??0)*60*60*1e3]}}}:null,startAt:{$cond:{if:{$gte:["$$buff.startAt",new Date]},then:"$$buff.startAt",else:{$add:[new Date,(t.startIn??0)*60*60*1e3]}}}},else:"$$buff"}}}}}},{$set:{[`buffs.${t.target}`]:{$cond:{if:{$in:[t.origin.split("/")[0],{$map:{input:`$buffs.${t.target}`,as:"buff",in:{$substr:["$$buff.origin",0,{$indexOfBytes:["$$buff.origin","/"]}]}}}]},then:`$buffs.${t.target}`,else:{$concatArrays:[`$buffs.${t.target}`,[{...r}]]}}}}}])}async removeBuff(e,t){await this.update(e,{$pull:{[`buffs.${t.target}`]:{origin:t.origin}}})}async updatePanoplyBuff(e,t,r,n){const i=await p.fromDBToEquipableEquipment(t),u=o.filterNullAndUndefined(Object.values(r)),c=(await U.getAllPopulated()).find(D=>D.panoplyId===i.panoply);if(!c)return;const b=c.equipments.filter(D=>(u.find(ce=>D.entityId===ce.entityId)||!n&&i.entityId===D.entityId)&&(n?i.entityId!==D.entityId:!0)).length,F=b===c.equipments.length?c.fullBonus:b>=c.equipments.length/2?c.halfBonus:void 0;c.halfBonus&&"target"in c.halfBonus&&await this.removeBuff(e,c.halfBonus),c.fullBonus&&"target"in c.fullBonus&&await this.removeBuff(e,c.fullBonus),F&&"target"in F&&await this.updateBuff(e,F)}async gainHp(e,t){const r=await this.get(e),i=await this.getMaxHp(e)-r.hp;await this.update(e,{$set:{hp:r.hp+Math.floor(Math.min(t,i))}})}async loseHp(e,t){await this.update(e,[{$set:{hp:{$max:[{$add:["$hp",-t]},0]}}}])}async updateHp(e,t){const r=await this.getMaxHp(e);await this.update(e,[{$set:{hp:{$round:[{$multiply:[{$divide:["$hp",t]},r]},0]}}}])}async addCharacteristics(e,t){const r=await this.getMaxHp(e),n=Object.fromEntries(Object.entries(t).filter(([,i])=>i!==0).map(([i,u])=>[`characteristics.${i}`,u]));await this.update(e,{$inc:n}),await this.updateHp(e,r)}async addScrollCharacteristic(e,t){const r=await this.getMaxHp(e),n=Object.fromEntries(Object.entries(t).filter(([,i])=>i!==0).map(([i,u])=>[`scrolls.${i}`,u]));await this.update(e,{$inc:n}),await this.updateHp(e,r)}async resetCharacteristics(e,t){const r=await this.getMaxHp(e),n={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};t?await this.update(e,{$set:{characteristics:n,"resetCharacteristics.free":!1}}):await this.update(e,{$set:{characteristics:n,"resetCharacteristics.nextAvailable":new Date(Date.now()+720*60*60*1e3)},$inc:{berry:-1e8}}),await this.updateHp(e,r)}async resetMinutesInVoiceToday(e){await this.update(e,{$set:{"xp.voice.minutesInVoiceToday":0}})}async addMinutesInVoiceToday(e,t){await this.update(e,{$inc:{"xp.voice.minutesInVoiceToday":t}})}async updateLastVoiceConnection(e,t){await this.update(e,{$set:{"xp.voice.lastConnection":t}})}async incrementWorkUnluckyStreak(e){await this.update(e,{$inc:{workUnluckyStreak:1}})}async resetWorkUnluckyStreak(e){await this.update(e,{$set:{workUnluckyStreak:0}})}async updateScam(e,t){await this.update(e,{$set:{scam:t}})}async updateUserXp(e,t){const r=await Ke.get(e),n=r?.percent??0,i=await this.calcXp(e,t,(1-n)*await this.getHpRatio(e));let u=0;return await this.addXp(e,i),r&&(u=await oe.calcXp(r.crew,t*n),await oe.addXp(r.crew,u)),{userXp:i,crewXp:u}}async updateUserBerry(e,t,r){const n=await this.calcBerry(e,t,r);return await this.addBerry(e,n),n}}const za=a=>O.find(a).lean(),Ka=async a=>await O.create({user:a});async function Qa(a){const e=await O.findOne({user:a}).lean();return e||y(await Ka(a))}const Ha=(a,e)=>O.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).lean();class Wa extends Pa{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Qa(e)}fetchManyFromDb(e){return za(e)}updateInDb(e,t){return Ha(e,t)}}const I=new Wa;class Ga extends ${async updateSendDailyQuest(e,t){await this.update(e,{$set:{sendDailyQuest:t}})}async updateSendDailyReport(e,t){await this.update(e,{$set:{sendDailyReport:t}})}async updateInventorySort(e,t){await this.update(e,{$set:{"sort.inventory":t}})}async updateReminderSettings(e,t,r){await this.update(e,{$set:{[`reminder.${t}`]:r}})}getUsersWithDailyReportEnable(){return this.getMany({sendDailyReport:!0})}}const Ya=a=>B.find(a).lean(),Xa=async a=>await B.create({user:a});async function Va(a){const e=await B.findOne({user:a}).lean();return e||y(await Xa(a))}const La=(a,e)=>B.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).lean();class Ja extends Ga{constructor(){super(3600)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return Va(e)}fetchManyFromDb(e){return Ya(e)}updateInDb(e,t){return La(e,t)}}const we=new Ja;class Za extends m{async getCommandCooldown(e,t){return(await this.get(e)).commands[t]}async getRaidCooldown(e,t){return(await this.get(e)).raid[t]}async reduceRaidCooldown(e,t){await this.update(e,[{$set:{"raid.special":{$subtract:[{$ifNull:["$raid.special",new Date]},t*3600*1e3]},"raid.classic":{$subtract:[{$ifNull:["$raid.classic",new Date]},t*3600*1e3]}}}]),await k.updateReminderDate(e,"raid/special",-1*t*3600*1e3),await k.updateReminderDate(e,"raid/classic",-1*t*3600*1e3)}async startRaidCooldown(e,t,r){const{reminder:n}=await we.get(e);await this.update(e,{$set:{[`raid.${t}`]:new Date(Date.now()+r)}}),n.raid[t]&&await k.addReminder(e,`raid/${t}`,new Date(Date.now()+r))}async lockUserCommand(e){await this.update(e,{$set:{lockUserCommand:new Date(Date.now()+2*3600*1e3)}}),await I.gainHp(e,1)}async useCommand(e,t,r){const{reminder:n}=await we.get(e);await this.update(e,{$set:{[`commands.${t}`]:new Date(Date.now()+r)}}),n.commands[t]&&await k.addReminder(e,`commands/${t}`,new Date(Date.now()+r))}}const er=async a=>await H.create({user:a});async function tr(a){const e=await H.findOne({user:a}).lean();return e||y(await er(a))}const ar=(a,e)=>H.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).lean();class rr extends Za{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return tr(e)}updateInDb(e,t){return ar(e,t)}}const Qe=new rr;class nr extends m{async unlockTitle(e,t){await S.isOrnamentIds([t],S.isTitle)&&await this.update(e,{$addToSet:{unlockedTitles:t}})}async unlockTitles(e,t){await S.isOrnamentIds(t,S.isTitle)&&await this.update(e,{$addToSet:{unlockedTitles:{$each:t}}})}async selectTitle(e,t){await this.update(e,{$set:{selectedTitle:t}})}async unlockBackground(e,t){await S.isOrnamentIds([t],S.isBackground)&&await this.update(e,{$addToSet:{unlockedBackgrounds:t}})}async unlockBackgrounds(e,t){await S.isOrnamentIds(t,S.isBackground)&&await this.update(e,{$addToSet:{unlockedBackgrounds:{$each:t}}})}async selectBackground(e,t){await this.update(e,{$set:{selectedBackground:t}})}async unlockBadge(e,t,r){t.isProgressive?await this.update(e,{$addToSet:{unlockedBadges:`${t.id}_${r}`}}):await this.update(e,{$addToSet:{unlockedBadges:t.id}})}async unlockFactionBadge(e,t){await this.update(e,{$addToSet:{unlockedFactionBadges:{$each:[`b_marine_${t}`,`b_revolutionary_${t}`,`b_pirate_${t}`]}}})}async unlockProfileAsset(e,t){await this.update(e,{$addToSet:{unlockedProfileAssets:t}})}async unlockBag(e,t){await this.update(e,{$addToSet:{unlockedBags:t}})}async selectBag(e,t){await this.update(e,{$set:{selectedBag:t}})}}const sr=async a=>await V.create({user:a});async function ir(a){const e=await V.findOne({user:a}).lean();return e||y(await sr(a))}const ur=async(a,e)=>V.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class cr extends nr{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return ir(e)}updateInDb(e,t){return ur(e,t)}}const x=new cr;class dr extends ${async getStatus(e,t){return(await this.get({user:e,questId:t})).status}async isCompleted(e,t){return await this.getStatus(e,t)==="COMPLETED"}async isStreaking(e,t){const{lastCompletionDate:r}=await this.get({user:e,questId:t});return!!r&&o.sameDay(o.yesterday(),r)}async getStreakMultiplier(e,t){const r=await this.get({user:e,questId:t});return await this.isStreaking(e,t)?1+Math.min(2,(r.streak??0)/10):1}async completeQuest(e,t=!1){const r=o.yesterday();r.setHours(0,0,0,0);const n=new Date;return n.setHours(0,0,0,0),this.update(e,[{$set:{...t?{streak:{$cond:{if:{$and:[{$gte:["$lastCompletionDate",r]},{$lt:["$lastCompletionDate",n]}]},then:{$add:[{$ifNull:["$streak",0]},1]},else:1}}}:{},lastCompletionDate:new Date,status:f.QuestStatus.COMPLETED}}],{upsert:!1})}}function lr(a){return v.find(a).lean()}const or=async a=>await v.create({...a});async function pr(a){const e=await v.findOne(a).lean();return e||y(await or(a))}function yr(a,e,t){return v.findOneAndUpdate(a,e,{upsert:!0,...t,returnDocument:"after"}).lean()}class fr extends dr{constructor(){super(3600)}normalizeKey({user:e,questId:t}){return`${e.toString()}/${t}`}getKey({user:e,questId:t}){return{user:e,questId:t}}fetchFromDb(e){return pr(e)}fetchManyFromDb(e){return lr(e)}updateInDb(e,t,r){return yr(e,t,r)}}const Se=new fr;class mr extends m{async updateDailyReport(e){const t=await I.get(e),r=await x.get(e),n=await Se.getMany({user:e,status:f.QuestStatus.COMPLETED});await this.update(e,{$set:{xpYesterday:t.xp.amount,berryYesterday:t.berry,previousCompletedQuest:n.map(({questId:i})=>i),"previousOrnament.unlockedBadges":r.unlockedBadges,"previousOrnament.unlockedTitles":r.unlockedTitles,"previousOrnament.unlockedBackgrounds":r.unlockedBackgrounds}})}async getDailyReport(e){const t=await this.get(e),{previousOrnament:r,previousCompletedQuest:n,xpYesterday:i,berryYesterday:u}=t;if(i<=0)return;const l=await I.get(e),c=await Se.getMany({user:e,status:f.QuestStatus.COMPLETED}),b=await x.get(e),{berry:F,xp:D}=l,{voice:ce,amount:gs}=D,{unlockedBadges:bs,unlockedBackgrounds:$s,unlockedTitles:Es}=b;return{berry:F-u,xp:gs-i,voice:o.sameDay(ce.lastConnection,o.yesterday())?ce.minutesInVoiceToday:0,quest:o.exclude(c.map(({questId:Us})=>Us),n),badge:o.exclude(bs,r.unlockedBadges),title:o.exclude(Es,r.unlockedTitles),background:o.exclude($s,r.unlockedBackgrounds)}}async getAllDailyReportsToSend(){const e=await ze.getMany({"settings.sendDailyReport":!0,faction:{$ne:"citizen"}});return await Promise.all(e.map(async({_id:t,discordId:r})=>({...await this.getDailyReport(t),user:t,discordId:r})))}}const hr=a=>W.create({user:a});async function wr(a){const e=await W.findOne({user:a}).lean();return e||y(await hr(a))}const Sr=(a,e)=>W.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class gr extends mr{constructor(){super(60)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return wr(e)}updateInDb(e,t){return Sr(e,t)}}const br=new gr;class $r extends m{async setGuessGame(e,t,r,n){await this.update(e,{$set:{guess:{amount:t,tries:r,numberToGuess:n,lastGuess:0}}})}async resetGuessGame(e){await this.update(e,{$set:{guess:null}})}async updateGuessGame(e){await this.update(e,{$inc:{"guess.tries":1},$set:{"guess.lastGuess":Date.now()}})}}const Er=async a=>await Y.create({user:a});async function Ur(a){const e=await Y.findOne({user:a}).lean();return e||y(await Er(a))}const Ir=(a,e)=>Y.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Tr extends $r{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Ur(e)}updateInDb(e,t){return Ir(e,t)}}const Or=new Tr;class Dr extends m{async hasUnlockedRaid(e,t){return(await this.get(e)).unlocked?.[t]}async alreadyObtainedRaidReward(e,t,r){const n=await this.get(e);return t in n.obtainedRewards?n.obtainedRewards[t].includes(r):!1}async getObtainedRaidReward(e,t){return(await this.get(e)).obtainedRewards[t]??[]}async fulfillCondition(e,t,r,n){const i=await this.get(e);return n==="include"?r.every(u=>(i.obtainedConditions[t]??[]).includes(u)):r.every(u=>!(i.obtainedConditions[t]??[]).includes(u))}async unlockRaid(e,t){await this.update(e,{$set:{[`unlocked.${t}`]:!0}})}async startRaid(e,t,r,n,i){const u=Date.now();return await this.update(e,{$set:{currentRaid:{raidId:t,buffItem:r,seed:u,progression:[],rewards:{}}}}),await Qe.startRaidCooldown(e,n,i),u}async resetRaid(e){await this.update(e,{$unset:{currentRaid:""}})}async resetRaidProgression(e){await this.update(e,{$set:{"currentRaid.progression":[]}})}async progressRaid(e,t){await this.update(e,{$push:{"currentRaid.progression":t}})}async claimReward(e,t,r){await this.update(e,{$addToSet:{[`obtainedRewards.${t}`]:r}})}async addRewardsToRaid(e,t){await this.update(e,{$inc:Object.fromEntries(o.recordToArray(t).filter(([r])=>r!=="title"&&r!=="condition").map(([r,n])=>[`currentRaid.rewards.${r}`,n])),...t.title?{$set:{"currentRaid.rewards.title":t.title}}:{}})}async updateCondition(e,t,r){await this.update(e,{$addToSet:{[`obtainedConditions.${t}`]:r}})}}const vr=a=>L.create({user:a}),Cr=async a=>{const e=await L.findOne({user:a}).lean();return e||y(await vr(a))},Rr=(a,e)=>L.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"});class Mr extends Dr{constructor(){super(3600)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Cr(e)}updateInDb(e,t){return Rr(e,t)}}const Ar=new Mr;class _r extends m{async isBuyLimitReached(e,t,r){const n=await p.getAllEntitiesLimit();if(await p.isEntityId(t,p.isEquipment))return!1;const i=await this.get(e),u=i.limit?.[t];let l=n[t];const c=await g.hasRevolutionaryBuff(e);return i.lastShopId!==r?!1:(c==="half"&&t==="chest_2"&&(l+=2),c==="full"&&t==="chest_3"&&(l+=1),!!(l&&u&&u>=l))}async getShopItemRest(e,t,r,n=f.SHOP_DEFAULT_AVAILABLE_ENTITY_AMOUNT){const i=await p.getAllEntitiesLimit();if(await p.isEntityId(t,p.isEquipment))return n;let u=i[t];const l=await this.get(e),c=l.limit?.[t],b=await g.hasRevolutionaryBuff(e);return b==="half"&&t==="chest_2"&&(u+=2),b==="full"&&t==="chest_3"&&(u+=1),u?l.lastShopId!==r?u:c?u-c:Math.min(u,n):n}async increaseBuyLimit(e,t,r,n){await this.update(e,[{$set:{limit:{$cond:{if:{$eq:["$lastShopId",t]},then:{$setField:{field:r,input:{$ifNull:["$limit",{}]},value:{$add:[{$ifNull:[`$limit.${r}`,0]},n]}}},else:{[r]:n}}},lastShopId:t}}])}}const Br=async a=>await J.create({user:a}),qr=async a=>{const e=await J.findOne({user:a}).lean();return e||y(await Br(a))},kr=(a,e)=>J.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Nr extends _r{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return qr(e)}updateInDb(e,t){return kr(e,t)}}const xr=new Nr;class Fr extends m{async didSevenDoubleAtDoQ(e){await this.update(e,{$inc:{"doubleOrQuit.sevenDoubleInARowCount":1}})}async winWithBlackjack(e){await this.update(e,{$inc:{"blackJack.blackJackCount":1}})}async updateLastGames(e,t,r){await this.update(e,{$push:{lastGames:{$each:[{gameType:t,endState:r}],$position:0,$slice:20}}})}async drawIncrement(e){await this.update(e,{$inc:{drawCount:1}})}async bet666(e){const t=o.yesterday();t.setHours(0,0,0,0);const r=new Date;r.setHours(0,0,0,0),await M.updateOne({user:e,"bet666.last":{$gte:t,$lt:r}},{$inc:{"bet666.count":1},$set:{"bet666.last":new Date}}),await M.updateOne({user:e,"bet666.last":{$lt:t}},{$set:{"bet666.last":new Date,"bet666.count":1}}),this.invalidate(e)}async updateTotalBet(e,t){await this.update(e,{$inc:{totalBet:t}})}async updateRps(e,t){await this.update(e,[{$set:{"rps.count":{$cond:{if:{$eq:["$rps.lastRpsPlayed",t]},then:{$add:["$rps.count",1]},else:1}},"rps.lastRpsPlayed":t}}])}async hasGuessInOneTry(e){await this.update(e,{$inc:{"priceIsRight.guessInOneTryCount":1}})}async diceDoubleSix(e){await this.update(e,{$inc:{"dice.doubleSixCount":1}})}async diceDrawDoubleSix(e){await this.update(e,{$inc:{"dice.drawWithDoubleSixCount":1}})}}const jr=async a=>await M.create({user:a});async function Pr(a){const e=await M.findOne({user:a}).lean();return e||y(await jr(a))}const zr=(a,e)=>M.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Kr extends Fr{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Pr(e)}updateInDb(e,t){return zr(e,t)}}const Qr=new Kr;class Hr extends m{async increaseXpGiven(e,t){await this.update(e,{$inc:{xpGivenToCrew:t}})}async increaseBerryGiven(e,t){await this.update(e,{$inc:{berryGivenToCrew:t}})}async updateCrew10Percent(e,t){t?await this.update(e,{$set:{timeCrewBeyond10PercentXp:0}}):await this.update(e,{$inc:{timeCrewBeyond10PercentXp:1}})}async updateCrew90Percent(e,t){t?await this.update(e,{$set:{timeCrewAbove90PercentXp:0}}):await this.update(e,{$inc:{timeCrewAbove90PercentXp:1}})}}const Wr=async a=>await Z.create({user:a});async function Gr(a){const e=await Z.findOne({user:a}).lean();return e||y(await Wr(a))}const Yr=(a,e)=>Z.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Xr extends Hr{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Gr(e)}updateInDb(e,t){return Yr(e,t)}}const Vr=new Xr;class Lr extends m{async workIncrement(e){await this.update(e,{$inc:{workCount:1}})}async updateTotalSpentInShop(e,t){await this.update(e,{$inc:{totalSpentInShop:t}})}}const Jr=a=>ee.create({user:a});async function Zr(a){const e=await ee.findOne({user:a}).lean();return e||y(await Jr(a))}const en=(a,e)=>ee.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class tn extends Lr{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Zr(e)}updateInDb(e,t){return en(e,t)}}const He=new tn;class an extends m{async randomMessageIncrement(e){await this.update(e,{$inc:{randomMessageClaimed:1}})}async addWrittenTextChannel(e,t){await this.update(e,{$addToSet:{writeDifferentChatIds:t}})}async incrementMessageSend(e){await this.update(e,{$inc:{messageSent:1}})}async addTotalMinutesInVoice(e,t){await this.update(e,{$inc:{totalMinutesInVoice:t}})}}const rn=async a=>await te.create({user:a});async function nn(a){const e=await te.findOne({user:a}).lean();return e||y(await rn(a))}const sn=(a,e)=>te.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class un extends an{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return nn(e)}updateInDb(e,t){return sn(e,t)}}const cn=new un;class dn extends m{async hasReportedSomeone(e){await this.update(e,{$set:{reportedSomeone:!0}})}async botPingIncrement(e){await this.update(e,{$inc:{botPingCount:1}})}async hasCelebrateBirthday(e){await this.update(e,{$set:{hasCelebrateBirthday:!0}})}async hasTagEveryone(e){await this.update(e,{$set:{tagEveryone:!0}})}async hasBetMin(e){await this.update(e,{$set:{"gamblingFlags.betMin":!0}})}async hasLoseEverything(e){await this.update(e,{$set:{"gamblingFlags.loseEverything":!0}})}async hasBet10M(e){await this.update(e,{$set:{"gamblingFlags.bet10M":!0}})}async hasWinBet10M(e){await this.update(e,{$set:{"gamblingFlags.winBet10M":!0}})}async hasLose10M(e){await this.update(e,{$set:{"gamblingFlags.lose10M":!0}})}}const ln=async a=>await ae.create({user:a});async function on(a){const e=await ae.findOne({user:a}).lean();return e||y(await ln(a))}const pn=(a,e)=>ae.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class yn extends dn{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return on(e)}updateInDb(e,t){return pn(e,t)}}const fn=new yn;class mn extends m{async readEdito(e){const t=new Date;t.setHours(0,0,0,0),await A.updateOne({user:e,"edito.lastTimeRead":{$gte:t}},{$inc:{"edito.readToday":1},$set:{"edito.lastTimeRead":new Date}}),await A.updateOne({user:e,"edito.lastTimeRead":{$lt:t}},{$set:{"edito.lastTimeRead":new Date,"edito.readToday":1}}),this.invalidate(e)}}const hn=async a=>await A.create({user:a});async function wn(a){const e=await A.findOne({user:a}).lean();return e||y(await hn(a))}const Sn=(a,e)=>A.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class gn extends mn{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return wn(e)}updateInDb(e,t){return Sn(e,t)}}const bn=new gn;class $n extends m{async updateCraftStats(e,t,r){const n=await p.get(r);!n||!p.isItem(n)||await this.update(e,{$inc:{"crafts.cookedMeal":p.isCookedMeal(n)?t:0,"crafts.scrolls":p.isScrollItem(n)?t:0,"crafts.totalCrafted":t}})}async incrementAlcoholDrink(e,t,r){["wine","beer","rhum"].includes(t)&&await this.update(e,{$inc:{"alcohols.wines":t==="wine"?r:0,"alcohols.beers":t==="beer"?r:0,"alcohols.rhums":t==="rhum"?r:0,"alcohols.totalConsumed":r}})}async incrementBottleUsedToday(e,t){const r=new Date;r.setHours(0,0,0,0),await _.updateOne({user:e,"bottle.lastUsed":{$gte:r}},{$inc:{"bottle.usedToday":t},$set:{"bottle.lastUsed":new Date}}),await _.updateOne({user:e,"bottle.lastUsed":{$lt:r}},{$set:{"bottle.lastUsed":new Date,"bottle.usedToday":t}}),this.invalidate(e)}async incrementBottleUsedTotal(e,t){await this.update(e,{$inc:{"bottle.totalUsed":t}})}async incrementChestOpenedTotal(e,t){await this.update(e,{$inc:{"chest.totalOpened":t}})}}const En=async a=>await _.create({user:a});async function Un(a){const e=await _.findOne({user:a}).lean();return e||y(await En(a))}const In=(a,e)=>_.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Tn extends $n{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Un(e)}updateInDb(e,t){return In(e,t)}}const On=new Tn,Dn=new s.Schema({bannedUserId:{type:String,index:!0,required:!0},authorId:{type:String,required:!0},unbannedTimestamp:{type:Date,index:1},reason:{type:String,required:!0},guildId:{type:String,required:!0}}),se=s.models?.Bans||s.model("Bans",Dn),vn=(a,e)=>se.deleteOne({bannedUserId:a,guildId:e});class Cn extends ${async getUnbanUsers(){return this.getMany({unbannedTimestamp:{$lte:new Date,$ne:null}})}async banUserFromGuild({bannedUserId:e,guildId:t,...r}){await this.update({bannedUserId:e,guildId:t},{...r})}async isBannedFromGuild(e,t){const r=await this.get({bannedUserId:e,guildId:t});return!!(r&&(!r.unbannedTimestamp||r.unbannedTimestamp>new Date))}async deleteBan(e,t){await vn(e,t),this.invalidate({bannedUserId:e,guildId:t})}}const Rn=a=>se.find(a).lean(),Mn=a=>se.findOne(a).lean(),An=(a,e)=>se.findOneAndUpdate(a,e,{returnDocument:"after",upsert:!0}).lean();class _n extends Cn{constructor(){super(3600*36)}normalizeKey(e){return`${e.guildId}/${e.bannedUserId}`}getKey({bannedUserId:e,guildId:t}){return{bannedUserId:e,guildId:t}}fetchFromDb(e){return Mn(e)}fetchManyFromDb(e){return Rn(e)}updateInDb(e,t){return An(e,t)}}const Bn=new _n,qn=new s.Schema({senderId:{type:s.Schema.Types.ObjectId,required:!0,ref:"User"},receiverId:{type:s.Schema.Types.ObjectId,required:!0,index:!0,ref:"User"},amount:Number,gameMode:String,meta:{rps:{type:String,default:void 0}}}),ie=s.models?.Invitation||s.model("Invitation",qn),kn=a=>ie.create({...a}),Nn=async a=>{await ie.deleteMany({...a})};class xn extends m{async sendInvitation({senderId:e,receiverId:t,gameMode:r,...n}){return await this.get({senderId:e,gameMode:r,receiverId:t})?!1:(await kn({...n,senderId:e,gameMode:r,receiverId:t}),!0)}async receiveInvitation(e){return this.get(e)}async deleteInvitation(e){await Nn(e),this.invalidate(e)}}const Fn=a=>ie.findOne({...a}).lean(),jn=(a,e)=>ie.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class Pn extends xn{constructor(){super(3600)}normalizeKey(e){return`${e.gameMode}/${e.receiverId}/${e.senderId}`}getKey({receiverId:e,gameMode:t,senderId:r}){return{gameMode:t,receiverId:e,senderId:r}}fetchFromDb(e){return Fn(e)}updateInDb(e,t){return jn(e,t)}}const zn=new Pn;class Kn extends m{async setEditoChannel(e,t){await this.update({guildId:e},{$set:{"edito.channelId":t}})}async randomizeEditoPrice(e){const t=o.randomBetween(100,1001);return await this.update({guildId:e},{$set:{"edito.price":t}}),t}async setEditoMessageId(e,t){await this.update({guildId:e},{$set:{"edito.messageId":t}})}async setRankingChannel(e,t){await this.update({guildId:e},{$set:{"ranking.channelId":t}})}async setRankingMessage(e,t){await this.update({guildId:e},{$set:{"ranking.messageId":t}})}async setCrewInfoChannelId(e,t){await this.update({guildId:e},{$set:{"crew.infoChannelId":t}})}async addCrewChannelId(e,t,r){await this.update({guildId:e},{$push:{"crew.crewChannelIds":{channelId:r,crewId:t}}})}async updateRolesId(e,t){await this.update({guildId:e},{$set:Object.fromEntries(Object.entries(t).map(([r,n])=>[`roles.${r}`,n]))})}async updateChannelId(e,t){await this.update({guildId:e},{$set:Object.fromEntries(Object.entries(t).map(([r,n])=>[`channels.${r}`,n]))})}}const Qn=new s.Schema({guildId:{type:String,required:!0,unique:!0},ranking:{channelId:{type:String,default:null},messageId:{type:String,default:null}},roles:{premium:{type:String,default:null},booster:{type:String,default:null},scam:{type:String,default:null}},channels:{gambling:{type:String,default:null},work:{type:String,default:null},raid:{type:String,default:null},suggestion:{type:String,default:null},report:{type:String,default:null},reportModerator:{type:String,default:null},faction:{type:String,default:null},discussion:{type:String,default:null},questFallback:{type:String,default:null},reportBug:{type:String,default:null},shop:{type:String,default:null}},edito:{channelId:{type:String,default:null},price:{type:Number,default:100},messageId:{type:String,default:null}},crew:{infoChannelId:{type:String,default:null},crewChannelIds:{type:[{channelId:{type:String},crewId:{type:String}}],default:[]}},shopChannelId:{type:String,default:null}}),ge=s.models?.Settings||s.model("Settings",Qn),Hn=a=>ge.create({guildId:a}),Wn=async a=>{const e=await ge.findOne({guildId:a}).lean();return e||y(await Hn(a))},Gn=(a,e)=>ge.findOneAndUpdate(a,e,{upsert:!0,returnDocument:"after"}).lean();class Yn extends Kn{constructor(){super(3600*24*30)}normalizeKey(e){return e}getKey({guildId:e}){return e}fetchFromDb(e){return Wn(e)}updateInDb(e,t){return Gn(e,t)}}const Xn=new Yn,Vn=new s.Schema({shopType:{type:String,required:!0,unique:!0},publishedAt:{type:Date,default:new Date},duration:{type:Number,default:null},closeAt:{type:Date,default:null},items:{type:[{_id:!1,type:{price:Number,size:{type:Number,default:null},id:String,currency:String}}],default:[]},stats:{berrySpent:{type:Number,default:0},itemBought:{type:Number,default:0},chestBought:{type:Number,default:0},boostTimeBought:{type:Number,default:0},percentBought:{type:Number,default:0}}},{minimize:!1}),ue=s.models?.Shop||s.model("Shop",Vn),Ln=a=>ue.create({shopType:a}),We=async a=>{const e=await ue.findOne({shopType:a}).lean();return e||y(await Ln(a))};class T{toDBShopItem(){return{price:this.price,size:this.size,id:"entityId"in this.data?this.data.entityId:this.data.ornamentId,currency:this.currency}}async onBuy(e,t){this.currency==="berry"?(await I.updateUserBerry(e,-1*this.price*t,!1),await He.updateTotalSpentInShop(e,this.price*t)):await g.removeItem(e,this.currency,this.price*t)}isBackground(){return!1}isChest(){return!1}isTitle(){return!1}isBoostXp(){return!1}isRepair(){return!1}isStore(){return!1}isObject(){return!1}isBottle(){return!1}isEquipment(){return!1}}class Jn extends T{price;size;currency;data;constructor({price:e,item:t,size:r,currency:n}){super(),this.data=t,this.price=e,this.size=r,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await x.unlockBackground(e,this.data.ornamentId)}isBackground(){return!0}}class Zn extends T{price;size;currency;data;constructor({price:e,item:t,size:r,currency:n}){super(),this.data=t,this.price=e,this.size=r,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await g.addItem(e,this.data.entityId,t)}isBoostXp(){return!0}}class es extends T{price;size;currency;data;constructor({price:e,item:t,size:r,currency:n}){super(),this.data=t,this.price=e,this.size=r,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await g.addItem(e,this.data.entityId,t)}isChest(){return!0}}class ts extends T{price;size;currency;data;constructor({price:e,item:t,size:r,currency:n}){super(),this.data=t,this.price=e,this.size=r,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await g.addItem(e,this.data.entityId,t)}isObject(){return!0}}class as extends T{price;size;currency;data;constructor({price:e,item:t,size:r,currency:n}){super(),this.data=t,this.price=e,this.size=r,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await g.addEquipments(e,o.range({stop:t}).map(()=>p.seedEquipment({...this.data},Date.now()-Math.round(Math.random()*1e3))).map(r=>({entityId:r.entityId,seed:r.seed})))}isEquipment(){return!0}}class rs extends T{price;size;currency;data;constructor({price:e,item:t,size:r,currency:n}){super(),this.data=t,this.price=e,this.size=r,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await g.addItem(e,this.data.entityId,t)}isBottle(){return!0}}class ns extends T{price;size;currency;data;constructor({price:e,item:t,size:r,currency:n}){super(),this.data=t,this.price=e,this.size=r,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await g.addItem(e,this.data.entityId,t)}isRepair(){return!0}}class ss extends T{price;size;currency;data;constructor({price:e,item:t,size:r,currency:n}){super(),this.data=t,this.price=e,this.size=r,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await g.addItem(e,this.data.entityId,t)}isStore(){return!0}}class is extends T{price;size;currency;data;constructor({price:e,item:t,size:r,currency:n}){super(),this.data=t,this.price=e,this.size=r,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await x.unlockTitle(e,this.data.ornamentId)}isTitle(){return!0}}class us extends m{async getShopItem(e,t){const n=(await this.get(e)).items.find(b=>b.id===t);if(!n)return;const{price:i,size:u,currency:l}=n,c=await p.get(n.id)??await S.get(n.id);if(S.isOrnament(c)&&S.isBackground(c))return new Jn({price:i,item:c,size:u,currency:l});if(S.isOrnament(c)&&S.isTitle(c))return new is({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isChestItem(c))return new es({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isBoostItem(c))return new Zn({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isRepairItem(c))return new ns({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isStoreItem(c))return new ss({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isObjectItem(c))return new ts({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isEquipment(c))return new as({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isBottleItem(c))return new rs({price:i,size:u,item:c,currency:l})}async getShopItemList(e){const t=await this.get(e),r=[];for(const{id:n}of t.items){const i=await this.getShopItem(e,n);i&&r.push(i)}return r}getShopItemId(e){return p.isEntity(e.data)?e.data.entityId:e.data.ornamentId}async updateShopStats(e,t,r){await this.update({shopType:e},{$inc:{"stats.berrySpent":t.price*r,"stats.itemBought":r,"stats.chestBought":t.isChest()?r:0,"stats.percentBought":t.isRepair()?(t.data.effects.find(n=>n.type==="CREW_REPAIR")?.params.amount??0)*r:0,"stats.boostTimeBought":t.isBoostXp()?t.data.ms/(1440*60*1e3):0}})}async buyShopItem(e,t,r,n){const i=t.map(u=>(u.id===this.getShopItemId(r)&&u.size&&(u.size-=n),u));await this.update({shopType:e},{$set:{items:i}})}async publish(e){await this.update({shopType:e},{$set:{publishedAt:new Date}})}async setShopItems(e,t){await this.update({shopType:e},{$set:{items:[...t]}})}}const cs=(a,e)=>ue.findOneAndUpdate(a,e,{upsert:!0,returnDocument:"after"}).lean();class ds extends us{constructor(){super(3600)}normalizeKey(e){return e}getKey({shopType:e}){return e}fetchFromDb(e){return We(e)}updateInDb(e,t){return cs(e,t)}}const ls=new ds,os=new s.Schema({warnedUserId:{type:String,required:!0,index:!0},authorId:String,date:{type:Date,default:Date.now()},reason:{type:String,default:null}}),Ge=s.models?.Warn||s.model("Warn",os),ps=a=>Ge.countDocuments(a);class ys extends ${getUserWarns(e){return this.getMany({warnedUserId:e})}getUserWarnCount(e){return ps({warnedUserId:e})}}const fs=a=>Ge.find(a).lean();class ms extends ys{constructor(){super(300)}normalizeKey(e){return e}getKey({warnedUserId:e,date:t}){return`${e}/${t.getTime()}`}fetchFromDb(){throw new Error("Method not implemented.")}fetchManyFromDb(e){return fs(e)}updateInDb(){throw new Error("Method not implemented.")}}const hs=new ms,ws=a=>{s.connect(a)};class Ss extends s.Types.ObjectId{}d.COOLDOWN_COMMANDS=Gt,d.ObjectId=Ss,d.QUEST_MIDDLEWARE_EVENT_NAME=w,d.RAID_MIDDLEWARE_EVENT_NAME=z,d.banService=Bn,d.connectToServices=ws,d.crewMetaService=oe,d.crewOrnamentsService=yt,d.crewQuestService=bt,d.crewService=Ue,d.crewStatsEngagementService=Ot,d.crewStatsFrequencyService=At,d.emitQuestMiddlewareEvent=h,d.emitRaidMiddlewareEvent=P,d.entityService=p,d.findShop=We,d.invitationService=zn,d.ornamentService=S,d.panoplyService=U,d.registerQuestMiddlewareEvents=Le,d.registerRaidMiddlewareEvents=Je,d.reminderService=k,d.settingsService=Xn,d.shopModel=ue,d.shopService=ls,d.userCooldownService=Qe,d.userCrewService=Ke,d.userDailyReportService=br,d.userEncyclopediaService=ne,d.userGamesService=Or,d.userInventoryService=g,d.userMetaService=I,d.userOrnamentService=x,d.userQuestService=Se,d.userRaidService=Ar,d.userService=ze,d.userSettingsService=we,d.userShopService=xr,d.userStatsCasinoService=Qr,d.userStatsCrewService=Vr,d.userStatsEconomyService=He,d.userStatsEngagementService=cn,d.userStatsFlagsService=fn,d.userStatsFrequencyService=bn,d.userStatsInventoryService=On,d.warnService=hs,Object.defineProperty(d,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(d,s){typeof exports=="object"&&typeof module<"u"?s(exports,require("mongoose"),require("@opfr/utils-lang"),require("node-cache"),require("@opfr/definitions"),require("events")):typeof define=="function"&&define.amd?define(["exports","mongoose","@opfr/utils-lang","node-cache","@opfr/definitions","events"],s):(d=typeof globalThis<"u"?globalThis:d||self,s(d.services={},d.mongoose,d["@opfr/utils-lang"],d["node-cache"],d["@opfr/definitions"],d.events))})(this,(function(d,s,o,Ve,f,Xe){"use strict";function Le(r){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(r){for(const t in r)if(t!=="default"){const a=Object.getOwnPropertyDescriptor(r,t);Object.defineProperty(e,t,a.get?a:{enumerable:!0,get:()=>r[t]})}}return e.default=r,Object.freeze(e)}const le=Le(Xe),j="___ALL_ENTITIES___";class m{cache;constructor(e){this.cache=new Ve({stdTTL:e,checkperiod:e*.2,useClones:!1})}async get(e){const t=this.normalizeKey(e),a=this.cache.get(t);if(a)return a;const n=await this.fetchFromDb(e);return n&&this.cache.set(t,n),n}async update(e,t,a){const n=await this.updateInDb(e,t,a);if(n){const i=this.getKey(n);this.cache.del(j),this.cache.set(this.normalizeKey(i),n)}return n}invalidate(e){this.cache.del(j),e&&this.cache.del(this.normalizeKey(e))}clearAll(){this.cache.flushAll()}}class b extends m{async getAll(){const e=this.cache.get(j);if(e)return e;const t=await this.fetchManyFromDb({});return this.cache.set(j,t),t.forEach(a=>{this.cache.set(this.normalizeKey(this.getKey(a)),a)}),t}async getMany(e){const t=await this.fetchManyFromDb(e);return t.forEach(a=>{this.cache.set(this.normalizeKey(this.getKey(a)),a)}),t}}const $e=new le.EventEmitter,h=(r,e,t)=>{$e.emit(r,e,t)},Je=r=>{for(const[e,t]of Object.entries(r))$e.on(e,(a,n)=>{t(a,n)})},w={CREW:"middleware/quest/CREW",CREW_META:"middleware/quest/CREW_META",CREW_ORNAMENTS:"middleware/quest/CREW_ORNAMENTS",CREW_QUEST:"middleware/quest/CREW_QUEST",CREW_STATS_ENGAGEMENT:"middleware/quest/CREW_STATS_ENGAGEMENT",CREW_STATS_FREQUENCY:"middleware/quest/CREW_STATS_FREQUENCY",USER:"middleware/quest/USER",USER_CREW:"middleware/quest/USER_CREW",USER_INVENTORY:"middleware/quest/USER_INVENTORY",USER_META:"middleware/quest/USER_META",USER_ORNAMENT:"middleware/quest/USER_ORNAMENT",USER_QUEST:"middleware/quest/USER_QUEST",USER_STATS_CASINO:"middleware/quest/USER_STATS_CASINO",USER_STATS_CREW:"middleware/quest/USER_STATS_CREW",USER_STATS_ECONOMY:"middleware/quest/USER_STATS_ECONOMY",USER_STATS_ENGAGEMENT:"middleware/quest/USER_STATS_ENGAGEMENT",USER_STATS_FLAGS:"middleware/quest/USER_STATS_FLAGS",USER_STATS_FREQUENCY:"middleware/quest/USER_STATS_FREQUENCY",USER_STATS_INVENTORY:"middleware/quest/USER_STATS_INVENTORY"},Ee=new le.EventEmitter,z=(r,e,t)=>{Ee.emit(r,e,t)},Ze=r=>{for(const[e,t]of Object.entries(r))Ee.on(e,(a,n)=>{t(a,n)})},P={USER_INVENTORY:"middleware/raid/USER_INVENTORY",USER_QUEST:"middleware/raid/USER_QUEST",USER_RAID:"middleware/raid/USER_RAID"},Ie=new s.Schema({createdBy:s.Schema.Types.ObjectId,name:String,description:String,channelId:String,memberLimit:{type:Number,default:f.CREW_DEFAULT_MEMBER_LIMIT},disintegration:{type:Number,default:f.CREW_DEFAULT_DISINTEGRATION},faction:String},{timestamps:!0,minimize:!1});Ie.post("findOneAndUpdate",async function(r){h(w.CREW,r._id,r)});const K=s.models?.Crew||s.model("Crew",Ie);class et extends m{async getCrewRank(e){return(await K.aggregate([{$lookup:{from:"crewmetas",localField:"_id",foreignField:"crew",as:"meta"}},{$unwind:"$meta"},{$setWindowFields:{sortBy:{"meta.xp":-1},output:{rank:{$rank:{}}}}},{$match:{_id:e}},{$project:{_id:1,rank:1}}]))[0]}getCrewRanking(){return K.aggregate([{$lookup:{from:"crewmetas",localField:"_id",foreignField:"crew",as:"meta"}},{$unwind:"$meta"},{$sort:{"meta.xp":-1}},{$limit:10},{$project:{_id:1,"meta.xp":1}}])}async increaseLimit(e){await this.update(e,{$inc:{memberLimit:1}})}async repair(e,t){await this.update(e,[{$set:{disintegration:{$min:[{$add:["$disintegration",t]},100]}}}])}async applyDisintegration(e){const t=await this.get(e);if(!t)return;const{memberLimit:a}=t,[n,i]=[a-2,(a-3)*2+3];await this.update(e,[{$set:{disintegration:{$max:[{$add:["$disintegration",-1*o.randomBetween(n,i)]},0]}}}])}}const tt=async r=>{const e=await K.findById(r).lean();return e||null},rt=(r,e)=>K.findOneAndUpdate({_id:r},e,{returnDocument:"after"}).lean();class at extends et{constructor(){super(3600)}normalizeKey(e){return e.toString()}getKey({_id:e}){return e}fetchFromDb(e){return tt(e)}updateInDb(e,t){return rt(e,t)}}const Ue=new at;class nt extends m{async hasXpBuff(e){const t=await this.get(e);if(!o.hasExpire(t.buffs.xp.expireAt))return t.buffs.xp}async calcXp(e,t){const a=await Ue.get(e);return a?Math.ceil(t*(a.disintegration/f.CREW_DEFAULT_DISINTEGRATION)*((await this.hasXpBuff(e))?.boost??1)):0}async addXp(e,t){await this.update(e,{$inc:{xp:t}})}async addBerry(e,t){await this.update(e,{$inc:{berry:t}})}async removeBerry(e,t){await this.update(e,{$inc:{berry:-t}})}async addXpBuff(e,t){const a=new Date;await this.update(e,[{$set:{"buffs.xp":{$cond:{if:{lt:["$buffs.xp.expireAt",a]},then:{boost:1.1,expireAt:{$add:[a,t*60*60*1e3]}},else:{boost:1.1,expireAt:{$add:["$buffs.xp.expireAt",t*60*60*1e3]}}}}}}])}}const y=r=>r.toObject({flattenMaps:!0,flattenObjectIds:!1}),Te=new s.Schema({crew:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"Crew"},xp:{type:Number,default:0,index:-1},berry:{type:Number,default:0,index:-1},buffs:{xp:{boost:{type:Number,default:1.1},expireAt:{type:Date,default:new Date(0)}}}});Te.post("findOneAndUpdate",async function(r){h(w.CREW_META,r.crew._id,r)});const oe=s.models?.CrewMeta||s.model("CrewMeta",Te),st=async r=>await oe.create({crew:r});async function it(r){const e=await oe.findOne({crew:r}).lean();return e||y(await st(r))}const ut=(r,e)=>oe.findOneAndUpdate({crew:r},e,{returnDocument:"after",upsert:!0}).lean();class ct extends nt{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({crew:e}){return e}fetchFromDb(e){return it(e)}updateInDb(e,t){return ut(e,t)}}const pe=new ct;class dt extends m{async unlockBadge(e,t,a){t.isProgressive?await this.update(e,{$addToSet:{unlockedBadges:`${t.id}_${a}`}}):await this.update(e,{$addToSet:{unlockedBadges:t.id}})}}const De=new s.Schema({crew:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"Crew"},unlockedBadges:{type:[String],default:[]}});De.post("findOneAndUpdate",async function(r){h(w.CREW_ORNAMENTS,r.crew._id,r)});const ye=s.models?.CrewOrnaments||s.model("CrewOrnaments",De),lt=r=>ye.create({crew:r});async function ot(r){const e=await ye.findOne({crew:r}).lean();return e||y(await lt(r))}const pt=(r,e)=>ye.findOneAndUpdate({crew:r},e,{upsert:!0,returnDocument:"after"}).lean();class yt extends dt{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({crew:e}){return e}fetchFromDb(e){return ot(e)}updateInDb(e,t){return pt(e,t)}}const ft=new yt;class mt extends b{async getStatus(e,t){return(await this.get({crew:e,questId:t})).status}async isCompleted(e,t){return await this.getStatus(e,t)==="COMPLETED"}async isStreaking(e,t){const{lastCompletionDate:a}=await this.get({crew:e,questId:t});return!!a&&o.sameDay(o.yesterday(),a)}async completeQuest(e){return this.update(e,[{$set:{lastCompletionDate:new Date,status:f.QuestStatus.COMPLETED}}],{upsert:!1})}}const Oe=new s.Schema({crew:{type:s.Schema.Types.ObjectId,required:!0,ref:"Crew",index:!0},questId:{type:String,required:!0,index:!0},status:{type:String,default:f.QuestStatus.IN_PROGRESS,index:!0},lastCompletionDate:Date},{minimize:!1});Oe.post("findOneAndUpdate",function(r){h(w.CREW_QUEST,r.crew._id,r)});const Q=s.models?.CrewQuest||s.model("CrewQuest",Oe);function ht(r){return Q.find(r).lean()}const wt=async r=>await Q.create({...r});async function St(r){const e=await Q.findOne(r).lean();return e||y(await wt(r))}function gt(r,e,t){return Q.findOneAndUpdate(r,e,{upsert:!0,...t,returnDocument:"after"}).lean()}class bt extends mt{constructor(){super(300)}normalizeKey({crew:e,questId:t}){return`${e.toString()}/${t}`}getKey({crew:e,questId:t}){return{crew:e,questId:t}}fetchFromDb(e){return St(e)}fetchManyFromDb(e){return ht(e)}updateInDb(e,t,a){return gt(e,t,a)}}const $t=new bt;class Et extends m{async setActualVoiceMembers(e,t){await this.update(e,{$set:{"currentVoiceState.amount":t,"currentVoiceState.connectedAt":new Date}})}async setMaxVoiceMembers(e,t){await this.update(e,{$set:{maxVoiceMembersReached:t}})}}const ve=new s.Schema({crew:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"Crew"},maxVoiceMembersReached:{type:Number,default:0},currentVoiceState:{amount:{type:Number,default:0},connectedAt:{type:Date,default:new Date(0)}}});ve.post("findOneAndUpdate",function(r){h(w.CREW_STATS_ENGAGEMENT,r.crew._id,r)});const fe=s.models?.CrewStatsEngagement||s.model("CrewStatsEngagement",ve),It=r=>fe.create({crew:r});async function Ut(r){const e=await fe.findOne({crew:r}).lean();return e||y(await It(r))}const Tt=(r,e)=>fe.findOneAndUpdate({crew:r},e,{upsert:!0,returnDocument:"after"}).lean();class Dt extends Et{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({crew:e}){return e}fetchFromDb(e){return Ut(e)}updateInDb(e,t){return Tt(e,t)}}const Ot=new Dt;class vt extends m{}const Ce=new s.Schema({crew:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"Crew"},streak80Percent:{type:Number,default:0}});Ce.post("findOneAndUpdate",function(r){h(w.CREW_STATS_FREQUENCY,r.crew._id,r)});const me=s.models?.CrewStatsFrequency||s.model("CrewStatsFrequency",Ce),Ct=r=>me.create({crew:r});async function Rt(r){const e=await me.findOne({crew:r}).lean();return e||y(await Ct(r))}const Mt=(r,e)=>me.findOneAndUpdate({crew:r},e,{upsert:!0,returnDocument:"after"}).lean();class At extends vt{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({crew:e}){return e}fetchFromDb(e){return Rt(e)}updateInDb(e,t){return Mt(e,t)}}const _t=new At,Re=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,ref:"User",index:!0},questId:{type:String,required:!0,index:!0},status:{type:String,default:f.QuestStatus.IN_PROGRESS,index:1},lastCompletionDate:Date,streak:Number},{minimize:!1});Re.post("findOneAndUpdate",function(r){z(P.USER_QUEST,r.user._id,r),h(w.USER_QUEST,r.user._id,r)});const v=s.models?.UserQuest||s.model("UserQuest",Re),Bt=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},raid:{classic:{type:Date,default:new Date(0)},special:{type:Date,default:new Date(0)}},lockUserCommand:{type:Date,default:new Date(0)},commands:{work:{type:Date,default:new Date(0)},dice:{type:Date,default:new Date(0)},qod:{type:Date,default:new Date(0)},guess:{type:Date,default:new Date(0)},blackjack:{type:Date,default:new Date(0)},rps:{type:Date,default:new Date(0)}}}),H=s.models?.UserCooldown||s.model("UserCooldown",Bt),Me=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},crew:{type:s.Schema.Types.ObjectId,ref:"Crew",required:!0,index:!0},permission:{type:String,default:"member",required:!0},percent:{type:Number,default:f.CREW_DEFAULT_XP_PERCENT}},{minimize:!1});Me.post("findOneAndUpdate",function(r){h(w.USER_CREW,r.user._id,r)});const C=s.models?.UserCrew||s.model("UserCrew",Me),qt=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},xpYesterday:{type:Number,default:0},berryYesterday:{type:Number,default:0},previousOrnament:{unlockedBadges:{type:[String],default:[]},unlockedTitles:{type:[String],default:[]},unlockedBackgrounds:{type:[String],default:[]}},previousCompletedQuest:{type:[String],default:[]},previousMessageSent:{type:Number,default:0}}),W=s.models?.UserDailyReport||s.model("UserDailyReport",qt),kt=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},encyclopedia:{type:[String],default:[]}}),G=s.models?.UserEncyclopedia||s.model("UserEncyclopedia",kt),Nt=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User",index:1},guess:{type:{tries:Number,amount:Number,numberToGuess:Number,lastGuess:Number},default:null}}),Y=s.models?.UserGames||s.model("UserGames",Nt),Ae=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},equippedItems:{type:Object,default:{}},equipmentSave:{type:[Object],default:[]},equipmentList:{type:[{entityId:String,seed:Number}],default:[]},itemList:{type:Map,of:Number,default:{}},recipes:{type:[String],default:[]}},{minimize:!1});Ae.post("findOneAndUpdate",function(r){z(P.USER_INVENTORY,r.user._id,r),h(w.USER_INVENTORY,r.user._id,r)});const V=s.models?.UserInventory||s.model("UserInventory",Ae),xt=new le.EventEmitter,Ft=(r,e)=>{xt.emit(r,e)},R={multiplier:{type:Number,default:0},origin:String,expireAt:{type:Date,default:null},startAt:{type:Date,default:null}},_e=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},premium:{type:Date,default:null},booster:{type:Boolean,default:!1},scam:{type:Boolean,default:!1},berry:{type:Number,default:1e3,index:-1},xp:{lastMessageWithXp:{type:Date,default:new Date},voice:{lastConnection:{type:Date,default:new Date},minutesInVoiceToday:{type:Number,default:0}},amount:{type:Number,default:0,index:-1},boost:{type:Date,default:null}},buffs:{cooldown:{casino:{type:[R],default:[]},work:{type:[R],default:[]}},berry:{work:{type:[R],default:[]},global:{type:[R],default:[]}},drop:{work:{type:[R],default:[]}},xp:{global:{type:[R],default:[]}}},hp:{type:Number,default:100},workUnluckyStreak:{type:Number,default:0},characteristics:{vitality:{type:Number,default:0},strength:{type:Number,default:0},agility:{type:Number,default:0},chance:{type:Number,default:0},intelligence:{type:Number,default:0},wisdom:{type:Number,default:0}},resetCharacteristics:{free:{type:Boolean,default:!0},nextAvailable:{type:Date,default:null}},scrolls:{vitality:{type:Number,default:0},strength:{type:Number,default:0},agility:{type:Number,default:0},chance:{type:Number,default:0},intelligence:{type:Number,default:0},wisdom:{type:Number,default:0}}});_e.post("findOneAndUpdate",async function(r){h(w.USER_META,r.user._id,r),r.hp<=0&&Ft("death",r.user._id)});const D=s.models?.UserMeta||s.model("UserMeta",_e),Be=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},unlockedFactionBadges:{type:[String],default:[]},unlockedBadges:{type:[String],default:[]},unlockedTitles:{type:[String],default:[]},selectedTitle:{type:String,default:null},unlockedBackgrounds:{type:[String],default:["default"]},selectedBackground:{type:String,default:"default"},unlockedProfileAssets:{type:[String],default:[]},unlockedBags:{type:[String],default:["default"]},selectedBag:{type:String,default:"default"}});Be.post("findOneAndUpdate",function(r){h(w.USER_ORNAMENT,r.user._id,r)});const X=s.models?.UserOrnament||s.model("UserOrnament",Be),qe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},currentRaid:{type:{raidId:String,seed:String,progression:{type:[String],default:[]},buffItem:String,rewards:{type:s.Schema.Types.Mixed,default:{}}},default:void 0},obtainedConditions:{type:s.Schema.Types.Mixed,default:{},_id:!1},obtainedRewards:{type:s.Schema.Types.Mixed,default:{},_id:!1},unlocked:{type:s.Schema.Types.Mixed,default:{},_id:!1}},{minimize:!1});qe.post("findOneAndUpdate",function(r){z(P.USER_RAID,r.user._id,r)});const L=s.models?.UserRaid||s.model("UserRaid",qe),jt=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},sort:{inventory:{type:String,default:"alpha"}},sendDailyReport:{type:Boolean,default:!1,index:!0},sendDailyQuest:{type:Boolean,default:!1},reminder:{raid:{classic:{type:Boolean,default:!1},special:{type:Boolean,default:!1}},commands:{work:{type:Boolean,default:!1},dice:{type:Boolean,default:!1},qod:{type:Boolean,default:!1},blackjack:{type:Boolean,default:!1},guess:{type:Boolean,default:!1},rps:{type:Boolean,default:!1}}}}),B=s.models?.UserSettings||s.model("UserSettings",jt),zt=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},lastShopId:s.Schema.Types.ObjectId,limit:{type:s.Schema.Types.Mixed,default:{}}},{minimize:!1}),J=s.models?.UserShop||s.model("UserShop",zt),ke=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},totalBet:{type:Number,default:0},lastGames:{type:[{gameType:String,endState:Number}],default:[]},drawCount:{type:Number,default:0},bet666:{count:{type:Number,default:0},last:{type:Date,default:0}},dice:{doubleSixCount:{type:Number,default:0},drawWithDoubleSixCount:{type:Number,default:0}},blackJack:{blackJackCount:{type:Number,default:0}},rps:{lastRpsPlayed:{type:String,default:"paper"},count:{type:Number,default:-1}},doubleOrQuit:{sevenDoubleInARowCount:{type:Number,default:0}},priceIsRight:{guessInOneTryCount:{type:Number,default:0}}});ke.post("findOneAndUpdate",function(r){h(w.USER_STATS_CASINO,r.user._id,r)});const M=s.models?.UserStatsCasino||s.model("UserStatsCasino",ke),Ne=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},xpGivenToCrew:{type:Number,default:0},berryGivenToCrew:{type:Number,default:0},timeCrewBeyond10PercentXp:{type:Number,default:0},timeCrewAbove90PercentXp:{type:Number,default:0}});Ne.post("findOneAndUpdate",function(r){h(w.USER_STATS_CREW,r.user._id,r)});const Z=s.models?.UserStatsCrew||s.model("UserStatsCrew",Ne),xe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},workCount:{type:Number,default:0},raidFinishedCount:{type:Number,default:0},totalSpentInShop:{type:Number,default:0}});xe.post("findOneAndUpdate",function(r){h(w.USER_STATS_ECONOMY,r.user._id,r)});const ee=s.models?.UserStatsEconomy||s.model("UserStatsEconomy",xe),Fe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},messageSent:{type:Number,default:0},totalMinutesInVoice:{type:Number,default:0},randomMessageClaimed:{type:Number,default:0},writeDifferentChatIds:{type:[String],default:[]}});Fe.post("findOneAndUpdate",function(r){h(w.USER_STATS_ENGAGEMENT,r.user._id,r)});const te=s.models?.UserStatsEngagement||s.model("UserStatsEngagement",Fe),je=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},tagEveryone:{type:Boolean,default:!1},botPingCount:{type:Number,default:0},reportedSomeone:{type:Boolean,default:!1},hasCelebrateBirthday:{type:Boolean,default:!1},gamblingFlags:{betMin:{type:Boolean,default:!1},bet10M:{type:Boolean,default:!1},lose10M:{type:Boolean,default:!1},winBet10M:{type:Boolean,default:!1},loseEverything:{type:Boolean,default:!1}}});je.post("findOneAndUpdate",function(r){h(w.USER_STATS_FLAGS,r.user._id,r)});const re=s.models?.UserStatsFlags||s.model("UserStatsFlags",je),ze=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},edito:{readToday:{type:Number,default:0},lastTimeRead:{type:Date,default:new Date}}});ze.post("findOneAndUpdate",function(r){h(w.USER_STATS_FREQUENCY,r.user._id,r)});const A=s.models?.UserStatsFrequency||s.model("UserStatsFrequency",ze),Pe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},bottle:{totalUsed:{type:Number,default:0},usedToday:{type:Number,default:0},lastUsed:{type:Date,default:new Date}},chest:{totalOpened:{type:Number,default:0}},alcohols:{wines:{type:Number,default:0},rhums:{type:Number,default:0},beers:{type:Number,default:0},totalConsumed:{type:Number,default:0}},crafts:{cookedMeal:{type:Number,default:0},scrolls:{type:Number,default:0},totalCrafted:{type:Number,default:0}}});Pe.post("findOneAndUpdate",function(r){h(w.USER_STATS_INVENTORY,r.user._id,r)});const _=s.models?.UserStatsInventory||s.model("UserStatsInventory",Pe),he=new s.Schema({discordId:{type:String,required:!0,unique:!0},birthday:{type:Date,default:null,index:1},faction:{type:String,default:f.DEFAULT_FACTION,index:1},canChangeFaction:{type:Boolean,default:!1},canChooseFaction:{type:Boolean,default:!1}});he.post("findOneAndUpdate",function(r){h(w.USER,r._id,r)}),he.post("deleteOne",async function(){const r=this.getQuery()._id;await H.deleteOne({user:r}),await C.deleteOne({user:r}),await W.deleteOne({user:r}),await G.deleteOne({user:r}),await Y.deleteOne({user:r}),await V.deleteOne({user:r}),await D.deleteOne({user:r}),await X.deleteOne({user:r}),await v.deleteMany({user:r}),await L.deleteOne({user:r}),await B.deleteOne({user:r}),await J.deleteOne({user:r}),await M.deleteOne({user:r}),await Z.deleteOne({user:r}),await ee.deleteOne({user:r}),await te.deleteOne({user:r}),await re.deleteOne({user:r}),await A.deleteOne({user:r}),await _.deleteOne({user:r})});const E=s.models?.User||s.model("User",he);class Pt extends b{getByObjectId(e){return this.update({_id:e},{})}getNextBirthdays(){const e=new Date,t=e.getFullYear();return E.aggregate([{$match:{birthday:{$ne:null}}},{$set:{birthdayThisYear:{$dateFromParts:{year:t,month:{$month:"$birthday"},day:{$dayOfMonth:"$birthday"}}}}},{$set:{nextBirthday:{$cond:[{$lt:["$birthdayThisYear",e]},{$dateFromParts:{year:{$add:[t,1]},month:{$month:"$birthday"},day:{$dayOfMonth:"$birthday"}}},"$birthdayThisYear"]}}},{$sort:{nextBirthday:1}},{$limit:10},{$project:{_id:0,discordId:1,birthday:1,nextBirthday:1}}])}async getFactionRank(e){const t=await this.get(e);return(await E.aggregate([{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$match:{faction:t.faction}},{$setWindowFields:{sortBy:{"meta.xp.amount":-1},output:{rank:{$rank:{}}}}},{$match:{_id:t._id}},{$project:{_id:0,rank:1}}]))[0]}getFactionRanking(e){return E.aggregate([{$match:{faction:e}},{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$sort:{"meta.xp.amount":-1}},{$limit:10},{$project:{_id:1,discordId:1,"meta.xp.amount":1}}])}getGlobalRanking(){return E.aggregate([{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$sort:{"meta.xp.amount":-1}},{$limit:10},{$project:{_id:1,discordId:1,"meta.xp.amount":1}}])}getBerryRanking(){return E.aggregate([{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$sort:{"meta.berry":-1}},{$limit:10},{$project:{_id:1,discordId:1,"meta.berry":1}}])}getQuestRanking(){return v.aggregate([{$match:{status:f.QuestStatus.COMPLETED}},{$group:{_id:"$user",questCount:{$sum:1}}},{$setWindowFields:{sortBy:{questCount:-1},output:{rank:{$rank:{}}}}},{$project:{_id:0,discordId:"$_id",questCount:1,rank:1}},{$sort:{rank:1}}])}getTodayAllBirthday(){const e=new Date;return E.aggregate([{$match:{birthday:{$ne:null}}},{$addFields:{birthMonth:{$month:"$birthday"},birthDay:{$dayOfMonth:"$birthday"}}},{$addFields:{currentMonth:{$month:e},currentDay:{$dayOfMonth:e}}},{$match:{$expr:{$and:[{$eq:["$birthMonth","$currentMonth"]},{$eq:["$birthDay","$currentDay"]}]}}}])}async canChooseFaction(e,t){typeof e=="string"?await this.update({discordId:e},{$set:{canChooseFaction:t}}):await this.update({_id:e},{$set:{canChooseFaction:t}})}async canChangeFaction(e,t){typeof e=="string"?await this.update({discordId:e},{$set:{canChangeFaction:t}}):await this.update({_id:e},{$set:{canChangeFaction:t}})}async setBirthday(e,t){await this.update({discordId:e},{$set:{birthday:t}})}async updateFaction(e,t){await this.update({discordId:e},{$set:{faction:t}})}}const Kt=r=>E.find(r),Qt=r=>E.create({discordId:r});async function Ht(r){const e=await E.findOne({discordId:r}).lean();return e||y(await Qt(r))}const Wt=(r,e)=>E.findOneAndUpdate(r,e,{upsert:!0,returnDocument:"after"});class Gt extends Pt{constructor(){super(3600)}normalizeKey(e){return e}getKey({discordId:e}){return e}fetchFromDb(e){return Ht(e)}fetchManyFromDb(e){return Kt(e)}updateInDb(e,t){return Wt(e,t)}}const Ke=new Gt,Yt=["work","rps","blackjack","guess","qod","dice"],Vt=new s.Schema({user:{type:s.Schema.Types.ObjectId,ref:"User",required:!0,index:!0},date:{type:Date,index:-1,required:!0},type:{type:String,required:!0}},{minimize:!1}),q=s.models?.Reminder||s.model("Reminder",Vt),Xt=async r=>{await q.deleteMany(r)},Lt=async(r,e)=>{await q.deleteOne({user:r,type:e})};class Jt extends b{getAllPassedReminder(){return this.getMany({date:{$lte:new Date}})}async addReminder(e,t,a){await this.update({user:e,type:t},{$set:{date:a}},{upsert:!0})}async updateReminderDate(e,t,a){await this.update({user:e,type:t},[{$set:{date:{$add:["$date",a]}}}])}async removeReminder(e,t){await Lt(e,t),this.invalidate({user:e,type:t})}async deleteSelectedReminders(e){const t=await this.getMany({_id:{$in:e}});await Xt({_id:{$in:e}}),t.forEach(a=>{this.invalidate({user:a.user,type:a.type})})}}function Zt(r,e={}){return q.find(r,e).lean()}async function er(r){const e=await q.findOne(r).lean();return e||null}async function tr(r,e,t){return q.findOneAndUpdate(r,e,{...t,returnDocument:"after"}).lean()}class rr extends Jt{constructor(){super(300)}getKey(e){return{user:e.user,type:e.type}}normalizeKey({user:e,type:t}){return`${e.toString()}/${t}`}fetchFromDb(e){return er(e)}fetchManyFromDb(e,t){return Zt(e,t)}updateInDb(e,t,a={upsert:!1}){return tr(e,t,a)}}const k=new rr;class ar extends b{async isOrnamentIds(e,t=()=>!0){const n=(await this.getAll()).filter(t).map(({ornamentId:i})=>i);return e.every(i=>n.includes(i))}isOrnament(e){return!!e&&"ornamentId"in e}isTitle(e){return e.type==="title"}isBackground(e){return e.type==="background"}isQuestTitle(e){return this.isTitle(e)&&!("faction"in e)&&!("price"in e)}isFactionTitle(e){return this.isTitle(e)&&"faction"in e}isShopTitle(e){return this.isTitle(e)&&"price"in e}async getAllBackgrounds(){return(await this.getAll()).filter(this.isBackground)}async getAllTitles(){return(await this.getAll()).filter(this.isTitle)}async getAllFactionTitles(){return(await this.getAll()).filter(this.isFactionTitle)}async getAllQuestTitles(){return(await this.getAll()).filter(this.isQuestTitle)}async getAllShopTitles(){return(await this.getAll()).filter(this.isShopTitle)}formatBackgroundId(e){return e.ornamentId==="background_default"?"par défaut":`"${o.capitalizeAllWords(e.ornamentId.split("_").join(" "))}"`}pickOrnament(e){const t=Math.random();let a=0;if(Object.keys(e).map(i=>parseFloat(i)).reduce((i,u)=>i+u,0)!==1)throw RangeError("pickOrnament - Sum of all odds (keys) must be equal to 1");for(const[i,u]of Object.entries(e)){const l=parseFloat(i);if(t>=a+l){a+=l;continue}if(u.length!==0)return u[o.randomBetween(0,u.length)]}throw Error("pickOrnament - All ods array were empty")}pickEachRarityOrnament(e,t){if(t.length!==f.RANK_IDS_WITHOUT_BASIC.length)throw new RangeError("pickEachRarityOrnament - must give same number of odds than ranks");return o.filterNullAndUndefined(t.map((a,n)=>{const i=f.RANK_IDS_WITHOUT_BASIC[n],u=e[i];return Math.random()>a||!u||!u.length?null:o.pickFrom(u)}))}}const nr=new s.Schema({ornamentId:{unique:!0,index:1,required:!0,type:String},type:{required:!0,type:String},rankId:{required:!0,type:String},name:{required:!0,type:String},price:Number,odd:Number,size:Number,faction:String,roleId:String,strength:Number},{minimize:!1}),we=s.models?.Ornaments||s.model("Ornaments",nr),sr=async(r,e={})=>we.find(r,e).lean();async function ir(r){const e=await we.findOne({ornamentId:r}).lean();return e||null}const ur=(r,e)=>we.findOneAndUpdate(r,e,{returnDocument:"after"}).lean();class cr extends ar{constructor(){super(3600)}updateInDb(e,t){return ur(e,t)}fetchFromDb(e){return ir(e)}fetchManyFromDb(e){return sr(e)}getKey(e){return e.ornamentId}normalizeKey(e){return e}}const g=new cr,dr=new s.Schema({panoplyId:{unique:!0,index:1,required:!0,type:String},name:{required:!0,type:String},equipments:{required:!0,type:[{type:s.Schema.Types.ObjectId,ref:"Entities"}]},fullBonusStr:{type:String},halfBonusStr:{type:String},fullBonus:s.Schema.Types.Mixed,halfBonus:s.Schema.Types.Mixed},{minimize:!1}),N=s.models?.Panoplies||s.model("Panoplies",dr),lr=r=>N.find(r).lean(),or=async r=>N.find(r).populate("equipments");async function pr(r){const e=await N.findOne({panoplyId:r}).lean();return e||null}const yr=async r=>N.findOne(r).populate("equipments");class fr extends b{getAllPopulated(){return or({})}getPopulated(e){return yr({panoplyId:e})}hasPanoply(e,t){const a=o.filterNullAndUndefined(Object.values(e)),n=t.equipments.filter(i=>a.find(u=>u.entityId===i.entityId)).length;if(n===t.equipments.length)return t.fullBonus;if(n>=t.equipments.length/2)return t.halfBonus}async getPanoplyBonus(e){const t=[],a=await this.getAllPopulated();for(const n of a){const i=o.filterNullAndUndefined(Object.values(e)),u=n.equipments.filter(l=>i.find(({entityId:c})=>c===l.entityId));u.length===n.equipments.length?t.push([n,"full"]):u.length>=n.equipments.length/2?t.push([n,"half"]):u.length>=1&&t.push([n,null])}return t}}const mr=async(r,e)=>N.findOneAndUpdate(r,e,{returnDocument:"after"}).lean();class hr extends fr{constructor(){super(3600)}normalizeKey(e){return e}getKey({panoplyId:e}){return e}updateInDb(e,t){return mr(e,t)}fetchFromDb(e){return pr(e)}fetchManyFromDb(e={}){return lr(e)}}const I=new hr;class wr extends b{isEntity(e){return!!e&&"entityId"in e}isItem(e){return e.category!=="equipment"}isEquipment(e){return e.category==="equipment"}async isEntityId(e,t=()=>!0){return(await this.getAll()).filter(t).map(({entityId:n})=>n).includes(e)}async getSomeStoreItems(e){const t=(await this.getAll()).filter(this.isStoreItem);return this.getSomeItems(e,t)}async getSomeRepairItems(e){const t=(await this.getAll()).filter(this.isRepairItem);return o.shuffle(t).slice(0,e)}async getSomeObjectItems(e){const t=(await this.getAll()).filter(this.isObjectItem);return o.shuffle(t.filter(a=>!!a.shop?.price)).slice(0,e)}async idArrayToEntities(e){return(await this.getAll()).filter(t=>e.includes(t.entityId))}recordToEntities(e){return this.idArrayToEntities(Object.keys(e))}async recordToEntityTuple(e){const t=await this.getAll();return o.recordToArray(e).reduce((a,[n,i])=>{const u=t.find(({entityId:l})=>l===n);return u&&a.push([u,i]),a},[])}async getAllEntitiesLimit(){const e=await this.getAll();return o.arrayToRecord(e.map(t=>[t.entityId,t.shop?.limit??0]))}async getAllEntitiesBy(e){return(await this.getAll()).filter(e)}async fromDBToEquipableEquipment(e){const a=(await this.getAll()).filter(this.isEquipment).find(({entityId:n})=>n===e.entityId);if(!a)throw new Error(`cannot find any equipment: ${e.entityId}`);return this.seedEquipment(a,e.seed)}async getUserEquipmentsCharacteristics(e){let t={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};const a=await I.getAllPopulated();for(const n of f.EQUIPMENT_SLOT){const i=e[n];i&&(t=o.mergeObjects(t,(await this.fromDBToEquipableEquipment(i)).characteristics,(u,l)=>u+l))}for(const n of a){const i=I.hasPanoply(e,n);i&&!("target"in i)&&(t=o.mergeObjects(t,i,(u,l)=>u+l))}return t}getSomeItems(e,t){const a=[];for(;a.length<e;){const n=o.exclude(t,a,i=>i.entityId);a.push(g.pickOrnament(o.groupBy(n,i=>i.shop?.odd??0)))}return o.sortBy(a,n=>n.shop?.price??0)}filterCraftEntities(e){return e.filter(t=>t.usage?.craft)}filterDismantleEntities(e){return e.filter(t=>t.usage?.dismantle)}filterUsableEntities(e){return e.filter(t=>t.usage?.mode)}filterEnchantableEntities(e){return e.filter(t=>t.usage?.enchant)}hasCraftEntities(e){return!!e.find(t=>t.usage?.craft)}hasDismantleEntities(e){return!!e.find(t=>t.usage?.dismantle)}hasEnchantableEntities(e){return!!e.find(t=>t.usage?.enchant)}hasUsableEntities(e){return!!e.find(t=>t.usage?.mode)}isChestItem(e){return e.type==="chest"}isBottleItem(e){return e.type==="bottle"}isBoostItem(e){return e.type==="boost"}isRepairItem(e){return e.type==="repair"}isStoreItem(e){return e.type==="store"}isObjectItem(e){return e.type==="object"}isScrollItem(e){return e.type==="scroll"}isCookedMeal(e){return e.type==="cookedMeal"}isAlcoholItem(e){return e.type==="alcohol"}isSameEquipment(e,t){return e.entityId===t.entityId&&e.seed===t.seed}getEquipmentSlotType(e){return f.EQUIPMENT_FROM_SLOT_TO_TYPE[e]}seedEquipment(e,t){const a=o.seededRandom(t),n=o.sortBy(o.recordToArray(e.characteristics),([i])=>i);return{...e,seed:t,characteristics:Object.fromEntries(n.map(([i,u])=>[i,Array.isArray(u)?o.randomBetween(u[0],u[1]+1,a):u]))}}isEquipped(e,t){return!!Object.values(e).find(a=>a&&this.isSameEquipment(a,t))}calcILvl(e){return Object.values(e.characteristics).reduce((a,n)=>a+n,0)+e.level}}const Sr=new s.Schema({type:{type:String,enum:f.EFFECT_KEYS,required:!0},params:{type:s.Schema.Types.Mixed}},{_id:!1}),gr=new s.Schema({entityId:{unique:!0,required:!0,type:String},type:{required:!0,type:String},name:{required:!0,_id:!1,type:{key:{required:!0,type:String},context:String}},description:{_id:!1,type:{key:{required:!0,type:String},context:String}},image:{required:!0,type:String},emojis:{required:!0,type:String},category:{required:!0,type:String},effects:{type:[Sr],default:[]},rankId:String,usage:{_id:!1,type:{mode:String,craft:Boolean,enchant:String,dismantle:{type:[{type:{entityId:String,quantity:Number},_id:!1}],default:void 0}},default:void 0},shop:{default:void 0,_id:!1,type:{price:{required:!0,type:Number},limit:Number,size:Number,odd:Number}},bottle:{default:void 0,_id:!1,type:{xp:{type:s.Schema.Types.Union,of:[Number,[Number]],required:!0},buffs:{required:!0,default:[],type:[{target:{type:String,required:!0},multiplier:{type:Number,required:!0},origin:{type:String,required:!0},startIn:{type:Number,default:null},endIn:{type:Number,default:null},_id:!1}]},hp:Number,tier:Number}},ms:Number,characteristics:{_id:!1,type:Object},level:Number,panoply:String},{minimize:!1}),ae=s.models?.Entities||s.model("Entities",gr),br=async r=>await ae.create({...r}),$r=async(r,e={})=>ae.find(r,e).lean();async function Er(r){const e=await ae.findOne({entityId:r}).lean();return e||null}const Ir=(r,e)=>ae.findOneAndUpdate(r,e,{returnDocument:"after"}).lean();class Ur extends wr{constructor(){super(3600)}createInDb(e){return br(e)}updateInDb(e,t){return Ir(e,t)}fetchFromDb(e){return Er(e)}fetchManyFromDb(e){return $r(e)}normalizeKey(e){return e}getKey(e){return e.entityId}}const p=new Ur,Tr=(r,e,t)=>C.create({user:r,crew:e,permission:t}),Dr=async r=>{await C.deleteOne({user:r})};class Or extends b{async updatePercent(e,t){await this.update(e,{$set:{percent:t}})}async updatePermission(e,t){await this.update(e,{$set:{permission:t}})}async addUserToCrew(e,t,a){await Tr(e,t,a),this.invalidate(t)}async removeUserFromCrew(e,t){await Dr(e),this.invalidate(e),this.invalidate(t)}async getAllUserIdsFromCrew(e){const t=e.toString(),a=this.cache.get(t);if(a)return a.map(({user:i})=>i);const n=await this.getMany({crew:e});return this.cache.set(t,n),n.map(({user:i})=>i)}}const vr=r=>C.find(r).lean(),Cr=r=>C.findOne({user:r}).lean(),Rr=(r,e)=>C.findOneAndUpdate({user:r},e,{returnDocument:"after"}).lean();class Mr extends Or{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Cr(e)}fetchManyFromDb(e){return vr(e)}updateInDb(e,t){return Rr(e,t)}}const Qe=new Mr;class Ar extends m{hasAlreadyFoundEntity(e,t){return e.encyclopedia.includes(t)}async addEntities(e,t){await this.update(e,{$addToSet:{encyclopedia:{$each:t}}})}}const _r=async r=>await G.create({user:r});async function Br(r){const e=await G.findOne({user:r}).lean();return e||y(await _r(r))}const qr=(r,e)=>G.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class kr extends Ar{constructor(){super(300)}fetchFromDb(e){return Br(e)}getKey({user:e}){return e}normalizeKey(e){return e.toString()}updateInDb(e,t){return qr(e,t)}}const ne=new kr;class Nr extends m{getPanoplyEffectiveBonus(e,t){const a=o.filterNullAndUndefined(Object.values(e.equippedItems)),n=t.equipments.filter(i=>a.find(u=>u.entityId===i.entityId)).length;if(n===t.equipments.length)return t.fullBonus;if(n>=t.equipments.length/2)return t.halfBonus}async getUserEquipmentsCharacteristics(e){let t={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};const a=await I.getAllPopulated();for(const n of f.EQUIPMENT_SLOT){const i=e.equippedItems?.[n];if(!i)continue;const u=await p.fromDBToEquipableEquipment(i);t=o.mergeObjects(t,u.characteristics,(l,c)=>l+c)}for(const n of a){const i=this.getPanoplyEffectiveBonus(e,n);i&&!("target"in i)&&(t=o.mergeObjects(t,i,(u,l)=>u+l))}return t}async hasInventoryRequirements(e,t){const a=await this.get(e);return o.recordToArray(t).reduce((n,[i,u])=>n&&(a.itemList[i]??0)>=(u??0),!0)}async hasEnoughEntity(e,t,a){return((await this.get(e)).itemList[a]??0)>=t}async getItemList(e){return(await this.get(e)).itemList}async calcBottleMultiplier(e,{bottle:{buffs:t}}){const a=await this.get(e),i=(await I.getPanoplyBonus(a.equippedItems)).find(([u,l])=>u.panoplyId==="herbalist"&&l!==null);return i&&i[1]==="full"?t.map(u=>({...u,multiplier:u.multiplier*1.25})):i&&i[1]==="half"?t.map(u=>({...u,multiplier:u.multiplier*1.1})):t}async calcMinStreakForWorkLoot(e){const t=await this.get(e),a=(await I.getPanoplyBonus(t.equippedItems)).find(([n,i])=>n.panoplyId==="marine"&&i!==null);return a&&a[1]==="full"?10:a&&a[1]==="half"?20:1/0}async hasRevolutionaryBuff(e){const t=await this.get(e);return(await I.getPanoplyBonus(t.equippedItems)).find(([n,i])=>n.panoplyId==="revolutionary"&&i!==null)?.[1]??null}async addItem(e,t,a){await this.update(e,{$inc:{[`itemList.${t}`]:a}}),await ne.addEntities(e,[t])}async addItems(e,t){await this.update(e,{$inc:Object.fromEntries(Object.entries(t).filter(([,a])=>(a??0)>0).map(([a,n])=>[`itemList.${a}`,n]))}),await ne.addEntities(e,o.recordToArray(t).filter(([,a])=>a>0).map(([a])=>a))}async removeItem(e,t,a){a!==0&&await this.update(e,[{$set:{[`itemList.${t}`]:{$max:[{$add:[`$itemList.${t}`,-a]},0]}}}])}async removeEquipment(e,t,a){await this.update(e,{$pull:{equipmentList:{entityId:t,seed:a}}})}async removeAllItem(e,t){await this.update(e,{$set:{[`itemList.${t}`]:0}})}async addEquipments(e,t){await this.update(e,{$push:{equipmentList:{$each:t}}}),await ne.addEntities(e,t.map(a=>a.entityId))}async saveEquipments(e){await this.update(e,[{$set:{equipmentSave:{$push:["$equipmentSave","$equippedItems"]}}}])}async changeEquippedEquipment(e,t){const a=await this.get(e);a?.equipmentSave[t]&&await this.equip(e,a.equipmentSave[t])}async equip(e,t){const a=await U.getMaxHp(e),n=Object.fromEntries(o.recordToArray(t).map(([i,u])=>[`equippedItems.${i}`,u]));await this.update(e,{$set:n}),await U.updateHp(e,a)}async unequip(e,t){const a=await U.getMaxHp(e);await this.update(e,{$set:{[`equippedItems.${t}`]:null}}),await U.updateHp(e,a)}async craftItem(e,t,a,n){for(const{entityId:l,size:c}of t.entities)await this.removeItem(e,l,c*a);const{entityId:i,size:u}=t.result;await p.isEntityId(i,p.isEquipment)?await this.addEquipments(e,[{entityId:i,seed:n}]):await p.isEntityId(i,p.isItem)&&await this.addItem(e,i,u*a)}async dismantleEntity(e,t,a,n,i){p.isEquipment(t)?await this.removeEquipment(e,t.entityId,i):p.isItem(t)&&await this.removeItem(e,t.entityId,n);for(const{entityId:u,quantity:l}of a)await p.isEntityId(u,p.isItem)&&await this.addItem(e,u,n*l);await this.removeItem(e,"tools",1)}async enchantItem(e,t,a,n){await this.removeItem(e,t,n*4),await this.removeItem(e,"enchanted_stone",n),await this.addItem(e,a,n)}async unlockRecipe(e,t){await this.update(e,{$addToSet:{recipes:t}})}}const xr=r=>V.create({user:r});async function Fr(r){const e=await V.findOne({user:r}).lean();return e||y(await xr(r))}const jr=(r,e)=>V.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class zr extends Nr{constructor(){super(300)}fetchFromDb(e){return Fr(e)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}updateInDb(e,t){return jr(e,t)}}const S=new zr;class Pr extends b{getTotalCharacteristics({characteristics:e,scrolls:t}){return o.arrayToRecord(f.CHARACTERISTICS.map(a=>[a,f.getComputedCharacteristicValue(e[a])+t[a]]))}async isCooldownForXpPassed(e){const t=await this.get(e);return Date.now()-t.xp.lastMessageWithXp.getTime()>60*1e3}async getAllWithExpiredBuffs(){const e=new Date;return this.getMany({$or:[{"xp.boost":{$lt:e}},{"buffs.cooldown.casino":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.cooldown.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.berry.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.berry.global":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.drop.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.xp.global":{$elemMatch:{expireAt:{$lt:e}}}}]})}async calcXpBoost(e){const t=await this.get(e),{boost:a}=t.xp,n=a!==null&&Date.now()<a.getTime()?.2:0,i=Math.max(t.premium?.5:0,t.booster?.25:0);return n+i+t.buffs.xp.global.reduce((u,{expireAt:l,startAt:c,multiplier:$})=>c&&c>new Date||l&&o.hasExpire(l)?u:u+$,0)}calcMessageXp(e){const t=e.trim().length,a=2;return t<10?10*a:t>300?300*a:t*a}async getXpDeathPenalties(e){const t=await this.get(e),a=f.getCurrentLevel(t.xp.amount);return a<=10?5e3:a<=20?1e4:a<=30?2e4:a<=40?3e4:a<=50?5e4:a<=60?75e3:a<=70?15e4:a<=80?25e4:a<=90?4e5:a<=100?75e4:14e6}async calcXp(e,t,a){return t*=1+await this.calcXpBoost(e),Math.ceil(t*a)}async calcBerry(e,t,a){if(t<=0)return t;const n=a?1:await this.calcBuffMultiplier(e,"berry","global");return Math.ceil(t*(n||1))}async calcBuffMultiplier(e,t,a){return(await this.get(e)).buffs[t][a].reduce((u,{expireAt:l,startAt:c,multiplier:$})=>u+(new Date>=(c??new Date)&&(!l||!o.hasExpire(l))?$:0),1)}async getMaxHp(e){const t=await this.get(e),a=await S.get(e),{vitality:n}=this.getTotalCharacteristics(t),i=await S.getUserEquipmentsCharacteristics(a);return(n+i.vitality)*f.HP_PER_VITALITY+f.DEFAULT_MAX_HP}async getHpRatio(e){const t=await this.get(e),a=await this.getMaxHp(e);return Math.min(t.hp/a,1)}async hasCharacteristicRequirement(e,t){const a=await this.get(e),n=await S.get(e),i=await S.getUserEquipmentsCharacteristics(n),u=o.mergeObjects(this.getTotalCharacteristics(a),i,(l,c)=>l+c);if("sum"in t){let l=0;for(const c of t.characteristics)l+=u[c]??0;return l>=t.sum}else{for(const l of Object.keys(t))if(u[l]<(t[l]??0))return!1;return!0}}async getGlobalRank(e){return(await D.aggregate([{$setWindowFields:{sortBy:{"xp.amount":-1},output:{rank:{$rank:{}}}}},{$match:{user:e}},{$project:{rank:1}}]))[0]}async getBerryRank(e){return(await D.aggregate([{$setWindowFields:{sortBy:{berry:-1},output:{rank:{$rank:{}}}}},{$match:{user:e}},{$project:{rank:1}}]))[0]}async hasMalusBuff(e){const t=await this.get(e),a=[...t.buffs.xp.global,...t.buffs.berry.global,...t.buffs.berry.work,...t.buffs.cooldown.work,...t.buffs.cooldown.casino,...t.buffs.drop.work];for(const{multiplier:n,startAt:i,expireAt:u}of a)if(n<0&&(!u||!o.hasExpire(u))&&(i??new Date)<=new Date)return!0;return!1}async addBerry(e,t){await this.update(e,[{$set:{berry:{$max:[{$add:["$berry",t]},0]}}}])}async addXp(e,t){await this.update(e,{$inc:{"xp.amount":t}})}async updatePremium(e,t){await this.update(e,{$set:{premium:t}})}async updateBooster(e,t){await this.update(e,{$set:{booster:t}})}async updateBoost(e,t){const{xp:{boost:a}}=await this.update(e,[{$set:{"xp.boost":{$cond:{if:{$or:[{$not:"$xp.boost"},{$lt:["$xp.boost",new Date]}]},then:{$add:[new Date,t]},else:{$add:["$xp.boost",t]}}}}}]);return a}async updateBuff(e,t){if(Array.isArray(t)){for(const n of t)await this.updateBuff(e,n);return}const a=f.transformToDBBuff(t);await this.update(e,[{$set:{[`buffs.${t.target}`]:{$map:{input:`$buffs.${t.target}`,as:"buff",in:{$cond:{if:{$eq:[{$substr:["$$buff.origin",0,{$indexOfBytes:["$$buff.origin","/"]}]},t.origin.split("/")[0]]},then:{multiplier:t.multiplier,origin:t.origin,expireAt:a.expireAt?{$cond:{if:{$lt:["$$buff.expireAt",new Date]},then:a.expireAt,else:{$add:["$$buff.expireAt",(t.endIn??0)*60*60*1e3]}}}:null,startAt:{$cond:{if:{$gte:["$$buff.startAt",new Date]},then:"$$buff.startAt",else:{$add:[new Date,(t.startIn??0)*60*60*1e3]}}}},else:"$$buff"}}}}}},{$set:{[`buffs.${t.target}`]:{$cond:{if:{$in:[t.origin.split("/")[0],{$map:{input:`$buffs.${t.target}`,as:"buff",in:{$substr:["$$buff.origin",0,{$indexOfBytes:["$$buff.origin","/"]}]}}}]},then:`$buffs.${t.target}`,else:{$concatArrays:[`$buffs.${t.target}`,[{...a}]]}}}}}])}async removeBuff(e,t){await this.update(e,{$pull:{[`buffs.${t.target}`]:{origin:t.origin}}})}async updatePanoplyBuff(e,t,a,n){const i=await p.fromDBToEquipableEquipment(t),u=o.filterNullAndUndefined(Object.values(a)),c=(await I.getAllPopulated()).find(O=>O.panoplyId===i.panoply);if(!c)return;const $=c.equipments.filter(O=>(u.find(de=>O.entityId===de.entityId)||!n&&i.entityId===O.entityId)&&(n?i.entityId!==O.entityId:!0)).length,F=$===c.equipments.length?c.fullBonus:$>=c.equipments.length/2?c.halfBonus:void 0;c.halfBonus&&"target"in c.halfBonus&&await this.removeBuff(e,c.halfBonus),c.fullBonus&&"target"in c.fullBonus&&await this.removeBuff(e,c.fullBonus),F&&"target"in F&&await this.updateBuff(e,F)}async gainHp(e,t){const a=await this.get(e),i=await this.getMaxHp(e)-a.hp;await this.update(e,{$set:{hp:a.hp+Math.floor(Math.min(t,i))}})}async loseHp(e,t){await this.update(e,[{$set:{hp:{$max:[{$add:["$hp",-t]},0]}}}])}async updateHp(e,t){const a=await this.getMaxHp(e);await this.update(e,[{$set:{hp:{$round:[{$multiply:[{$divide:["$hp",t]},a]},0]}}}])}async addCharacteristics(e,t){const a=await this.getMaxHp(e),n=Object.fromEntries(Object.entries(t).filter(([,i])=>i!==0).map(([i,u])=>[`characteristics.${i}`,u]));await this.update(e,{$inc:n}),await this.updateHp(e,a)}async addScrollCharacteristic(e,t){const a=await this.getMaxHp(e),n=Object.fromEntries(Object.entries(t).filter(([,i])=>i!==0).map(([i,u])=>[`scrolls.${i}`,u]));await this.update(e,{$inc:n}),await this.updateHp(e,a)}async resetCharacteristics(e,t){const a=await this.getMaxHp(e),n={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};t?await this.update(e,{$set:{characteristics:n,"resetCharacteristics.free":!1}}):await this.update(e,{$set:{characteristics:n,"resetCharacteristics.nextAvailable":new Date(Date.now()+720*60*60*1e3)},$inc:{berry:-1e8}}),await this.updateHp(e,a)}async resetMinutesInVoiceToday(e){await this.update(e,{$set:{"xp.voice.minutesInVoiceToday":0}})}async addMinutesInVoiceToday(e,t){await this.update(e,{$inc:{"xp.voice.minutesInVoiceToday":t}})}async updateLastVoiceConnection(e,t){await this.update(e,{$set:{"xp.voice.lastConnection":t}})}async incrementWorkUnluckyStreak(e){await this.update(e,{$inc:{workUnluckyStreak:1}})}async resetWorkUnluckyStreak(e){await this.update(e,{$set:{workUnluckyStreak:0}})}async updateScam(e,t){await this.update(e,{$set:{scam:t}})}async updateUserXp(e,t){const a=await Qe.get(e),n=a?.percent??0,i=await this.calcXp(e,t,(1-n)*await this.getHpRatio(e));let u=0;return await this.addXp(e,i),a&&(u=await pe.calcXp(a.crew,t*n),await pe.addXp(a.crew,u)),{userXp:i,crewXp:u}}async updateUserBerry(e,t,a){const n=await this.calcBerry(e,t,a);return await this.addBerry(e,n),n}}const Kr=r=>D.find(r).lean(),Qr=async r=>await D.create({user:r});async function Hr(r){const e=await D.findOne({user:r}).lean();return e||y(await Qr(r))}const Wr=(r,e)=>D.findOneAndUpdate({user:r},e,{returnDocument:"after",upsert:!0}).lean();class Gr extends Pr{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Hr(e)}fetchManyFromDb(e){return Kr(e)}updateInDb(e,t){return Wr(e,t)}}const U=new Gr;class Yr extends b{async updateSendDailyQuest(e,t){await this.update(e,{$set:{sendDailyQuest:t}})}async updateSendDailyReport(e,t){await this.update(e,{$set:{sendDailyReport:t}})}async updateInventorySort(e,t){await this.update(e,{$set:{"sort.inventory":t}})}async updateReminderSettings(e,t,a){await this.update(e,{$set:{[`reminder.${t}`]:a}})}getUsersWithDailyReportEnable(){return this.getMany({sendDailyReport:!0})}}const Vr=r=>B.find(r).lean(),Xr=async r=>await B.create({user:r});async function Lr(r){const e=await B.findOne({user:r}).lean();return e||y(await Xr(r))}const Jr=(r,e)=>B.findOneAndUpdate({user:r},e,{returnDocument:"after",upsert:!0}).lean();class Zr extends Yr{constructor(){super(3600)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return Lr(e)}fetchManyFromDb(e){return Vr(e)}updateInDb(e,t){return Jr(e,t)}}const Se=new Zr;class ea extends m{async getCommandCooldown(e,t){return(await this.get(e)).commands[t]}async getRaidCooldown(e,t){return(await this.get(e)).raid[t]}async reduceRaidCooldown(e,t){await this.update(e,[{$set:{"raid.special":{$subtract:[{$ifNull:["$raid.special",new Date]},t*3600*1e3]},"raid.classic":{$subtract:[{$ifNull:["$raid.classic",new Date]},t*3600*1e3]}}}]),await k.updateReminderDate(e,"raid/special",-1*t*3600*1e3),await k.updateReminderDate(e,"raid/classic",-1*t*3600*1e3)}async startRaidCooldown(e,t,a){const{reminder:n}=await Se.get(e);await this.update(e,{$set:{[`raid.${t}`]:new Date(Date.now()+a)}}),n.raid[t]&&await k.addReminder(e,`raid/${t}`,new Date(Date.now()+a))}async lockUserCommand(e){await this.update(e,{$set:{lockUserCommand:new Date(Date.now()+2*3600*1e3)}}),await U.gainHp(e,1)}async useCommand(e,t,a){const{reminder:n}=await Se.get(e);await this.update(e,{$set:{[`commands.${t}`]:new Date(Date.now()+a)}}),n.commands[t]&&await k.addReminder(e,`commands/${t}`,new Date(Date.now()+a))}}const ta=async r=>await H.create({user:r});async function ra(r){const e=await H.findOne({user:r}).lean();return e||y(await ta(r))}const aa=(r,e)=>H.findOneAndUpdate({user:r},e,{returnDocument:"after",upsert:!0}).lean();class na extends ea{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return ra(e)}updateInDb(e,t){return aa(e,t)}}const He=new na;class sa extends m{async unlockTitle(e,t){await g.isOrnamentIds([t],g.isTitle)&&await this.update(e,{$addToSet:{unlockedTitles:t}})}async unlockTitles(e,t){await g.isOrnamentIds(t,g.isTitle)&&await this.update(e,{$addToSet:{unlockedTitles:{$each:t}}})}async selectTitle(e,t){await this.update(e,{$set:{selectedTitle:t}})}async unlockBackground(e,t){await g.isOrnamentIds([t],g.isBackground)&&await this.update(e,{$addToSet:{unlockedBackgrounds:t}})}async unlockBackgrounds(e,t){await g.isOrnamentIds(t,g.isBackground)&&await this.update(e,{$addToSet:{unlockedBackgrounds:{$each:t}}})}async selectBackground(e,t){await this.update(e,{$set:{selectedBackground:t}})}async unlockBadge(e,t,a){t.isProgressive?await this.update(e,{$addToSet:{unlockedBadges:`${t.id}_${a}`}}):await this.update(e,{$addToSet:{unlockedBadges:t.id}})}async unlockFactionBadge(e,t){await this.update(e,{$addToSet:{unlockedFactionBadges:{$each:[`b_marine_${t}`,`b_revolutionary_${t}`,`b_pirate_${t}`]}}})}async unlockProfileAsset(e,t){await this.update(e,{$addToSet:{unlockedProfileAssets:t}})}async unlockBag(e,t){await this.update(e,{$addToSet:{unlockedBags:t}})}async selectBag(e,t){await this.update(e,{$set:{selectedBag:t}})}}const ia=async r=>await X.create({user:r});async function ua(r){const e=await X.findOne({user:r}).lean();return e||y(await ia(r))}const ca=async(r,e)=>X.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class da extends sa{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return ua(e)}updateInDb(e,t){return ca(e,t)}}const x=new da;class la extends b{async getStatus(e,t){return(await this.get({user:e,questId:t})).status}async isCompleted(e,t){return await this.getStatus(e,t)==="COMPLETED"}async isStreaking(e,t){const{lastCompletionDate:a}=await this.get({user:e,questId:t});return!!a&&o.sameDay(o.yesterday(),a)}async getStreakMultiplier(e,t){const a=await this.get({user:e,questId:t});return await this.isStreaking(e,t)?1+Math.min(2,(a.streak??0)/10):1}async completeQuest(e,t=!1){const a=o.yesterday();a.setHours(0,0,0,0);const n=new Date;return n.setHours(0,0,0,0),this.update(e,[{$set:{...t?{streak:{$cond:{if:{$and:[{$gte:["$lastCompletionDate",a]},{$lt:["$lastCompletionDate",n]}]},then:{$add:[{$ifNull:["$streak",0]},1]},else:1}}}:{},lastCompletionDate:new Date,status:f.QuestStatus.COMPLETED}}],{upsert:!1})}}function oa(r){return v.find(r).lean()}const pa=async r=>await v.create({...r});async function ya(r){const e=await v.findOne(r).lean();return e||y(await pa(r))}function fa(r,e,t){return v.findOneAndUpdate(r,e,{upsert:!0,...t,returnDocument:"after"}).lean()}class ma extends la{constructor(){super(3600)}normalizeKey({user:e,questId:t}){return`${e.toString()}/${t}`}getKey({user:e,questId:t}){return{user:e,questId:t}}fetchFromDb(e){return ya(e)}fetchManyFromDb(e){return oa(e)}updateInDb(e,t,a){return fa(e,t,a)}}const ge=new ma;class ha extends m{async updateDailyReport(e){const t=await U.get(e),a=await x.get(e),n=await ge.getMany({user:e,status:f.QuestStatus.COMPLETED});await this.update(e,{$set:{xpYesterday:t.xp.amount,berryYesterday:t.berry,previousCompletedQuest:n.map(({questId:i})=>i),"previousOrnament.unlockedBadges":a.unlockedBadges,"previousOrnament.unlockedTitles":a.unlockedTitles,"previousOrnament.unlockedBackgrounds":a.unlockedBackgrounds}})}async getDailyReport(e){const t=await this.get(e),{previousOrnament:a,previousCompletedQuest:n,xpYesterday:i,berryYesterday:u}=t;if(i<=0)return;const l=await U.get(e),c=await ge.getMany({user:e,status:f.QuestStatus.COMPLETED}),$=await x.get(e),{berry:F,xp:O}=l,{voice:de,amount:Rs}=O,{unlockedBadges:Ms,unlockedBackgrounds:As,unlockedTitles:_s}=$;return{berry:F-u,xp:Rs-i,voice:o.sameDay(de.lastConnection,o.yesterday())?de.minutesInVoiceToday:0,quest:o.exclude(c.map(({questId:Bs})=>Bs),n),badge:o.exclude(Ms,a.unlockedBadges),title:o.exclude(_s,a.unlockedTitles),background:o.exclude(As,a.unlockedBackgrounds)}}async getAllDailyReportsToSend(){const e=await Ke.getMany({"settings.sendDailyReport":!0,faction:{$ne:"citizen"}});return await Promise.all(e.map(async({_id:t,discordId:a})=>({...await this.getDailyReport(t),user:t,discordId:a})))}}const wa=r=>W.create({user:r});async function Sa(r){const e=await W.findOne({user:r}).lean();return e||y(await wa(r))}const ga=(r,e)=>W.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class ba extends ha{constructor(){super(60)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return Sa(e)}updateInDb(e,t){return ga(e,t)}}const $a=new ba;class Ea extends m{async setGuessGame(e,t,a,n){await this.update(e,{$set:{guess:{amount:t,tries:a,numberToGuess:n,lastGuess:0}}})}async resetGuessGame(e){await this.update(e,{$set:{guess:null}})}async updateGuessGame(e){await this.update(e,{$inc:{"guess.tries":1},$set:{"guess.lastGuess":Date.now()}})}}const Ia=async r=>await Y.create({user:r});async function Ua(r){const e=await Y.findOne({user:r}).lean();return e||y(await Ia(r))}const Ta=(r,e)=>Y.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class Da extends Ea{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Ua(e)}updateInDb(e,t){return Ta(e,t)}}const Oa=new Da;class va extends m{async hasUnlockedRaid(e,t){return(await this.get(e)).unlocked?.[t]}async alreadyObtainedRaidReward(e,t,a){const n=await this.get(e);return t in n.obtainedRewards?n.obtainedRewards[t].includes(a):!1}async getObtainedRaidReward(e,t){return(await this.get(e)).obtainedRewards[t]??[]}async fulfillCondition(e,t,a,n){const i=await this.get(e);return n==="include"?a.every(u=>(i.obtainedConditions[t]??[]).includes(u)):a.every(u=>!(i.obtainedConditions[t]??[]).includes(u))}async unlockRaid(e,t){await this.update(e,{$set:{[`unlocked.${t}`]:!0}})}async startRaid(e,t,a,n,i){const u=Date.now();return await this.update(e,{$set:{currentRaid:{raidId:t,buffItem:a,seed:u,progression:[],rewards:{}}}}),await He.startRaidCooldown(e,n,i),u}async resetRaid(e){await this.update(e,{$unset:{currentRaid:""}})}async resetRaidProgression(e){await this.update(e,{$set:{"currentRaid.progression":[]}})}async progressRaid(e,t){await this.update(e,{$push:{"currentRaid.progression":t}})}async claimReward(e,t,a){await this.update(e,{$addToSet:{[`obtainedRewards.${t}`]:a}})}async addRewardsToRaid(e,t){await this.update(e,{$inc:Object.fromEntries(o.recordToArray(t).filter(([a])=>a!=="title"&&a!=="condition").map(([a,n])=>[`currentRaid.rewards.${a}`,n])),...t.title?{$set:{"currentRaid.rewards.title":t.title}}:{}})}async updateCondition(e,t,a){await this.update(e,{$addToSet:{[`obtainedConditions.${t}`]:a}})}}const Ca=r=>L.create({user:r}),Ra=async r=>{const e=await L.findOne({user:r}).lean();return e||y(await Ca(r))},Ma=(r,e)=>L.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"});class Aa extends va{constructor(){super(3600)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Ra(e)}updateInDb(e,t){return Ma(e,t)}}const _a=new Aa;class Ba extends m{async isBuyLimitReached(e,t,a){const n=await p.getAllEntitiesLimit();if(await p.isEntityId(t,p.isEquipment))return!1;const i=await this.get(e),u=i.limit?.[t];let l=n[t];const c=await S.hasRevolutionaryBuff(e);return i.lastShopId!==a?!1:(c==="half"&&t==="chest_2"&&(l+=2),c==="full"&&t==="chest_3"&&(l+=1),!!(l&&u&&u>=l))}async getShopItemRest(e,t,a,n=f.SHOP_DEFAULT_AVAILABLE_ENTITY_AMOUNT){const i=await p.getAllEntitiesLimit();if(await p.isEntityId(t,p.isEquipment))return n;let u=i[t];const l=await this.get(e),c=l.limit?.[t],$=await S.hasRevolutionaryBuff(e);return $==="half"&&t==="chest_2"&&(u+=2),$==="full"&&t==="chest_3"&&(u+=1),u?l.lastShopId!==a?u:c?u-c:Math.min(u,n):n}async increaseBuyLimit(e,t,a,n){await this.update(e,[{$set:{limit:{$cond:{if:{$eq:["$lastShopId",t]},then:{$setField:{field:a,input:{$ifNull:["$limit",{}]},value:{$add:[{$ifNull:[`$limit.${a}`,0]},n]}}},else:{[a]:n}}},lastShopId:t}}])}}const qa=async r=>await J.create({user:r}),ka=async r=>{const e=await J.findOne({user:r}).lean();return e||y(await qa(r))},Na=(r,e)=>J.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class xa extends Ba{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return ka(e)}updateInDb(e,t){return Na(e,t)}}const Fa=new xa;class ja extends m{async didSevenDoubleAtDoQ(e){await this.update(e,{$inc:{"doubleOrQuit.sevenDoubleInARowCount":1}})}async winWithBlackjack(e){await this.update(e,{$inc:{"blackJack.blackJackCount":1}})}async updateLastGames(e,t,a){await this.update(e,{$push:{lastGames:{$each:[{gameType:t,endState:a}],$position:0,$slice:20}}})}async drawIncrement(e){await this.update(e,{$inc:{drawCount:1}})}async bet666(e){const t=o.yesterday();t.setHours(0,0,0,0);const a=new Date;a.setHours(0,0,0,0),await M.updateOne({user:e,"bet666.last":{$gte:t,$lt:a}},{$inc:{"bet666.count":1},$set:{"bet666.last":new Date}}),await M.updateOne({user:e,"bet666.last":{$lt:t}},{$set:{"bet666.last":new Date,"bet666.count":1}}),this.invalidate(e)}async updateTotalBet(e,t){await this.update(e,{$inc:{totalBet:t}})}async updateRps(e,t){await this.update(e,[{$set:{"rps.count":{$cond:{if:{$eq:["$rps.lastRpsPlayed",t]},then:{$add:["$rps.count",1]},else:1}},"rps.lastRpsPlayed":t}}])}async hasGuessInOneTry(e){await this.update(e,{$inc:{"priceIsRight.guessInOneTryCount":1}})}async diceDoubleSix(e){await this.update(e,{$inc:{"dice.doubleSixCount":1}})}async diceDrawDoubleSix(e){await this.update(e,{$inc:{"dice.drawWithDoubleSixCount":1}})}}const za=async r=>await M.create({user:r});async function Pa(r){const e=await M.findOne({user:r}).lean();return e||y(await za(r))}const Ka=(r,e)=>M.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class Qa extends ja{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Pa(e)}updateInDb(e,t){return Ka(e,t)}}const Ha=new Qa;class Wa extends m{async increaseXpGiven(e,t){await this.update(e,{$inc:{xpGivenToCrew:t}})}async increaseBerryGiven(e,t){await this.update(e,{$inc:{berryGivenToCrew:t}})}async updateCrew10Percent(e,t){t?await this.update(e,{$set:{timeCrewBeyond10PercentXp:0}}):await this.update(e,{$inc:{timeCrewBeyond10PercentXp:1}})}async updateCrew90Percent(e,t){t?await this.update(e,{$set:{timeCrewAbove90PercentXp:0}}):await this.update(e,{$inc:{timeCrewAbove90PercentXp:1}})}}const Ga=async r=>await Z.create({user:r});async function Ya(r){const e=await Z.findOne({user:r}).lean();return e||y(await Ga(r))}const Va=(r,e)=>Z.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class Xa extends Wa{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Ya(e)}updateInDb(e,t){return Va(e,t)}}const La=new Xa;class Ja extends m{async workIncrement(e){await this.update(e,{$inc:{workCount:1}})}async updateTotalSpentInShop(e,t){await this.update(e,{$inc:{totalSpentInShop:t}})}}const Za=r=>ee.create({user:r});async function en(r){const e=await ee.findOne({user:r}).lean();return e||y(await Za(r))}const tn=(r,e)=>ee.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class rn extends Ja{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return en(e)}updateInDb(e,t){return tn(e,t)}}const We=new rn;class an extends m{async randomMessageIncrement(e){await this.update(e,{$inc:{randomMessageClaimed:1}})}async addWrittenTextChannel(e,t){await this.update(e,{$addToSet:{writeDifferentChatIds:t}})}async incrementMessageSend(e){await this.update(e,{$inc:{messageSent:1}})}async addTotalMinutesInVoice(e,t){await this.update(e,{$inc:{totalMinutesInVoice:t}})}}const nn=async r=>await te.create({user:r});async function sn(r){const e=await te.findOne({user:r}).lean();return e||y(await nn(r))}const un=(r,e)=>te.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class cn extends an{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return sn(e)}updateInDb(e,t){return un(e,t)}}const dn=new cn;class ln extends m{async hasReportedSomeone(e){await this.update(e,{$set:{reportedSomeone:!0}})}async botPingIncrement(e){await this.update(e,{$inc:{botPingCount:1}})}async hasCelebrateBirthday(e){await this.update(e,{$set:{hasCelebrateBirthday:!0}})}async hasTagEveryone(e){await this.update(e,{$set:{tagEveryone:!0}})}async hasBetMin(e){await this.update(e,{$set:{"gamblingFlags.betMin":!0}})}async hasLoseEverything(e){await this.update(e,{$set:{"gamblingFlags.loseEverything":!0}})}async hasBet10M(e){await this.update(e,{$set:{"gamblingFlags.bet10M":!0}})}async hasWinBet10M(e){await this.update(e,{$set:{"gamblingFlags.winBet10M":!0}})}async hasLose10M(e){await this.update(e,{$set:{"gamblingFlags.lose10M":!0}})}}const on=async r=>await re.create({user:r});async function pn(r){const e=await re.findOne({user:r}).lean();return e||y(await on(r))}const yn=(r,e)=>re.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class fn extends ln{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return pn(e)}updateInDb(e,t){return yn(e,t)}}const mn=new fn;class hn extends m{async readEdito(e){const t=new Date;t.setHours(0,0,0,0),await A.updateOne({user:e,"edito.lastTimeRead":{$gte:t}},{$inc:{"edito.readToday":1},$set:{"edito.lastTimeRead":new Date}}),await A.updateOne({user:e,"edito.lastTimeRead":{$lt:t}},{$set:{"edito.lastTimeRead":new Date,"edito.readToday":1}}),this.invalidate(e)}}const wn=async r=>await A.create({user:r});async function Sn(r){const e=await A.findOne({user:r}).lean();return e||y(await wn(r))}const gn=(r,e)=>A.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class bn extends hn{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Sn(e)}updateInDb(e,t){return gn(e,t)}}const $n=new bn;class En extends m{async updateCraftStats(e,t,a){const n=await p.get(a);!n||!p.isItem(n)||await this.update(e,{$inc:{"crafts.cookedMeal":p.isCookedMeal(n)?t:0,"crafts.scrolls":p.isScrollItem(n)?t:0,"crafts.totalCrafted":t}})}async incrementAlcoholDrink(e,t,a){["wine","beer","rhum"].includes(t)&&await this.update(e,{$inc:{"alcohols.wines":t==="wine"?a:0,"alcohols.beers":t==="beer"?a:0,"alcohols.rhums":t==="rhum"?a:0,"alcohols.totalConsumed":a}})}async incrementBottleUsedToday(e,t){const a=new Date;a.setHours(0,0,0,0),await _.updateOne({user:e,"bottle.lastUsed":{$gte:a}},{$inc:{"bottle.usedToday":t},$set:{"bottle.lastUsed":new Date}}),await _.updateOne({user:e,"bottle.lastUsed":{$lt:a}},{$set:{"bottle.lastUsed":new Date,"bottle.usedToday":t}}),this.invalidate(e)}async incrementBottleUsedTotal(e,t){await this.update(e,{$inc:{"bottle.totalUsed":t}})}async incrementChestOpenedTotal(e,t){await this.update(e,{$inc:{"chest.totalOpened":t}})}}const In=async r=>await _.create({user:r});async function Un(r){const e=await _.findOne({user:r}).lean();return e||y(await In(r))}const Tn=(r,e)=>_.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class Dn extends En{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Un(e)}updateInDb(e,t){return Tn(e,t)}}const On=new Dn;class vn extends b{async maxCraftQuantity(e,t){const a=await S.get(e);let n=1/0;for(const i of t)n=Math.min(n,Math.floor((a.itemList[i.entityId]??0)/i.size));return n}async hasEnoughItemsForRecipe(e,t,a){const n=await S.get(e);for(const i of t.entities)if((n.itemList[i.entityId]??0)<i.size*a)return!1;return!0}decodeCraftId(e){return e.split(";").map((t,a)=>({entityId:t==="null"?null:t,index:a}))}encodeCraftId(e){return e.map(({entityId:t})=>`${t}`).join(";")}async isValidRecipe(e){return!!(await this.getAll()).find(a=>a.craftId===e)}async getRecipeResult(e,t){const a=await S.get(e),n=(await I.getPanoplyBonus(a.equippedItems)).find(([i,u])=>i.panoplyId==="little_blacksmith"&&u!==null);return n?.[1]==="full"&&t==="chest_3"?"chest_blacksmith_3":n?.[1]==="half"&&t==="chest_2"?"chest_blacksmith_2":n?.[1]==="half"&&t==="chest_1"?"chest_blacksmith_1":t}}const Cn=new s.Schema({entityId:{type:String,required:!0},size:{type:Number,required:!0}},{_id:!1}),Rn=new s.Schema({entityId:{type:String,required:!0},size:{type:Number,required:!0}},{_id:!1}),Mn=new s.Schema({craftId:{type:String,unique:!0,required:!0},name:{type:String,required:!0},entities:{type:[Cn],required:!0},result:{type:Rn,required:!0}},{minimize:!1}),se=s.models?.Recipes||s.model("Recipes",Mn),An=async r=>await se.create({...r}),_n=async(r,e={})=>se.find(r,e).lean();async function Bn(r){const e=await se.findOne({craftId:r}).lean();return e||null}const qn=(r,e)=>se.findOneAndUpdate(r,e,{returnDocument:"after"}).lean();class kn extends vn{constructor(){super(3600)}createInDb(e){return An(e)}updateInDb(e,t){return qn(e,t)}fetchFromDb(e){return Bn(e)}fetchManyFromDb(e){return _n(e)}normalizeKey(e){return e}getKey(e){return e.craftId}}const Nn=new kn,xn=new s.Schema({bannedUserId:{type:String,index:!0,required:!0},authorId:{type:String,required:!0},unbannedTimestamp:{type:Date,index:1},reason:{type:String,required:!0},guildId:{type:String,required:!0}}),ie=s.models?.Bans||s.model("Bans",xn),Fn=(r,e)=>ie.deleteOne({bannedUserId:r,guildId:e});class jn extends b{async getUnbanUsers(){return this.getMany({unbannedTimestamp:{$lte:new Date,$ne:null}})}async banUserFromGuild({bannedUserId:e,guildId:t,...a}){await this.update({bannedUserId:e,guildId:t},{...a})}async isBannedFromGuild(e,t){const a=await this.get({bannedUserId:e,guildId:t});return!!(a&&(!a.unbannedTimestamp||a.unbannedTimestamp>new Date))}async deleteBan(e,t){await Fn(e,t),this.invalidate({bannedUserId:e,guildId:t})}}const zn=r=>ie.find(r).lean(),Pn=r=>ie.findOne(r).lean(),Kn=(r,e)=>ie.findOneAndUpdate(r,e,{returnDocument:"after",upsert:!0}).lean();class Qn extends jn{constructor(){super(3600*36)}normalizeKey(e){return`${e.guildId}/${e.bannedUserId}`}getKey({bannedUserId:e,guildId:t}){return{bannedUserId:e,guildId:t}}fetchFromDb(e){return Pn(e)}fetchManyFromDb(e){return zn(e)}updateInDb(e,t){return Kn(e,t)}}const Hn=new Qn,Wn=new s.Schema({senderId:{type:s.Schema.Types.ObjectId,required:!0,ref:"User"},receiverId:{type:s.Schema.Types.ObjectId,required:!0,index:!0,ref:"User"},amount:Number,gameMode:String,meta:{rps:{type:String,default:void 0}}}),ue=s.models?.Invitation||s.model("Invitation",Wn),Gn=r=>ue.create({...r}),Yn=async r=>{await ue.deleteMany({...r})};class Vn extends m{async sendInvitation({senderId:e,receiverId:t,gameMode:a,...n}){return await this.get({senderId:e,gameMode:a,receiverId:t})?!1:(await Gn({...n,senderId:e,gameMode:a,receiverId:t}),!0)}async receiveInvitation(e){return this.get(e)}async deleteInvitation(e){await Yn(e),this.invalidate(e)}}const Xn=r=>ue.findOne({...r}).lean(),Ln=(r,e)=>ue.findOneAndUpdate(r,e,{returnDocument:"after"}).lean();class Jn extends Vn{constructor(){super(3600)}normalizeKey(e){return`${e.gameMode}/${e.receiverId}/${e.senderId}`}getKey({receiverId:e,gameMode:t,senderId:a}){return{gameMode:t,receiverId:e,senderId:a}}fetchFromDb(e){return Xn(e)}updateInDb(e,t){return Ln(e,t)}}const Zn=new Jn;class es extends m{async setEditoChannel(e,t){await this.update({guildId:e},{$set:{"edito.channelId":t}})}async randomizeEditoPrice(e){const t=o.randomBetween(100,1001);return await this.update({guildId:e},{$set:{"edito.price":t}}),t}async setEditoMessageId(e,t){await this.update({guildId:e},{$set:{"edito.messageId":t}})}async setRankingChannel(e,t){await this.update({guildId:e},{$set:{"ranking.channelId":t}})}async setRankingMessage(e,t){await this.update({guildId:e},{$set:{"ranking.messageId":t}})}async setCrewInfoChannelId(e,t){await this.update({guildId:e},{$set:{"crew.infoChannelId":t}})}async addCrewChannelId(e,t,a){await this.update({guildId:e},{$push:{"crew.crewChannelIds":{channelId:a,crewId:t}}})}async updateRolesId(e,t){await this.update({guildId:e},{$set:Object.fromEntries(Object.entries(t).map(([a,n])=>[`roles.${a}`,n]))})}async updateChannelId(e,t){await this.update({guildId:e},{$set:Object.fromEntries(Object.entries(t).map(([a,n])=>[`channels.${a}`,n]))})}}const ts=new s.Schema({guildId:{type:String,required:!0,unique:!0},ranking:{channelId:{type:String,default:null},messageId:{type:String,default:null}},roles:{premium:{type:String,default:null},booster:{type:String,default:null},scam:{type:String,default:null}},channels:{gambling:{type:String,default:null},work:{type:String,default:null},raid:{type:String,default:null},suggestion:{type:String,default:null},report:{type:String,default:null},reportModerator:{type:String,default:null},faction:{type:String,default:null},discussion:{type:String,default:null},questFallback:{type:String,default:null},reportBug:{type:String,default:null},shop:{type:String,default:null}},edito:{channelId:{type:String,default:null},price:{type:Number,default:100},messageId:{type:String,default:null}},crew:{infoChannelId:{type:String,default:null},crewChannelIds:{type:[{channelId:{type:String},crewId:{type:String}}],default:[]}},shopChannelId:{type:String,default:null}}),be=s.models?.Settings||s.model("Settings",ts),rs=r=>be.create({guildId:r}),as=async r=>{const e=await be.findOne({guildId:r}).lean();return e||y(await rs(r))},ns=(r,e)=>be.findOneAndUpdate(r,e,{upsert:!0,returnDocument:"after"}).lean();class ss extends es{constructor(){super(3600*24*30)}normalizeKey(e){return e}getKey({guildId:e}){return e}fetchFromDb(e){return as(e)}updateInDb(e,t){return ns(e,t)}}const is=new ss,us=new s.Schema({shopType:{type:String,required:!0,unique:!0},publishedAt:{type:Date,default:new Date},duration:{type:Number,default:null},closeAt:{type:Date,default:null},items:{type:[{_id:!1,type:{price:Number,size:{type:Number,default:null},id:String,currency:String}}],default:[]},stats:{berrySpent:{type:Number,default:0},itemBought:{type:Number,default:0},chestBought:{type:Number,default:0},boostTimeBought:{type:Number,default:0},percentBought:{type:Number,default:0}}},{minimize:!1}),ce=s.models?.Shop||s.model("Shop",us),cs=r=>ce.create({shopType:r}),Ge=async r=>{const e=await ce.findOne({shopType:r}).lean();return e||y(await cs(r))};class T{toDBShopItem(){return{price:this.price,size:this.size,id:"entityId"in this.data?this.data.entityId:this.data.ornamentId,currency:this.currency}}async onBuy(e,t){this.currency==="berry"?(await U.updateUserBerry(e,-1*this.price*t,!1),await We.updateTotalSpentInShop(e,this.price*t)):await S.removeItem(e,this.currency,this.price*t)}isBackground(){return!1}isChest(){return!1}isTitle(){return!1}isBoostXp(){return!1}isRepair(){return!1}isStore(){return!1}isObject(){return!1}isBottle(){return!1}isEquipment(){return!1}}class ds extends T{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await x.unlockBackground(e,this.data.ornamentId)}isBackground(){return!0}}class ls extends T{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addItem(e,this.data.entityId,t)}isBoostXp(){return!0}}class os extends T{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addItem(e,this.data.entityId,t)}isChest(){return!0}}class ps extends T{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addItem(e,this.data.entityId,t)}isObject(){return!0}}class ys extends T{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addEquipments(e,o.range({stop:t}).map(()=>p.seedEquipment({...this.data},Date.now()-Math.round(Math.random()*1e3))).map(a=>({entityId:a.entityId,seed:a.seed})))}isEquipment(){return!0}}class fs extends T{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addItem(e,this.data.entityId,t)}isBottle(){return!0}}class ms extends T{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addItem(e,this.data.entityId,t)}isRepair(){return!0}}class hs extends T{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addItem(e,this.data.entityId,t)}isStore(){return!0}}class ws extends T{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await x.unlockTitle(e,this.data.ornamentId)}isTitle(){return!0}}class Ss extends m{async getShopItem(e,t){const n=(await this.get(e)).items.find($=>$.id===t);if(!n)return;const{price:i,size:u,currency:l}=n,c=await p.get(n.id)??await g.get(n.id);if(g.isOrnament(c)&&g.isBackground(c))return new ds({price:i,item:c,size:u,currency:l});if(g.isOrnament(c)&&g.isTitle(c))return new ws({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isChestItem(c))return new os({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isBoostItem(c))return new ls({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isRepairItem(c))return new ms({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isStoreItem(c))return new hs({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isObjectItem(c))return new ps({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isEquipment(c))return new ys({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isBottleItem(c))return new fs({price:i,size:u,item:c,currency:l})}async getShopItemList(e){const t=await this.get(e),a=[];for(const{id:n}of t.items){const i=await this.getShopItem(e,n);i&&a.push(i)}return a}getShopItemId(e){return p.isEntity(e.data)?e.data.entityId:e.data.ornamentId}async updateShopStats(e,t,a){await this.update({shopType:e},{$inc:{"stats.berrySpent":t.price*a,"stats.itemBought":a,"stats.chestBought":t.isChest()?a:0,"stats.percentBought":t.isRepair()?(t.data.effects.find(n=>n.type==="CREW_REPAIR")?.params.amount??0)*a:0,"stats.boostTimeBought":t.isBoostXp()?t.data.ms/(1440*60*1e3):0}})}async buyShopItem(e,t,a,n){const i=t.map(u=>(u.id===this.getShopItemId(a)&&u.size&&(u.size-=n),u));await this.update({shopType:e},{$set:{items:i}})}async publish(e){await this.update({shopType:e},{$set:{publishedAt:new Date}})}async setShopItems(e,t){await this.update({shopType:e},{$set:{items:[...t]}})}}const gs=(r,e)=>ce.findOneAndUpdate(r,e,{upsert:!0,returnDocument:"after"}).lean();class bs extends Ss{constructor(){super(3600)}normalizeKey(e){return e}getKey({shopType:e}){return e}fetchFromDb(e){return Ge(e)}updateInDb(e,t){return gs(e,t)}}const $s=new bs,Es=new s.Schema({warnedUserId:{type:String,required:!0,index:!0},authorId:String,date:{type:Date,default:Date.now()},reason:{type:String,default:null}}),Ye=s.models?.Warn||s.model("Warn",Es),Is=r=>Ye.countDocuments(r);class Us extends b{getUserWarns(e){return this.getMany({warnedUserId:e})}getUserWarnCount(e){return Is({warnedUserId:e})}}const Ts=r=>Ye.find(r).lean();class Ds extends Us{constructor(){super(300)}normalizeKey(e){return e}getKey({warnedUserId:e,date:t}){return`${e}/${t.getTime()}`}fetchFromDb(){throw new Error("Method not implemented.")}fetchManyFromDb(e){return Ts(e)}updateInDb(){throw new Error("Method not implemented.")}}const Os=new Ds,vs=r=>{s.connect(r)};class Cs extends s.Types.ObjectId{}d.COOLDOWN_COMMANDS=Yt,d.ObjectId=Cs,d.QUEST_MIDDLEWARE_EVENT_NAME=w,d.RAID_MIDDLEWARE_EVENT_NAME=P,d.banService=Hn,d.connectToServices=vs,d.crewMetaService=pe,d.crewOrnamentsService=ft,d.crewQuestService=$t,d.crewService=Ue,d.crewStatsEngagementService=Ot,d.crewStatsFrequencyService=_t,d.emitQuestMiddlewareEvent=h,d.emitRaidMiddlewareEvent=z,d.entityService=p,d.findShop=Ge,d.invitationService=Zn,d.ornamentService=g,d.panoplyService=I,d.recipeService=Nn,d.registerQuestMiddlewareEvents=Je,d.registerRaidMiddlewareEvents=Ze,d.reminderService=k,d.settingsService=is,d.shopModel=ce,d.shopService=$s,d.userCooldownService=He,d.userCrewService=Qe,d.userDailyReportService=$a,d.userEncyclopediaService=ne,d.userGamesService=Oa,d.userInventoryService=S,d.userMetaService=U,d.userOrnamentService=x,d.userQuestService=ge,d.userRaidService=_a,d.userService=Ke,d.userSettingsService=Se,d.userShopService=Fa,d.userStatsCasinoService=Ha,d.userStatsCrewService=La,d.userStatsEconomyService=We,d.userStatsEngagementService=dn,d.userStatsFlagsService=mn,d.userStatsFrequencyService=$n,d.userStatsInventoryService=On,d.warnService=Os,Object.defineProperty(d,Symbol.toStringTag,{value:"Module"})}));
@@ -27,6 +27,7 @@ export * from './user-stats/inventory';
27
27
  export * from './entities';
28
28
  export * from './ornaments';
29
29
  export * from './panoplies';
30
+ export * from './recipe';
30
31
  export * from './ban';
31
32
  export * from './invitations';
32
33
  export * from './reminder';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,QAAQ,CAAC;AACvB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAE5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAE5B,cAAc,OAAO,CAAC;AAEtB,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AAEvB,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,QAAQ,CAAC;AACvB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAE5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AAEzB,cAAc,OAAO,CAAC;AAEtB,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AAEvB,cAAc,SAAS,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Recipe } from './types';
2
+ export declare const recipes: Recipe[];
3
+ //# sourceMappingURL=data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../src/services/recipe/data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,eAAO,MAAM,OAAO,EAAE,MAAM,EAq4B3B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Model } from 'mongoose';
2
+ import type { RecipeDocument } from '../types';
3
+ declare const recipeModel: Model<RecipeDocument>;
4
+ export { recipeModel };
5
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../src/services/recipe/definition/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAGtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG/C,QAAA,MAAM,WAAW,EAAE,KAAK,CAAC,cAAc,CAC4B,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Schema } from 'mongoose';
2
+ import type { RecipeDocument } from '../types';
3
+ declare const recipeSchema: Schema<RecipeDocument, import("mongoose").Model<RecipeDocument, any, any, any, import("mongoose").Document<unknown, any, RecipeDocument, any, {}> & RecipeDocument & Required<{
4
+ _id: import("mongoose").Types.ObjectId;
5
+ }> & {
6
+ __v: number;
7
+ }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, RecipeDocument, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<RecipeDocument>, {}, import("mongoose").ResolveSchemaOptions<import("mongoose").DefaultSchemaOptions>> & import("mongoose").FlatRecord<RecipeDocument> & Required<{
8
+ _id: import("mongoose").Types.ObjectId;
9
+ }> & {
10
+ __v: number;
11
+ }>;
12
+ export { recipeSchema };
13
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/services/recipe/definition/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAkB/C,QAAA,MAAM,YAAY;;;;;;;;EAQjB,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Types } from 'mongoose';
2
+ import { AbstractCachedServiceWithFetchMany } from '../AbstractCachedService';
3
+ import type { Craft, CraftId, Recipe, RecipeDocument, RecipeEntity } from './types';
4
+ export declare abstract class RecipeHelper extends AbstractCachedServiceWithFetchMany<Recipe, RecipeDocument, string> {
5
+ maxCraftQuantity(userId: Types.ObjectId, recipeEntities: RecipeEntity[]): Promise<number>;
6
+ hasEnoughItemsForRecipe(userId: Types.ObjectId, recipe: Recipe, quantity: number): Promise<boolean>;
7
+ decodeCraftId(craftId: CraftId): Craft;
8
+ encodeCraftId(craft: Craft): CraftId;
9
+ isValidRecipe(craftId: CraftId): Promise<boolean>;
10
+ getRecipeResult(userId: Types.ObjectId, entityId: string): Promise<string>;
11
+ }
12
+ //# sourceMappingURL=helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../../src/services/recipe/helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,OAAO,EAAE,kCAAkC,EAAE,MAAM,0BAA0B,CAAC;AAG9E,OAAO,KAAK,EACV,KAAK,EACL,OAAO,EACP,MAAM,EACN,cAAc,EACd,YAAY,EACb,MAAM,SAAS,CAAC;AAEjB,8BAAsB,YAAa,SAAQ,kCAAkC,CAC3E,MAAM,EACN,cAAc,EACd,MAAM,CACP;IACc,gBAAgB,CAC3B,MAAM,EAAE,KAAK,CAAC,QAAQ,EACtB,cAAc,EAAE,YAAY,EAAE,GAC7B,OAAO,CAAC,MAAM,CAAC;IAeL,uBAAuB,CAClC,MAAM,EAAE,KAAK,CAAC,QAAQ,EACtB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM;IAeX,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,KAAK;IAOtC,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAI9B,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAKjD,eAAe,CAC1B,MAAM,EAAE,KAAK,CAAC,QAAQ,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC;CAoBnB"}
@@ -0,0 +1,3 @@
1
+ export type * from './types';
2
+ export * from './service';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/recipe/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,SAAS,CAAC;AAE7B,cAAc,WAAW,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Recipe, RecipeDocument } from '../types';
2
+ export declare const createRecipe: (recipe: Recipe) => Promise<RecipeDocument>;
3
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../../src/services/recipe/process/create.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEvD,eAAO,MAAM,YAAY,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,cAAc,CAIzE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ProjectionType, RootFilterQuery } from 'mongoose';
2
+ import type { Lean } from '../../types';
3
+ import type { RecipeDocument } from '../types';
4
+ export declare const findRecipes: (filter: RootFilterQuery<RecipeDocument>, projection?: ProjectionType<RecipeDocument>) => Promise<Lean<RecipeDocument>[]>;
5
+ //# sourceMappingURL=findMany.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findMany.d.ts","sourceRoot":"","sources":["../../../../src/services/recipe/process/findMany.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,eAAO,MAAM,WAAW,GACtB,QAAQ,eAAe,CAAC,cAAc,CAAC,EACvC,aAAY,cAAc,CAAC,cAAc,CAAM,KAC9C,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAEhC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Lean } from '../../types';
2
+ import type { RecipeDocument } from '../types';
3
+ export declare function findRecipe(craftId: string): Promise<Lean<RecipeDocument> | null>;
4
+ //# sourceMappingURL=findOne.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findOne.d.ts","sourceRoot":"","sources":["../../../../src/services/recipe/process/findOne.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,CAOtC"}
@@ -0,0 +1,5 @@
1
+ import type { RootFilterQuery } from 'mongoose';
2
+ import type { Lean, MongooseUpdate } from '../../types';
3
+ import type { RecipeDocument } from '../types';
4
+ export declare const updateRecipe: (filter: RootFilterQuery<RecipeDocument>, update: MongooseUpdate<RecipeDocument>) => Promise<Lean<RecipeDocument> | null>;
5
+ //# sourceMappingURL=updateOne.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateOne.d.ts","sourceRoot":"","sources":["../../../../src/services/recipe/process/updateOne.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,eAAO,MAAM,YAAY,GACvB,QAAQ,eAAe,CAAC,cAAc,CAAC,EACvC,QAAQ,cAAc,CAAC,cAAc,CAAC,KACrC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,CAMrC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { RootFilterQuery } from 'mongoose';
2
+ import type { Lean, MongooseUpdate } from '../types';
3
+ import { RecipeHelper } from './helper';
4
+ import type { Recipe, RecipeDocument } from './types';
5
+ declare class RecipeService extends RecipeHelper {
6
+ constructor();
7
+ createInDb(recipe: Recipe): Promise<RecipeDocument>;
8
+ protected updateInDb(filter: RootFilterQuery<RecipeDocument>, update: MongooseUpdate<RecipeDocument>): Promise<Lean<RecipeDocument> | null>;
9
+ protected fetchFromDb(craftId: string): Promise<(import("mongoose").FlattenMaps<RecipeDocument> & Required<{
10
+ _id: import("mongoose").Types.ObjectId;
11
+ }> & {
12
+ __v: number;
13
+ }) | null>;
14
+ protected fetchManyFromDb(filter: RootFilterQuery<RecipeDocument>): Promise<(import("mongoose").FlattenMaps<RecipeDocument> & Required<{
15
+ _id: import("mongoose").Types.ObjectId;
16
+ }> & {
17
+ __v: number;
18
+ })[]>;
19
+ protected normalizeKey(key: string): string;
20
+ protected getKey(recipe: Recipe): string;
21
+ }
22
+ export declare const recipeService: RecipeService;
23
+ export {};
24
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/recipe/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKxC,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEtD,cAAM,aAAc,SAAQ,YAAY;;IAK/B,UAAU,CAAC,MAAM,EAAE,MAAM;IAIhC,SAAS,CAAC,UAAU,CAClB,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC,EACvC,MAAM,EAAE,cAAc,CAAC,cAAc,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IAIvC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM;;;;;IAIrC,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC;;;;;IAIjE,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI3C,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAGzC;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { Document } from 'mongoose';
2
+ export type CraftId = string;
3
+ export type CraftObject = {
4
+ entityId: string | null;
5
+ index: number;
6
+ };
7
+ export type Craft = CraftObject[];
8
+ export type RecipeEntity = {
9
+ entityId: string;
10
+ size: number;
11
+ };
12
+ export type RecipeResultEntity = {
13
+ entityId: string;
14
+ size: number;
15
+ };
16
+ export type Recipe = {
17
+ craftId: CraftId;
18
+ name: string;
19
+ entities: RecipeEntity[];
20
+ result: RecipeResultEntity;
21
+ };
22
+ export interface RecipeDocument extends Document, Recipe {
23
+ }
24
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/recipe/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;AAElC,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,MAAM,EAAE,kBAAkB,CAAC;CAC5B,CAAC;AAEF,MAAM,WAAW,cAAe,SAAQ,QAAQ,EAAE,MAAM;CAAG"}