@opfr/services 1.0.5 → 1.1.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.
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 ce=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 ce.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 ce.EventEmitter,z=(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)})},P={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.boost}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)??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 de=s.models?.CrewMeta||s.model("CrewMeta",Ie),nt=async a=>await de.create({crew:a});async function st(a){const e=await de.findOne({user:a}).lean();return e||y(await nt(a))}const it=(a,e)=>de.findOneAndUpdate({user: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 le=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 oe=s.models?.CrewOrnaments||s.model("CrewOrnaments",Te),dt=a=>oe.create({crew:a});async function lt(a){const e=await oe.findOne({crew:a}).lean();return e||y(await dt(a))}const ot=(a,e)=>oe.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 pe=s.models?.CrewStatsEngagement||s.model("CrewStatsEngagement",De),Et=a=>pe.create({crew:a});async function Ut(a){const e=await pe.findOne({crew:a}).lean();return e||y(await Et(a))}const It=(a,e)=>pe.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 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(a){h(w.CREW_STATS_FREQUENCY,a.crew._id,a)});const ye=s.models?.CrewStatsFrequency||s.model("CrewStatsFrequency",Ce),Ct=a=>ye.create({crew:a});async function vt(a){const e=await ye.findOne({crew:a}).lean();return e||y(await Ct(a))}const Rt=(a,e)=>ye.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 vt(e)}updateInDb(e,t){return Rt(e,t)}}const At=new Mt,ve=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});ve.post("findOneAndUpdate",function(a){z(P.USER_QUEST,a.user._id,a),h(w.USER_QUEST,a.user._id,a)});const D=s.models?.UserQuest||s.model("UserQuest",ve),_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){z(P.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 ce.EventEmitter,xt=(a,e)=>{Nt.emit(a,e)},v={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:[v],default:[]},work:{type:[v],default:[]}},berry:{work:{type:[v],default:[]},global:{type:[v],default:[]}},drop:{work:{type:[v],default:[]}},xp:{global:{type:[v],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 R=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){z(P.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),ze=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}}});ze.post("findOneAndUpdate",function(a){h(w.USER_STATS_INVENTORY,a.user._id,a)});const _=s.models?.UserStatsInventory||s.model("UserStatsInventory",ze),fe=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}});fe.post("findOneAndUpdate",function(a){h(w.USER,a._id,a)}),fe.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 R.deleteOne({user:a}),await V.deleteOne({user:a}),await D.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",fe);class zt 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 D.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 Pt=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 zt{constructor(){super(3600)}normalizeKey(e){return e}getKey({discordId:e}){return e}fetchFromDb(e){return Qt(e)}fetchManyFromDb(e){return Pt(e)}updateInDb(e,t){return Ht(e,t)}}const Pe=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}),me=s.models?.Ornaments||s.model("Ornaments",ra),na=async(a,e={})=>me.find(a,e).lean();async function sa(a){const e=await me.findOne({ornamentId:a}).lean();return e||null}const ia=(a,e)=>me.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}),he=s.models?.Entities||s.model("Entities",Sa),ga=async(a,e={})=>he.find(a,e).lean();async function ba(a){const e=await he.findOne({entityId:a}).lean();return e||null}const $a=(a,e)=>he.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class Ea extends ha{constructor(){super(3600)}updateInDb(e,t){return $a(e,t)}fetchFromDb(e){return ba(e)}fetchManyFromDb(e){return ga(e)}normalizeKey(e){return e}getKey(e){return e.entityId}}const p=new Ea,Ua=(a,e,t)=>C.create({user:a,crew:e,permission:t}),Ia=async a=>{await C.deleteOne({user:a})};class Ta 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 Ua(e,t,r),this.invalidate(t)}async removeUserFromCrew(e,t){await Ia(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 Oa=a=>C.find(a).lean(),Da=a=>C.findOne({user:a}).lean(),Ca=(a,e)=>C.findOneAndUpdate({user:a},e).lean();class va extends Ta{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Da(e)}fetchManyFromDb(e){return Oa(e)}updateInDb(e,t){return Ca(e,t)}}const Ke=new va;class Ra extends m{hasAlreadyFoundEntity(e,t){return e.encyclopedia.includes(t)}async addEntities(e,t){await this.update(e,{$addToSet:{encyclopedia:{$each:t}}})}}const Ma=async a=>await G.create({user:a});async function Aa(a){const e=await G.findOne({user:a}).lean();return e||y(await Ma(a))}const _a=(a,e)=>G.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Ba extends Ra{constructor(){super(300)}fetchFromDb(e){return Aa(e)}getKey({user:e}){return e}normalizeKey(e){return e.toString()}updateInDb(e,t){return _a(e,t)}}const re=new Ba;class qa 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 re.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 re.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:{id: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 re.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 ka=a=>X.create({user:a});async function Na(a){const e=await X.findOne({user:a}).lean();return e||y(await ka(a))}const xa=(a,e)=>X.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Fa extends qa{constructor(){super(300)}fetchFromDb(e){return Na(e)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}updateInDb(e,t){return xa(e,t)}}const g=new Fa;class ja extends m{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 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 R.aggregate([{$setWindowFields:{sortBy:{"xp.amount":-1},output:{rank:{$rank:{}}}}},{$match:{_id:e}},{$project:{rank:1}}]))[0]}async getBerryRank(e){return(await R.aggregate([{$setWindowFields:{sortBy:{berry:-1},output:{rank:{$rank:{}}}}},{$match:{_id: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(O=>O.panoplyId===i.panoply);if(!c)return;const b=c.equipments.filter(O=>(u.find(ue=>O.entityId===ue.entityId)||!n&&i.entityId===O.entityId)&&(n?i.entityId!==O.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 le.calcXp(r.crew,t*n),await le.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=async a=>await R.create({user:a});async function Pa(a){const e=await R.findOne({user:a}).lean();return e||y(await za(a))}const Ka=(a,e)=>R.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).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 I=new Qa;class Ha extends ${async updateSendDailyQuest(e,t){await this.update({discordId:e},{$set:{sendDailyQuest:t}})}async updateSendDailyReport(e,t){await this.update({discordId:e},{$set:{sendDailyReport:t}})}async updateInventorySort(e,t){await this.update({discordId:e},{$set:{"sort.inventory":t}})}async updateReminderSettings(e,t,r){await this.update({discordId:e},{$set:{[`reminder.${t}`]:r}})}getUsersWithDailyReportEnable(){return this.getMany({"settings.sendDailyReport":!0,faction:{$ne:"citizen"}})}}const Wa=a=>B.find(a).lean(),Ga=async a=>await B.create({user:a});async function Ya(a){const e=await B.findOne({user:a}).lean();return e||y(await Ga(a))}const Xa=(a,e)=>B.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).lean();class Va extends Ha{constructor(){super(3600)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return Ya(e)}fetchManyFromDb(e){return Wa(e)}updateInDb(e,t){return Xa(e,t)}}const we=new Va;class La 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 Ja=async a=>await H.create({user:a});async function Za(a){const e=await H.findOne({user:a}).lean();return e||y(await Ja(a))}const er=(a,e)=>H.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).lean();class tr extends La{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return Za(e)}updateInDb(e,t){return er(e,t)}}const Qe=new tr;class ar 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 rr=async a=>await V.create({user:a});async function nr(a){const e=await V.findOne({user:a}).lean();return e||y(await rr(a))}const sr=async(a,e)=>V.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class ir extends ar{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return nr(e)}updateInDb(e,t){return sr(e,t)}}const x=new ir;class ur 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 cr(a){return D.find(a).lean()}const dr=async a=>await D.create({...a});async function lr(a){const e=await D.findOne(a).lean();return e||y(await dr(a))}function or(a,e,t){return D.findOneAndUpdate(a,e,{upsert:!0,...t,returnDocument:"after"}).lean()}class pr extends ur{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 lr(e)}fetchManyFromDb(e){return cr(e)}updateInDb(e,t,r){return or(e,t,r)}}const Se=new pr;class yr 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:O}=l,{voice:ue,amount:ws}=O,{unlockedBadges:Ss,unlockedBackgrounds:gs,unlockedTitles:bs}=b;return{berry:F-u,xp:ws-i,voice:o.sameDay(ue.lastConnection,o.yesterday())?ue.minutesInVoiceToday:0,quest:o.exclude(c.map(({questId:$s})=>$s),n),badge:o.exclude(Ss,r.unlockedBadges),title:o.exclude(bs,r.unlockedTitles),background:o.exclude(gs,r.unlockedBackgrounds)}}async getAllDailyReportsToSend(){const e=await Pe.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 fr=a=>W.create({user:a});async function mr(a){const e=await W.findOne({user:a}).lean();return e||y(await fr(a))}const hr=(a,e)=>W.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class wr extends yr{constructor(){super(60)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return mr(e)}updateInDb(e,t){return hr(e,t)}}const Sr=new wr;class gr 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 br=async a=>await Y.create({user:a});async function $r(a){const e=await Y.findOne({user:a}).lean();return e||y(await br(a))}const Er=(a,e)=>Y.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Ur extends gr{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return $r(e)}updateInDb(e,t){return Er(e,t)}}const Ir=new Ur;class Tr 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 Or=a=>L.create({user:a}),Dr=async a=>{const e=await L.findOne({user:a}).lean();return e||y(await Or(a))},Cr=(a,e)=>L.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"});class vr extends Tr{constructor(){super(3600)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Dr(e)}updateInDb(e,t){return Cr(e,t)}}const Rr=new vr;class Mr 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 Ar=async a=>await J.create({user:a}),_r=async a=>{const e=await J.findOne({user:a}).lean();return e||y(await Ar(a))},Br=(a,e)=>J.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class qr extends Mr{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return _r(e)}updateInDb(e,t){return Br(e,t)}}const kr=new qr;class Nr 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 xr=async a=>await M.create({user:a});async function Fr(a){const e=await M.findOne({user:a}).lean();return e||y(await xr(a))}const jr=(a,e)=>M.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class zr extends Nr{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Fr(e)}updateInDb(e,t){return jr(e,t)}}const Pr=new zr;class Kr 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 Qr=async a=>await Z.create({user:a});async function Hr(a){const e=await Z.findOne({user:a}).lean();return e||y(await Qr(a))}const Wr=(a,e)=>Z.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Gr extends Kr{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Hr(e)}updateInDb(e,t){return Wr(e,t)}}const Yr=new Gr;class Xr extends m{async workIncrement(e){await this.update(e,{$inc:{workCount:1}})}async updateTotalSpentInShop(e,t){await this.update(e,{$inc:{totalSpentInShop:t}})}}const Vr=a=>ee.create({user:a});async function Lr(a){const e=await ee.findOne({user:a}).lean();return e||y(await Vr(a))}const Jr=(a,e)=>ee.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Zr extends Xr{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Lr(e)}updateInDb(e,t){return Jr(e,t)}}const He=new Zr;class en 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 tn=async a=>await te.create({user:a});async function an(a){const e=await te.findOne({user:a}).lean();return e||y(await tn(a))}const rn=(a,e)=>te.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class nn extends en{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return an(e)}updateInDb(e,t){return rn(e,t)}}const sn=new nn;class un 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 cn=async a=>await ae.create({user:a});async function dn(a){const e=await ae.findOne({user:a}).lean();return e||y(await cn(a))}const ln=(a,e)=>ae.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class on extends un{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return dn(e)}updateInDb(e,t){return ln(e,t)}}const pn=new on;class yn 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 fn=async a=>await A.create({user:a});async function mn(a){const e=await A.findOne({user:a}).lean();return e||y(await fn(a))}const hn=(a,e)=>A.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class wn extends yn{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return mn(e)}updateInDb(e,t){return hn(e,t)}}const Sn=new wn;class gn 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 bn=async a=>await _.create({user:a});async function $n(a){const e=await _.findOne({user:a}).lean();return e||y(await bn(a))}const En=(a,e)=>_.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Un extends gn{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return $n(e)}updateInDb(e,t){return En(e,t)}}const In=new Un,Tn=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}}),ne=s.models?.Bans||s.model("Bans",Tn),On=a=>ne.create({...a});class Dn extends ${async getUnbanUsers(){return this.getMany({unbannedTimestamp:{$lte:new Date,$ne:null}})}async banUserFromGuild(e){await On(e)}async isBannedFromGuild(e,t){const r=await this.get({bannedUserId:e,guildId:t});return!!(r&&(!r.unbannedTimestamp||r.unbannedTimestamp>new Date))}}const Cn=a=>ne.find(a).lean(),vn=a=>ne.findOne(a).lean(),Rn=(a,e)=>ne.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class Mn extends Dn{constructor(){super(3600*36)}normalizeKey(e){return`${e.guildId}/${e.bannedUserId}`}getKey({bannedUserId:e,guildId:t}){return{bannedUserId:e,guildId:t}}fetchFromDb(e){return vn(e)}fetchManyFromDb(e){return Cn(e)}updateInDb(e,t){return Rn(e,t)}}const An=new Mn,_n=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}}}),se=s.models?.Invitation||s.model("Invitation",_n),Bn=a=>se.create({...a}),qn=async a=>{await se.deleteMany({...a})};class kn extends m{async sendInvitation({senderId:e,receiverId:t,gameMode:r,...n}){return await this.get({senderId:e,gameMode:r,receiverId:t})?!1:(await Bn({...n,senderId:e,gameMode:r,receiverId:t}),!0)}async receiveInvitation(e){return this.get(e)}async deleteInvitation(e){await qn(e),this.invalidate(e)}}const Nn=a=>se.findOne({...a}).lean(),xn=(a,e)=>se.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class Fn extends kn{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 Nn(e)}updateInDb(e,t){return xn(e,t)}}const jn=new Fn;class zn 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 Pn=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",Pn),Kn=a=>ge.create({guildId:a}),Qn=async a=>{const e=await ge.findOne({guildId:a}).lean();return e||y(await Kn(a))},Hn=(a,e)=>ge.findOneAndUpdate(a,e,{upsert:!0,returnDocument:"after"}).lean();class Wn extends zn{constructor(){super(3600*24*30)}normalizeKey(e){return e}getKey({guildId:e}){return e}fetchFromDb(e){return Qn(e)}updateInDb(e,t){return Hn(e,t)}}const Gn=new Wn,Yn=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}),ie=s.models?.Shop||s.model("Shop",Yn),Xn=a=>ie.create({shopType:a}),We=async a=>{const e=await ie.findOne({shopType:a}).lean();return e||y(await Xn(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 Vn 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 Ln 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 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 g.addItem(e,this.data.entityId,t)}isChest(){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)}isObject(){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.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 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)}isBottle(){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.addItem(e,this.data.entityId,t)}isRepair(){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)}isStore(){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 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(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 Vn({price:i,item:c,size:u,currency:l});if(S.isOrnament(c)&&S.isTitle(c))return new ns({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isChestItem(c))return new Jn({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isBoostItem(c))return new Ln({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isRepairItem(c))return new as({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isStoreItem(c))return new rs({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isObjectItem(c))return new Zn({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isEquipment(c))return new es({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isBottleItem(c))return new ts({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 is=(a,e)=>ie.findOneAndUpdate(a,e,{upsert:!0,returnDocument:"after"}).lean();class us extends ss{constructor(){super(3600)}normalizeKey(e){return e}getKey({shopType:e}){return e}fetchFromDb(e){return We(e)}updateInDb(e,t){return is(e,t)}}const cs=new us,ds=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",ds),ls=a=>Ge.countDocuments(a);class os extends ${getUserWarns(e){return this.getMany({warnedUserId:e})}getUserWarnCount(e){return ls({warnedUserId:e})}}const ps=a=>Ge.find(a).lean();class ys extends os{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 ps(e)}updateInDb(){throw new Error("Method not implemented.")}}const fs=new ys,ms=a=>{s.connect(a)};class hs extends s.Types.ObjectId{}d.COOLDOWN_COMMANDS=Gt,d.ObjectId=hs,d.QUEST_MIDDLEWARE_EVENT_NAME=w,d.RAID_MIDDLEWARE_EVENT_NAME=P,d.banService=An,d.connectToServices=ms,d.crewMetaService=le,d.crewOrnamentsService=yt,d.crewQuestService=bt,d.crewService=Ue,d.crewStatsEngagementService=Ot,d.crewStatsFrequencyService=At,d.emitQuestMiddlewareEvent=h,d.emitRaidMiddlewareEvent=z,d.entityService=p,d.findShop=We,d.invitationService=jn,d.ornamentService=S,d.panoplyService=U,d.registerQuestMiddlewareEvents=Le,d.registerRaidMiddlewareEvents=Je,d.reminderService=k,d.settingsService=Gn,d.shopModel=ie,d.shopService=cs,d.userCooldownService=Qe,d.userCrewService=Ke,d.userDailyReportService=Sr,d.userEncyclopediaService=re,d.userGamesService=Ir,d.userInventoryService=g,d.userMetaService=I,d.userOrnamentService=x,d.userQuestService=Se,d.userRaidService=Rr,d.userService=Pe,d.userSettingsService=we,d.userShopService=kr,d.userStatsCasinoService=Pr,d.userStatsCrewService=Yr,d.userStatsEconomyService=He,d.userStatsEngagementService=sn,d.userStatsFlagsService=pn,d.userStatsFrequencyService=Sn,d.userStatsInventoryService=In,d.warnService=fs,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,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,z=(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)})},P={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.boost}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)??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({user:a}).lean();return e||y(await nt(a))}const it=(a,e)=>le.findOneAndUpdate({user: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 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(a){h(w.CREW_STATS_FREQUENCY,a.crew._id,a)});const fe=s.models?.CrewStatsFrequency||s.model("CrewStatsFrequency",Ce),Ct=a=>fe.create({crew:a});async function vt(a){const e=await fe.findOne({crew:a}).lean();return e||y(await Ct(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 vt(e)}updateInDb(e,t){return Rt(e,t)}}const At=new Mt,ve=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});ve.post("findOneAndUpdate",function(a){z(P.USER_QUEST,a.user._id,a),h(w.USER_QUEST,a.user._id,a)});const D=s.models?.UserQuest||s.model("UserQuest",ve),_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){z(P.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)},v={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:[v],default:[]},work:{type:[v],default:[]}},berry:{work:{type:[v],default:[]},global:{type:[v],default:[]}},drop:{work:{type:[v],default:[]}},xp:{global:{type:[v],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 R=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){z(P.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),ze=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}}});ze.post("findOneAndUpdate",function(a){h(w.USER_STATS_INVENTORY,a.user._id,a)});const _=s.models?.UserStatsInventory||s.model("UserStatsInventory",ze),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 R.deleteOne({user:a}),await V.deleteOne({user:a}),await D.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 zt 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 D.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 Pt=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 zt{constructor(){super(3600)}normalizeKey(e){return e}getKey({discordId:e}){return e}fetchFromDb(e){return Qt(e)}fetchManyFromDb(e){return Pt(e)}updateInDb(e,t){return Ht(e,t)}}const Pe=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(),Ca=a=>C.findOne({user:a}).lean(),va=(a,e)=>C.findOneAndUpdate({user:a},e).lean();class Ra extends Oa{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Ca(e)}fetchManyFromDb(e){return Da(e)}updateInDb(e,t){return va(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:{id: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 za extends m{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 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 R.aggregate([{$setWindowFields:{sortBy:{"xp.amount":-1},output:{rank:{$rank:{}}}}},{$match:{_id:e}},{$project:{rank:1}}]))[0]}async getBerryRank(e){return(await R.aggregate([{$setWindowFields:{sortBy:{berry:-1},output:{rank:{$rank:{}}}}},{$match:{_id: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(O=>O.panoplyId===i.panoply);if(!c)return;const b=c.equipments.filter(O=>(u.find(ce=>O.entityId===ce.entityId)||!n&&i.entityId===O.entityId)&&(n?i.entityId!==O.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 Pa=async a=>await R.create({user:a});async function Ka(a){const e=await R.findOne({user:a}).lean();return e||y(await Pa(a))}const Qa=(a,e)=>R.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).lean();class Ha extends za{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Ka(e)}updateInDb(e,t){return Qa(e,t)}}const I=new Ha;class Wa extends ${async updateSendDailyQuest(e,t){await this.update({discordId:e},{$set:{sendDailyQuest:t}})}async updateSendDailyReport(e,t){await this.update({discordId:e},{$set:{sendDailyReport:t}})}async updateInventorySort(e,t){await this.update({discordId:e},{$set:{"sort.inventory":t}})}async updateReminderSettings(e,t,r){await this.update({discordId:e},{$set:{[`reminder.${t}`]:r}})}getUsersWithDailyReportEnable(){return this.getMany({"settings.sendDailyReport":!0,faction:{$ne:"citizen"}})}}const Ga=a=>B.find(a).lean(),Ya=async a=>await B.create({user:a});async function Xa(a){const e=await B.findOne({user:a}).lean();return e||y(await Ya(a))}const Va=(a,e)=>B.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).lean();class La extends Wa{constructor(){super(3600)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return Xa(e)}fetchManyFromDb(e){return Ga(e)}updateInDb(e,t){return Va(e,t)}}const we=new La;class Ja 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 Za=async a=>await H.create({user:a});async function er(a){const e=await H.findOne({user:a}).lean();return e||y(await Za(a))}const tr=(a,e)=>H.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).lean();class ar extends Ja{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return er(e)}updateInDb(e,t){return tr(e,t)}}const Qe=new ar;class rr 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 nr=async a=>await V.create({user:a});async function sr(a){const e=await V.findOne({user:a}).lean();return e||y(await nr(a))}const ir=async(a,e)=>V.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class ur extends rr{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return sr(e)}updateInDb(e,t){return ir(e,t)}}const x=new ur;class cr 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 dr(a){return D.find(a).lean()}const lr=async a=>await D.create({...a});async function or(a){const e=await D.findOne(a).lean();return e||y(await lr(a))}function pr(a,e,t){return D.findOneAndUpdate(a,e,{upsert:!0,...t,returnDocument:"after"}).lean()}class yr extends cr{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 or(e)}fetchManyFromDb(e){return dr(e)}updateInDb(e,t,r){return pr(e,t,r)}}const Se=new yr;class fr 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:O}=l,{voice:ce,amount:Ss}=O,{unlockedBadges:gs,unlockedBackgrounds:bs,unlockedTitles:$s}=b;return{berry:F-u,xp:Ss-i,voice:o.sameDay(ce.lastConnection,o.yesterday())?ce.minutesInVoiceToday:0,quest:o.exclude(c.map(({questId:Es})=>Es),n),badge:o.exclude(gs,r.unlockedBadges),title:o.exclude($s,r.unlockedTitles),background:o.exclude(bs,r.unlockedBackgrounds)}}async getAllDailyReportsToSend(){const e=await Pe.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 mr=a=>W.create({user:a});async function hr(a){const e=await W.findOne({user:a}).lean();return e||y(await mr(a))}const wr=(a,e)=>W.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Sr extends fr{constructor(){super(60)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return hr(e)}updateInDb(e,t){return wr(e,t)}}const gr=new Sr;class br 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 $r=async a=>await Y.create({user:a});async function Er(a){const e=await Y.findOne({user:a}).lean();return e||y(await $r(a))}const Ur=(a,e)=>Y.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Ir extends br{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Er(e)}updateInDb(e,t){return Ur(e,t)}}const Tr=new Ir;class Or 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 Dr=a=>L.create({user:a}),Cr=async a=>{const e=await L.findOne({user:a}).lean();return e||y(await Dr(a))},vr=(a,e)=>L.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"});class Rr extends Or{constructor(){super(3600)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Cr(e)}updateInDb(e,t){return vr(e,t)}}const Mr=new Rr;class Ar 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 _r=async a=>await J.create({user:a}),Br=async a=>{const e=await J.findOne({user:a}).lean();return e||y(await _r(a))},qr=(a,e)=>J.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class kr extends Ar{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Br(e)}updateInDb(e,t){return qr(e,t)}}const Nr=new kr;class xr 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 Fr=async a=>await M.create({user:a});async function jr(a){const e=await M.findOne({user:a}).lean();return e||y(await Fr(a))}const zr=(a,e)=>M.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Pr extends xr{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return jr(e)}updateInDb(e,t){return zr(e,t)}}const Kr=new Pr;class Qr 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 Hr=async a=>await Z.create({user:a});async function Wr(a){const e=await Z.findOne({user:a}).lean();return e||y(await Hr(a))}const Gr=(a,e)=>Z.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Yr extends Qr{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Wr(e)}updateInDb(e,t){return Gr(e,t)}}const Xr=new Yr;class Vr extends m{async workIncrement(e){await this.update(e,{$inc:{workCount:1}})}async updateTotalSpentInShop(e,t){await this.update(e,{$inc:{totalSpentInShop:t}})}}const Lr=a=>ee.create({user:a});async function Jr(a){const e=await ee.findOne({user:a}).lean();return e||y(await Lr(a))}const Zr=(a,e)=>ee.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class en extends Vr{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Jr(e)}updateInDb(e,t){return Zr(e,t)}}const He=new en;class tn 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 an=async a=>await te.create({user:a});async function rn(a){const e=await te.findOne({user:a}).lean();return e||y(await an(a))}const nn=(a,e)=>te.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class sn extends tn{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return rn(e)}updateInDb(e,t){return nn(e,t)}}const un=new sn;class cn 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 dn=async a=>await ae.create({user:a});async function ln(a){const e=await ae.findOne({user:a}).lean();return e||y(await dn(a))}const on=(a,e)=>ae.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class pn extends cn{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return ln(e)}updateInDb(e,t){return on(e,t)}}const yn=new pn;class fn 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 mn=async a=>await A.create({user:a});async function hn(a){const e=await A.findOne({user:a}).lean();return e||y(await mn(a))}const wn=(a,e)=>A.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Sn extends fn{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return hn(e)}updateInDb(e,t){return wn(e,t)}}const gn=new Sn;class bn 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 $n=async a=>await _.create({user:a});async function En(a){const e=await _.findOne({user:a}).lean();return e||y(await $n(a))}const Un=(a,e)=>_.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class In extends bn{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return En(e)}updateInDb(e,t){return Un(e,t)}}const Tn=new In,On=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",On),Dn=a=>se.create({...a});class Cn extends ${async getUnbanUsers(){return this.getMany({unbannedTimestamp:{$lte:new Date,$ne:null}})}async banUserFromGuild(e){await Dn(e)}async isBannedFromGuild(e,t){const r=await this.get({bannedUserId:e,guildId:t});return!!(r&&(!r.unbannedTimestamp||r.unbannedTimestamp>new Date))}}const vn=a=>se.find(a).lean(),Rn=a=>se.findOne(a).lean(),Mn=(a,e)=>se.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class An 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 Rn(e)}fetchManyFromDb(e){return vn(e)}updateInDb(e,t){return Mn(e,t)}}const _n=new An,Bn=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",Bn),qn=a=>ie.create({...a}),kn=async a=>{await ie.deleteMany({...a})};class Nn extends m{async sendInvitation({senderId:e,receiverId:t,gameMode:r,...n}){return await this.get({senderId:e,gameMode:r,receiverId:t})?!1:(await qn({...n,senderId:e,gameMode:r,receiverId:t}),!0)}async receiveInvitation(e){return this.get(e)}async deleteInvitation(e){await kn(e),this.invalidate(e)}}const xn=a=>ie.findOne({...a}).lean(),Fn=(a,e)=>ie.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class jn extends Nn{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 xn(e)}updateInDb(e,t){return Fn(e,t)}}const zn=new jn;class Pn 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 Kn=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",Kn),Qn=a=>ge.create({guildId:a}),Hn=async a=>{const e=await ge.findOne({guildId:a}).lean();return e||y(await Qn(a))},Wn=(a,e)=>ge.findOneAndUpdate(a,e,{upsert:!0,returnDocument:"after"}).lean();class Gn extends Pn{constructor(){super(3600*24*30)}normalizeKey(e){return e}getKey({guildId:e}){return e}fetchFromDb(e){return Hn(e)}updateInDb(e,t){return Wn(e,t)}}const Yn=new Gn,Xn=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",Xn),Vn=a=>ue.create({shopType:a}),We=async a=>{const e=await ue.findOne({shopType:a}).lean();return e||y(await Vn(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 Ln 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 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 g.addItem(e,this.data.entityId,t)}isBoostXp(){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)}isChest(){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)}isObject(){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.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 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.addItem(e,this.data.entityId,t)}isBottle(){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)}isRepair(){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)}isStore(){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 x.unlockTitle(e,this.data.ornamentId)}isTitle(){return!0}}class is 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 Ln({price:i,item:c,size:u,currency:l});if(S.isOrnament(c)&&S.isTitle(c))return new ss({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isChestItem(c))return new Zn({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isBoostItem(c))return new Jn({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isRepairItem(c))return new rs({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isStoreItem(c))return new ns({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isObjectItem(c))return new es({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isEquipment(c))return new ts({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isBottleItem(c))return new as({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 us=(a,e)=>ue.findOneAndUpdate(a,e,{upsert:!0,returnDocument:"after"}).lean();class cs extends is{constructor(){super(3600)}normalizeKey(e){return e}getKey({shopType:e}){return e}fetchFromDb(e){return We(e)}updateInDb(e,t){return us(e,t)}}const ds=new cs,ls=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",ls),os=a=>Ge.countDocuments(a);class ps extends ${getUserWarns(e){return this.getMany({warnedUserId:e})}getUserWarnCount(e){return os({warnedUserId:e})}}const ys=a=>Ge.find(a).lean();class fs extends ps{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 ys(e)}updateInDb(){throw new Error("Method not implemented.")}}const ms=new fs,hs=a=>{s.connect(a)};class ws extends s.Types.ObjectId{}d.COOLDOWN_COMMANDS=Gt,d.ObjectId=ws,d.QUEST_MIDDLEWARE_EVENT_NAME=w,d.RAID_MIDDLEWARE_EVENT_NAME=P,d.banService=_n,d.connectToServices=hs,d.crewMetaService=oe,d.crewOrnamentsService=yt,d.crewQuestService=bt,d.crewService=Ue,d.crewStatsEngagementService=Ot,d.crewStatsFrequencyService=At,d.emitQuestMiddlewareEvent=h,d.emitRaidMiddlewareEvent=z,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=Yn,d.shopModel=ue,d.shopService=ds,d.userCooldownService=Qe,d.userCrewService=Ke,d.userDailyReportService=gr,d.userEncyclopediaService=ne,d.userGamesService=Tr,d.userInventoryService=g,d.userMetaService=I,d.userOrnamentService=x,d.userQuestService=Se,d.userRaidService=Mr,d.userService=Pe,d.userSettingsService=we,d.userShopService=Nr,d.userStatsCasinoService=Kr,d.userStatsCrewService=Xr,d.userStatsEconomyService=He,d.userStatsEngagementService=un,d.userStatsFlagsService=yn,d.userStatsFrequencyService=gn,d.userStatsInventoryService=Tn,d.warnService=ms,Object.defineProperty(d,Symbol.toStringTag,{value:"Module"})}));
|
|
@@ -5,6 +5,7 @@ import { EntityHelper } from './helper';
|
|
|
5
5
|
import type { EntityDocument } from './types';
|
|
6
6
|
declare class EntityService extends EntityHelper {
|
|
7
7
|
constructor();
|
|
8
|
+
createInDb(entity: Entity): Promise<EntityDocument>;
|
|
8
9
|
protected updateInDb(filter: RootFilterQuery<EntityDocument>, update: MongooseUpdate<EntityDocument>): Promise<Lean<EntityDocument> | null>;
|
|
9
10
|
protected fetchFromDb(id: string): Promise<(import("mongoose").FlattenMaps<EntityDocument> & Required<{
|
|
10
11
|
_id: import("mongoose").Types.ObjectId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/entities/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/entities/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,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,EAAE,EAAE,MAAM;;;;;IAIhC,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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opfr/services",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "OPFR services",
|
|
6
6
|
"author": "Matthieu VEIGA",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"@faker-js/faker": "10.1.0",
|
|
23
|
-
"@opfr/definitions": "^1.
|
|
23
|
+
"@opfr/definitions": "^1.2.0",
|
|
24
24
|
"@opfr/utils-lang": "^1.0.2",
|
|
25
25
|
"@opfr/utils-type": "^1.0.1",
|
|
26
26
|
"mongodb-memory-server": "11.0.1",
|
|
@@ -49,5 +49,5 @@
|
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"node-cache": "^5"
|
|
51
51
|
},
|
|
52
|
-
"gitHead": "
|
|
52
|
+
"gitHead": "5d49d967a17c70a6b770f8693a8fa22c06f16420"
|
|
53
53
|
}
|