@opfr/services 1.6.0 → 1.7.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.es.js +1140 -780
- package/dist/index.umd.js +1 -1
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/reminder/types.d.ts +1 -2
- package/dist/services/reminder/types.d.ts.map +1 -1
- package/dist/services/story/definition/model.d.ts +4 -0
- package/dist/services/story/definition/model.d.ts.map +1 -0
- package/dist/services/story/definition/schema.d.ts +13 -0
- package/dist/services/story/definition/schema.d.ts.map +1 -0
- package/dist/services/story/helper.d.ts +10 -0
- package/dist/services/story/helper.d.ts.map +1 -0
- package/dist/services/story/index.d.ts +3 -0
- package/dist/services/story/index.d.ts.map +1 -0
- package/dist/services/story/process/create.d.ts +3 -0
- package/dist/services/story/process/create.d.ts.map +1 -0
- package/dist/services/story/process/findMany.d.ts +5 -0
- package/dist/services/story/process/findMany.d.ts.map +1 -0
- package/dist/services/story/process/findOne.d.ts +4 -0
- package/dist/services/story/process/findOne.d.ts.map +1 -0
- package/dist/services/story/process/updateOne.d.ts +4 -0
- package/dist/services/story/process/updateOne.d.ts.map +1 -0
- package/dist/services/story/service.d.ts +15 -0
- package/dist/services/story/service.d.ts.map +1 -0
- package/dist/services/story/types.d.ts +11 -0
- package/dist/services/story/types.d.ts.map +1 -0
- package/dist/services/user-cooldown/definition/schema.d.ts.map +1 -1
- package/dist/services/user-cooldown/helper.d.ts +3 -3
- package/dist/services/user-cooldown/helper.d.ts.map +1 -1
- package/dist/services/user-cooldown/index.d.ts +0 -1
- package/dist/services/user-cooldown/index.d.ts.map +1 -1
- package/dist/services/user-cooldown/types.d.ts +1 -8
- package/dist/services/user-cooldown/types.d.ts.map +1 -1
- package/dist/services/user-settings/definition/schema.d.ts.map +1 -1
- package/dist/services/user-settings/types.d.ts +1 -6
- package/dist/services/user-settings/types.d.ts.map +1 -1
- package/dist/services/user-story/definition/model.d.ts +4 -0
- package/dist/services/user-story/definition/model.d.ts.map +1 -0
- package/dist/services/user-story/definition/schema.d.ts +13 -0
- package/dist/services/user-story/definition/schema.d.ts.map +1 -0
- package/dist/services/user-story/helper.d.ts +31 -0
- package/dist/services/user-story/helper.d.ts.map +1 -0
- package/dist/services/user-story/index.d.ts +3 -0
- package/dist/services/user-story/index.d.ts.map +1 -0
- package/dist/services/user-story/process/create.d.ts +4 -0
- package/dist/services/user-story/process/create.d.ts.map +1 -0
- package/dist/services/user-story/process/deleteOne.d.ts +3 -0
- package/dist/services/user-story/process/deleteOne.d.ts.map +1 -0
- package/dist/services/user-story/process/findMany.d.ts +5 -0
- package/dist/services/user-story/process/findMany.d.ts.map +1 -0
- package/dist/services/user-story/process/findOne.d.ts +5 -0
- package/dist/services/user-story/process/findOne.d.ts.map +1 -0
- package/dist/services/user-story/process/updateOne.d.ts +5 -0
- package/dist/services/user-story/process/updateOne.d.ts.map +1 -0
- package/dist/services/user-story/service.d.ts +15 -0
- package/dist/services/user-story/service.d.ts.map +1 -0
- package/dist/services/user-story/types.d.ts +43 -0
- package/dist/services/user-story/types.d.ts.map +1 -0
- package/dist/services/user-story/utils.d.ts +8 -0
- package/dist/services/user-story/utils.d.ts.map +1 -0
- package/package.json +3 -3
- package/dist/services/user-cooldown/constants.d.ts +0 -2
- package/dist/services/user-cooldown/constants.d.ts.map +0 -1
package/dist/index.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(c,s){typeof exports=="object"&&typeof module<"u"?s(exports,require("mongoose"),require("@opfr/definitions"),require("node-cache"),require("events"),require("@opfr/utils-lang")):typeof define=="function"&&define.amd?define(["exports","mongoose","@opfr/definitions","node-cache","events","@opfr/utils-lang"],s):(c=typeof globalThis<"u"?globalThis:c||self,s(c.services={},c.mongoose,c["@opfr/definitions"],c["node-cache"],c.events,c["@opfr/utils-lang"]))})(this,(function(c,s,p,Ue,Ee,d){"use strict";function De(a){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(a){for(const t in a)if(t!=="default"){const n=Object.getOwnPropertyDescriptor(a,t);Object.defineProperty(e,t,n.get?n:{enumerable:!0,get:()=>a[t]})}}return e.default=a,Object.freeze(e)}const ue=De(Ee),N="___ALL_ENTITIES___";class f{cache;constructor(e){this.cache=new Ue({stdTTL:e,checkperiod:e*.2,useClones:!1})}async get(e,t){const n=this.normalizeKey(e),r=this.cache.get(n);if(r)return r;const i=await this.fetchFromDb(e,t??{});return i&&this.cache.set(n,i),i}async update(e,t,n){const r=await this.updateInDb(e,t,n);if(r){const i=this.getKey(r);this.cache.del(N),this.cache.set(this.normalizeKey(i),r)}return r}invalidate(e){this.cache.del(N),e&&this.cache.del(this.normalizeKey(e))}clearAll(){this.cache.flushAll()}}class w extends f{async getAll(){const e=this.cache.get(N);if(e)return e;const t=await this.fetchManyFromDb({},{});return this.cache.set(N,t),t.forEach(n=>{this.cache.set(this.normalizeKey(this.getKey(n)),n)}),t}async getMany(e,t={}){const n=await this.fetchManyFromDb(e,t);return n.forEach(r=>{this.cache.set(this.normalizeKey(this.getKey(r)),r)}),n}}const ce=new ue.EventEmitter,h=(a,e,t)=>{ce.emit(a,e,t)},Te=a=>{for(const[e,t]of Object.entries(a))ce.on(e,(n,r)=>{t(n,r)})},S={USER:"middleware/quest/USER",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_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"},de=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:p.QuestStatus.IN_PROGRESS,index:1},lastCompletionDate:Date,streak:Number},{minimize:!1});de.post("findOneAndUpdate",function(a){a&&h(S.USER_QUEST,a.user._id,a)});const v=s.models?.UserQuest||s.model("UserQuest",de),Oe=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)},doubleOrQuit:{type:Date,default:new Date(0)},priceIsRight:{type:Date,default:new Date(0)},blackJack:{type:Date,default:new Date(0)},rps:{type:Date,default:new Date(0)}}}),F=s.models?.UserCooldown||s.model("UserCooldown",Oe),Ie=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}}),j=s.models?.UserDailyReport||s.model("UserDailyReport",Ie),ve=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},encyclopedia:{type:[String],default:[]}}),H=s.models?.UserEncyclopedia||s.model("UserEncyclopedia",ve),Me=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}}),K=s.models?.UserGames||s.model("UserGames",Me),le=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});le.post("findOneAndUpdate",function(a){a&&h(S.USER_INVENTORY,a.user._id,a)});const P=s.models?.UserInventory||s.model("UserInventory",le),Ae=new ue.EventEmitter,ke=(a,e)=>{Ae.emit(a,e)},M={multiplier:{type:Number,default:0},origin:String,expireAt:{type:Date,default:null},startAt:{type:Date,default:null}},oe=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},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:[M],default:[]},work:{type:[M],default:[]}},berry:{work:{type:[M],default:[]},global:{type:[M],default:[]}},drop:{work:{type:[M],default:[]}},xp:{global:{type:[M],default:[]}}},hp:{type:Number,default:100},energyMax:{type:Number,default:10},energy:{type:Number,default:10},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}},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}}});oe.post("findOneAndUpdate",async function(a){a&&(h(S.USER_META,a.user._id,a),a.hp<=0&&ke("death",a.user._id))});const D=s.models?.UserMeta||s.model("UserMeta",oe),pe=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"}});pe.post("findOneAndUpdate",function(a){a&&h(S.USER_ORNAMENT,a.user._id,a)});const Q=s.models?.UserOrnament||s.model("UserOrnament",pe),qe=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",qe),ye=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}}});ye.post("findOneAndUpdate",function(a){a&&h(S.USER_STATS_CASINO,a.user._id,a)});const A=s.models?.UserStatsCasino||s.model("UserStatsCasino",ye),fe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},workCount:{type:Number,default:0},totalSpentInShop:{type:Number,default:0}});fe.post("findOneAndUpdate",function(a){a&&h(S.USER_STATS_ECONOMY,a.user._id,a)});const z=s.models?.UserStatsEconomy||s.model("UserStatsEconomy",fe),me=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:[]}});me.post("findOneAndUpdate",function(a){a&&h(S.USER_STATS_ENGAGEMENT,a.user._id,a)});const W=s.models?.UserStatsEngagement||s.model("UserStatsEngagement",me),he=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}}});he.post("findOneAndUpdate",function(a){a&&h(S.USER_STATS_FLAGS,a.user._id,a)});const G=s.models?.UserStatsFlags||s.model("UserStatsFlags",he),Se=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},edito:{readToday:{type:Number,default:0,index:!0},lastTimeRead:{type:Date,default:new Date,index:!0}}});Se.post("findOneAndUpdate",function(a){a&&h(S.USER_STATS_FREQUENCY,a.user._id,a)});const T=s.models?.UserStatsFrequency||s.model("UserStatsFrequency",Se),we=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}}});we.post("findOneAndUpdate",function(a){a&&h(S.USER_STATS_INVENTORY,a.user._id,a)});const k=s.models?.UserStatsInventory||s.model("UserStatsInventory",we),Z=new s.Schema({discordId:{type:String,required:!0,unique:!0},scam:{type:Boolean,default:!1},birthday:{type:Date,default:null,index:1},faction:{type:String,default:p.DEFAULT_FACTION,index:1},canChangeFaction:{type:Boolean,default:!1},canChooseFaction:{type:Boolean,default:!1}});Z.post("findOneAndUpdate",function(a){a&&h(S.USER,a._id,a)}),Z.post("deleteOne",async function(){const a=this.getQuery()._id;await F.deleteOne({user:a}),await j.deleteOne({user:a}),await H.deleteOne({user:a}),await K.deleteOne({user:a}),await P.deleteOne({user:a}),await D.deleteOne({user:a}),await Q.deleteOne({user:a}),await v.deleteMany({user:a}),await B.deleteOne({user:a}),await A.deleteOne({user:a}),await z.deleteOne({user:a}),await W.deleteOne({user:a}),await G.deleteOne({user:a}),await T.deleteOne({user:a}),await k.deleteOne({user:a})});const g=s.models?.User||s.model("User",Z);class Re extends w{getByObjectId(e){return this.update({_id:e},{})}getNextBirthdays(){const e=new Date,t=e.getFullYear();return g.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}}])}getFactionRanking(e){return g.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 g.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 g.aggregate([{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$sort:{"meta.berry":-1}},{$limit:10},{$project:{_id:1,discordId:1,"meta.berry":1}}])}getQuestRanking(){return v.aggregate([{$match:{status:p.QuestStatus.COMPLETED}},{$group:{_id:"$user",questCount:{$sum:1}}},{$setWindowFields:{sortBy:{questCount:-1},output:{rank:{$rank:{}}}}},{$sort:{rank:1}},{$limit:10},{$lookup:{from:"users",localField:"_id",foreignField:"_id",as:"user"}},{$unwind:"$user"},{$project:{_id:0,discordId:"$user.discordId",questCount:1,rank:1}}])}getTodayAllBirthday(){const e=new Date;return g.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}})}async updateScam(e,t){await this.update({discordId:e},{$set:{scam:t}})}}const Be=(a,e)=>g.find(a,{},e).lean(),y=a=>a.toObject({flattenMaps:!0,flattenObjectIds:!1}),_e=a=>g.create({discordId:a});async function Ce(a,{upsert:e=!0,...t}){const n=await g.findOne({discordId:a},{},t).lean();return!n&&e?y(await _e(a)):n}const xe=(a,e)=>g.findOneAndUpdate(a,e,{upsert:!0,returnDocument:"after"}).lean();class Ne extends Re{constructor(){super(3600)}normalizeKey(e){return e}getKey({discordId:e}){return e}fetchFromDb(e,t){return Ce(e,t)}fetchManyFromDb(e,t){return Be(e,t)}updateInDb(e,t){return xe(e,t)}}const ge=new Ne,Fe=["work",...p.GAME_TYPES],je=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}),_=s.models?.Reminder||s.model("Reminder",je),He=async a=>{await _.deleteMany(a)},Ke=async(a,e)=>{await _.deleteOne({user:a,type:e})};class Pe extends w{getAllPassedReminder(){return this.getMany({date:{$lte:new Date}})}async addReminder(e,t,n){await this.update({user:e,type:t},{$set:{date:n}},{upsert:!0})}async updateReminderDate(e,t,n){await this.update({user:e,type:t},[{$set:{date:{$add:["$date",n]}}}])}async removeReminder(e,t){await Ke(e,t),this.invalidate({user:e,type:t})}async deleteSelectedReminders(e){const t=e.map(n=>n._id);await He({_id:{$in:t}}),e.forEach(n=>{this.invalidate({user:n.user,type:n.type})})}}function Qe(a,e){return _.find(a,{},e).lean()}async function ze(a){const e=await _.findOne(a).lean();return e||null}async function We(a,e,t){return _.findOneAndUpdate(a,e,{...t,returnDocument:"after"}).lean()}class Ge extends Pe{constructor(){super(300)}getKey(e){return{user:e.user,type:e.type}}normalizeKey({user:e,type:t}){return`${e.toString()}/${t}`}fetchFromDb(e){return ze(e)}fetchManyFromDb(e,t){return Qe(e,t)}updateInDb(e,t,n={upsert:!1}){return We(e,t,n)}}const be=new Ge,Ye=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}),C=s.models?.Panoplies||s.model("Panoplies",Ye),Ve=(a,e)=>C.find(a,{},e).lean(),Xe=async(a,e)=>C.find(a,{},e).populate("equipments");async function Le(a){const e=await C.findOne({panoplyId:a}).lean();return e||null}const Je=async a=>C.findOne(a).populate("equipments");class Ze extends w{getAllPopulated(){return Xe({},{})}getPopulated(e){return Je({panoplyId:e})}hasPanoply(e,t){const n=d.filterNullAndUndefined(Object.values(e)),r=t.equipments.filter(i=>n.find(u=>u.entityId===i.entityId)).length;if(r===t.equipments.length)return t.fullBonus;if(r>=t.equipments.length/2)return t.halfBonus}async getPanoplyBonus(e){const t=[],n=await this.getAllPopulated();for(const r of n){const i=d.filterNullAndUndefined(Object.values(e)),u=r.equipments.filter(l=>i.find(({entityId:o})=>o===l.entityId));u.length===r.equipments.length?t.push([r,"full"]):u.length>=r.equipments.length/2?t.push([r,"half"]):u.length>=1&&t.push([r,null])}return t}}const et=async(a,e)=>C.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class tt extends Ze{constructor(){super(3600)}normalizeKey(e){return e}getKey({panoplyId:e}){return e}updateInDb(e,t){return et(e,t)}fetchFromDb(e){return Le(e)}fetchManyFromDb(e,t){return Ve(e,t)}}const O=new tt,at=new s.Schema({type:{type:String,enum:p.EFFECT_KEYS,required:!0},params:{type:s.Schema.Types.Mixed}},{_id:!1}),nt=new s.Schema({entityId:{unique:!0,required:!0,type:String}},{minimize:!1,discriminatorKey:"type"}),rt=new s.Schema({category:{required:!0,type:String},subtype:{type:String},rankId:String,effects:{type:[at],default:[]},usage:{_id:!1,type:{mode:String,craft:Boolean},default:void 0}}),st=new s.Schema({category:{required:!0,type:String},characteristics:{_id:!1,type:Object},panoply:String}),q=s.models?.Entities||s.model("Entities",nt),it=q.discriminator("item",rt);q.discriminator("equipment",st);const ut=async(a,e)=>q.find(a,{},e).lean(),ct=async(a,e)=>it.find(a,{},e).lean();class dt extends w{isEntity(e){return!!e&&"entityId"in e}isItem(e){return e.type==="item"}isEquipment(e){return e.type==="equipment"}async isEntityId(e,t=()=>!0){return(await this.getAll()).filter(t).map(({entityId:r})=>r).includes(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 d.recordToArray(e).reduce((n,[r,i])=>{const u=t.find(({entityId:l})=>l===r);return u&&n.push([u,i]),n},[])}async getAllEntitiesLimit(){const e=await this.getAll();return d.arrayToRecord(e.map(t=>[t.entityId,t.shop?.limit??0]))}async getAllEntitiesBy(e){return(await this.getAll()).filter(e)}async getAllItemsBy(e){return(await ct({},{})).filter(e)}async fromDBToEquipableEquipment(e){const n=(await this.getAll()).filter(r=>this.isEquipment(r)).find(({entityId:r})=>r===e.entityId);if(!n)throw new Error(`cannot find any equipment: ${e.entityId}`);return this.seedEquipment(n,e.seed)}async getUserEquipmentsCharacteristics(e){let t={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};const n=await O.getAllPopulated();for(const r of p.EQUIPMENT_SLOT){const i=e[r];i&&(t=d.mergeObjects(t,(await this.fromDBToEquipableEquipment(i)).characteristics,(u,l)=>u+l))}for(const r of n){const i=O.hasPanoply(e,r);i&&!("target"in i)&&(t=d.mergeObjects(t,i,(u,l)=>u+l))}return t}filterUsableEntities(e){return e.filter(t=>this.isConsumableItem(t)&&t.usage?.mode)}hasUsableEntities(e){return!!e.find(t=>this.isConsumableItem(t)&&t.usage?.mode)}isChestItem(e){return this.isItem(e)&&e.category==="chest"}isConsumableItem(e){return this.isItem(e)&&e.category==="consumable"}isResourceItem(e){return this.isItem(e)&&e.category==="resource"}isSameEquipment(e,t){return e.entityId===t.entityId&&e.seed===t.seed}seedEquipment(e,t){const n=d.seededRandom(t),r=d.sortBy(d.recordToArray(e.characteristics),([i])=>i);return{...e,seed:t,characteristics:Object.fromEntries(r.map(([i,u])=>[i,Array.isArray(u)?d.randomBetween(u[0],u[1]+1,n):u]))}}isEquipped(e,t){return!!Object.values(e).find(n=>n&&this.isSameEquipment(n,t))}}const lt=async a=>await q.create({...a});async function ot(a){const e=await q.findOne({entityId:a}).lean();return e||null}const pt=(a,e)=>q.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class yt extends dt{constructor(){super(3600)}createInDb(e){return lt(e)}updateInDb(e,t){return pt(e,t)}fetchFromDb(e){return ot(e)}fetchManyFromDb(e,t){return ut(e,t)}normalizeKey(e){return e}getKey(e){return e.entityId}}const m=new yt;class ft extends f{hasAlreadyFoundEntity(e,t){return e.encyclopedia.includes(t)}async addEntities(e,t){await this.update(e,{$addToSet:{encyclopedia:{$each:t}}})}}const mt=async a=>await H.create({user:a});async function ht(a){const e=await H.findOne({user:a}).lean();return e||y(await mt(a))}const St=(a,e)=>H.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class wt extends ft{constructor(){super(300)}fetchFromDb(e){return ht(e)}getKey({user:e}){return e}normalizeKey(e){return e.toString()}updateInDb(e,t){return St(e,t)}}const Y=new wt;class gt extends f{async getUserEquipmentsCharacteristics(e){let t={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};for(const n of p.EQUIPMENT_SLOT){const r=e.equippedItems?.[n];if(!r)continue;const i=await m.fromDBToEquipableEquipment(r);t=d.mergeObjects(t,i.characteristics,(u,l)=>u+l)}return t}async hasInventoryRequirements(e,t){const n=await this.get(e);return d.recordToArray(t).reduce((r,[i,u])=>r&&(n.itemList[i]??0)>=(u??0),!0)}async hasEnoughEntity(e,t,n){return((await this.get(e)).itemList[n]??0)>=t}async getItemList(e){return(await this.get(e)).itemList}async calcMinStreakForWorkLoot(e){const t=await this.get(e),n=(await O.getPanoplyBonus(t.equippedItems)).find(([r,i])=>r.panoplyId==="marine"&&i!==null);return n&&n[1]==="full"?10:n&&n[1]==="half"?20:1/0}async hasRevolutionaryBuff(e){const t=await this.get(e);return(await O.getPanoplyBonus(t.equippedItems)).find(([r,i])=>r.panoplyId==="revolutionary"&&i!==null)?.[1]??null}async addItem(e,t,n){await this.update(e,{$inc:{[`itemList.${t}`]:n}}),await Y.addEntities(e,[t])}async addItems(e,t){await this.update(e,{$inc:Object.fromEntries(Object.entries(t).filter(([,n])=>(n??0)>0).map(([n,r])=>[`itemList.${n}`,r]))}),await Y.addEntities(e,d.recordToArray(t).filter(([,n])=>n>0).map(([n])=>n))}async removeItem(e,t,n){n!==0&&await this.update(e,[{$set:{[`itemList.${t}`]:{$max:[{$add:[`$itemList.${t}`,-n]},0]}}}])}async removeEquipment(e,t,n){await this.update(e,{$pull:{equipmentList:{entityId:t,seed:n}}})}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 Y.addEntities(e,t.map(n=>n.entityId))}async saveEquipments(e){await this.update(e,[{$set:{equipmentSave:{$push:["$equipmentSave","$equippedItems"]}}}])}async changeEquippedEquipment(e,t){const n=await this.get(e);n?.equipmentSave[t]&&await this.equip(e,n.equipmentSave[t])}async equip(e,t){const n=await U.getMaxHp(e),r=Object.fromEntries(d.recordToArray(t).map(([i,u])=>[`equippedItems.${i}`,u]));await this.update(e,{$set:r}),await U.updateHp(e,n)}async unequip(e,t){const n=await U.getMaxHp(e);await this.update(e,{$set:{[`equippedItems.${t}`]:null}}),await U.updateHp(e,n)}async craftItem(e,t,n,r){for(const{entityId:l,size:o}of t.entities)await this.removeItem(e,l,o*n);const{entityId:i,size:u}=t.result;await m.isEntityId(i,m.isEquipment)?await this.addEquipments(e,[{entityId:i,seed:r}]):await m.isEntityId(i,m.isItem)&&await this.addItem(e,i,u*n)}async dismantleEntity(e,t,n,r,i){m.isEquipment(t)?await this.removeEquipment(e,t.entityId,i):m.isItem(t)&&await this.removeItem(e,t.entityId,r);for(const{entityId:u,quantity:l}of n)await m.isEntityId(u,m.isItem)&&await this.addItem(e,u,r*l);await this.removeItem(e,"tools",1)}async enchantItem(e,t,n,r,i){await this.removeItem(e,t,i*4),await this.removeItem(e,r,i),await this.addItem(e,n,i)}async unlockRecipe(e,t){await this.update(e,{$addToSet:{recipes:t}})}}const bt=a=>P.create({user:a});async function $t(a){const e=await P.findOne({user:a}).lean();return e||y(await bt(a))}const Ut=(a,e)=>P.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Et extends gt{constructor(){super(300)}fetchFromDb(e){return $t(e)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}updateInDb(e,t){return Ut(e,t)}}const $=new Et;class Dt extends w{async getTotalCharacteristics(e){const{characteristics:t,scrolls:n}=await this.get(e);return d.arrayToRecord(p.CHARACTERISTICS.map(r=>[r,p.getComputedCharacteristicValue(t[r])+n[r]]))}async isCooldownForXpPassed(e){const t=await this.get(e);return Date.now()-t.xp.lastMessageWithXp.getTime()>60*1e3}async getAllWithExpiredBuffs(){const e=new Date;return this.getMany({$or:[{"xp.boost":{$lt:e}},{"buffs.cooldown.casino":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.cooldown.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.berry.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.berry.global":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.drop.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.xp.global":{$elemMatch:{expireAt:{$lt:e}}}}]})}async calcXpBoost(e){const t=await this.get(e),{boost:n}=t.xp,r=n!==null&&Date.now()<n.getTime()?.2:0,i=Math.max(t.premium?.5:0,t.booster?.25:0);return r+i+t.buffs.xp.global.reduce((u,{expireAt:l,startAt:o,multiplier:E})=>o&&o>new Date||l&&d.hasExpire(l)?u:u+E,0)}calcMessageXp(e){const t=e.trim().length,n=2;return t<10?10*n:t>300?300*n:t*n}async getXpDeathPenalties(e){const t=await this.get(e),n=p.getCurrentLevel(t.xp.amount);return n<=10?5e3:n<=20?1e4:n<=30?2e4:n<=40?3e4:n<=50?5e4:n<=60?75e3:n<=70?15e4:n<=80?25e4:n<=90?4e5:n<=100?75e4:14e6}async calcXp(e,t,n){return t*=1+await this.calcXpBoost(e),Math.ceil(t*n)}async calcBerry(e,t,n){if(t<=0)return t;const r=n?1:await this.calcBuffMultiplier(e,"berry","global");return Math.ceil(t*(r||1))}async calcBuffMultiplier(e,t,n){return(await this.get(e)).buffs[t][n].reduce((u,{expireAt:l,startAt:o,multiplier:E})=>u+(new Date>=(o??new Date)&&(!l||!d.hasExpire(l))?E:0),1)}async getMaxHp(e){const t=await $.get(e),{vitality:n}=await this.getTotalCharacteristics(e),r=await $.getUserEquipmentsCharacteristics(t);return(n+r.vitality)*p.HP_PER_VITALITY+p.DEFAULT_MAX_HP}async getHpRatio(e){const t=await this.get(e),n=await this.getMaxHp(e);return Math.min(t.hp/n,1)}async hasCharacteristicRequirement(e,t){const n=await $.get(e),r=await $.getUserEquipmentsCharacteristics(n),i=d.mergeObjects(await this.getTotalCharacteristics(e),r,(u,l)=>u+l);if("sum"in t){let u=0;for(const l of t.characteristics)u+=i[l]??0;return u>=t.sum}else{for(const u of Object.keys(t))if(i[u]<(t[u]??0))return!1;return!0}}async hasMalusBuff(e){const t=await this.get(e);for(const n of Object.values(t.buffs))for(const r of Object.values(n))for(const{multiplier:i,startAt:u,expireAt:l}of r)if(i<0&&(!l||!d.hasExpire(l))&&(u??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:n}}=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 n}async updateBuff(e,t){if(Array.isArray(t)){for(const r of t)await this.updateBuff(e,r);return}const n=p.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:n.expireAt?{$cond:{if:{$lt:["$$buff.expireAt",new Date]},then:n.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}`,[{...n}]]}}}}}])}async removeBuff(e,t){await this.update(e,{$pull:{[`buffs.${t.target}`]:{origin:t.origin}}})}async updatePanoplyBuff(e,t,n,r){const i=await m.fromDBToEquipableEquipment(t),u=d.filterNullAndUndefined(Object.values(n)),o=(await O.getAllPopulated()).find(I=>I.panoplyId===i.panoply);if(!o)return;const E=o.equipments.filter(I=>(u.find(ie=>I.entityId===ie.entityId)||!r&&i.entityId===I.entityId)&&(r?i.entityId!==I.entityId:!0)).length,x=E===o.equipments.length?o.fullBonus:E>=o.equipments.length/2?o.halfBonus:void 0;o.halfBonus&&"target"in o.halfBonus&&await this.removeBuff(e,o.halfBonus),o.fullBonus&&"target"in o.fullBonus&&await this.removeBuff(e,o.fullBonus),x&&"target"in x&&await this.updateBuff(e,x)}async gainHp(e,t){const n=await this.get(e),i=await this.getMaxHp(e)-n.hp;await this.update(e,{$set:{hp:n.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 n=await this.getMaxHp(e);await this.update(e,[{$set:{hp:{$round:[{$multiply:[{$divide:["$hp",t]},n]},0]}}}])}async addCharacteristics(e,t){const n=await this.getMaxHp(e),r=Object.fromEntries(Object.entries(t).filter(([,i])=>i!==0).map(([i,u])=>[`characteristics.${i}`,u]));await this.update(e,{$inc:r}),await this.updateHp(e,n)}async addScrollCharacteristic(e,t){const n=await this.getMaxHp(e),r=Object.fromEntries(Object.entries(t).filter(([,i])=>i!==0).map(([i,u])=>[`scrolls.${i}`,u]));await this.update(e,{$inc:r}),await this.updateHp(e,n)}async resetCharacteristics(e){const t=await this.getMaxHp(e),n={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};await this.update(e,{$set:{characteristics:n},$inc:{berry:-1e8}}),await this.updateHp(e,t)}async updateLastMessageWithXpDate(e){await this.update(e,{$set:{"xp.lastMessageWithXp":new Date}})}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 updateUserXp(e,t){const n=await this.calcXp(e,t,await this.getHpRatio(e));return await this.addXp(e,n),n}async updateUserBerry(e,t,n){const r=await this.calcBerry(e,t,n);return await this.addBerry(e,r),r}}const Tt=a=>D.find(a).lean(),Ot=async a=>await D.create({user:a});async function It(a){const e=await D.findOne({user:a}).lean();return e||y(await Ot(a))}const vt=(a,e)=>D.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).lean();class Mt extends Dt{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return It(e)}fetchManyFromDb(e){return Tt(e)}updateInDb(e,t){return vt(e,t)}}const U=new Mt;class At extends w{async updateSendDailyQuest(e,t){await this.update(e,{$set:{sendDailyQuest:t}})}async updateSendDailyReport(e,t){await this.update(e,{$set:{sendDailyReport:t}})}async updateInventorySort(e,t){await this.update(e,{$set:{"sort.inventory":t}})}async updateReminderSettings(e,t,n){await this.update(e,{$set:{[`reminder.${t}`]:n}})}getUsersWithDailyReportEnable(){return this.getMany({sendDailyReport:!0})}}const kt=a=>B.find(a).lean(),qt=async a=>await B.create({user:a});async function Rt(a){const e=await B.findOne({user:a}).lean();return e||y(await qt(a))}const Bt=(a,e)=>B.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).lean();class _t extends At{constructor(){super(3600)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return Rt(e)}fetchManyFromDb(e){return kt(e)}updateInDb(e,t){return Bt(e,t)}}const ee=new _t;class Ct extends f{async getCommandCooldown(e,t){return(await this.get(e)).commands[t]}async lockUserCommand(e){await this.update(e,{$set:{lockUserCommand:new Date(Date.now()+2*3600*1e3)}}),await U.gainHp(e,1)}async useCommand(e,t,n){const{reminder:r}=await ee.get(e);await this.update(e,{$set:{[`commands.${t}`]:new Date(Date.now()+n)}}),r.commands[t]&&await be.addReminder(e,`commands/${t}`,new Date(Date.now()+n))}}const xt=async a=>await F.create({user:a});async function Nt(a){const e=await F.findOne({user:a}).lean();return e||y(await xt(a))}const Ft=(a,e)=>F.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).lean();class jt extends Ct{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return Nt(e)}updateInDb(e,t){return Ft(e,t)}}const Ht=new jt;class Kt extends w{async isOrnamentIds(e,t=()=>!0){const r=(await this.getAll()).filter(t).map(({ornamentId:i})=>i);return e.every(i=>r.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(e=>this.isBackground(e))}async getAllTitles(){return(await this.getAll()).filter(e=>this.isTitle(e))}async getAllFactionTitles(){return(await this.getAll()).filter(e=>this.isFactionTitle(e))}async getAllQuestTitles(){return(await this.getAll()).filter(e=>this.isQuestTitle(e))}async getAllShopTitles(){return(await this.getAll()).filter(e=>this.isShopTitle(e))}formatBackgroundId(e){const t=d.isString(e)?e:e.ornamentId;return t==="background_default"?"par défaut":`"${d.capitalizeAllWords(t.split("_").join(" "))}"`}async getSomeShopTitles(e){const t=await this.getAllShopTitles();return d.sortBy(d.pickNthByOdds(e,t,n=>n.ornamentId,n=>n.odd??0),n=>n.price)}async getSomeBackgrounds(e){const t=await this.getAllBackgrounds();return d.sortBy(d.pickNthByOdds(e,t,n=>n.ornamentId,n=>n.odd??0),n=>n.price??0)}pickEachRarityOrnament(e,t){if(t.length!==p.RANK_IDS_WITHOUT_BASIC.length)throw new RangeError("pickEachRarityOrnament - must give same number of odds than ranks");return d.filterNullAndUndefined(t.map((n,r)=>{const i=p.RANK_IDS_WITHOUT_BASIC[r],u=e[i];return Math.random()>n||!u||!u.length?null:d.pickFrom(u)}))}}const Pt=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}),te=s.models?.Ornaments||s.model("Ornaments",Pt),Qt=async(a,e)=>te.find(a,{},e).lean();async function zt(a){const e=await te.findOne({ornamentId:a}).lean();return e||null}const Wt=(a,e)=>te.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class Gt extends Kt{constructor(){super(3600)}updateInDb(e,t){return Wt(e,t)}fetchFromDb(e){return zt(e)}fetchManyFromDb(e,t){return Qt(e,t)}getKey(e){return e.ornamentId}normalizeKey(e){return e}}const b=new Gt;class Yt extends f{async unlockTitle(e,t){await b.isOrnamentIds([t],b.isTitle)&&await this.update(e,{$addToSet:{unlockedTitles:t}})}async unlockTitles(e,t){await b.isOrnamentIds(t,b.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 b.isOrnamentIds([t],b.isBackground)&&await this.update(e,{$addToSet:{unlockedBackgrounds:t}})}async unlockBackgrounds(e,t){await b.isOrnamentIds(t,b.isBackground)&&await this.update(e,{$addToSet:{unlockedBackgrounds:{$each:t}}})}async selectBackground(e,t){await this.update(e,{$set:{selectedBackground:t}})}async unlockBadge(e,t,n){t.isProgressive?await this.update(e,{$addToSet:{unlockedBadges:`${t.id}_${n}`}}):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 Vt=async a=>await Q.create({user:a});async function Xt(a){const e=await Q.findOne({user:a}).lean();return e||y(await Vt(a))}const Lt=async(a,e)=>Q.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Jt extends Yt{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Xt(e)}updateInDb(e,t){return Lt(e,t)}}const ae=new Jt;class Zt extends w{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:n}=await this.get({user:e,questId:t});return!!n&&d.sameDay(d.yesterday(),n)}async getStreakMultiplier(e,t){const n=await this.get({user:e,questId:t});return await this.isStreaking(e,t)?1+Math.min(2,(n.streak??0)/10):1}async getCompletedCount(e){return(await this.getMany({user:e,status:p.QuestStatus.COMPLETED})).length}async completeQuest(e,t=!1){const n=d.yesterday();n.setHours(0,0,0,0);const r=new Date;return r.setHours(0,0,0,0),this.update(e,[{$set:{...t?{streak:{$cond:{if:{$and:[{$gte:["$lastCompletionDate",n]},{$lt:["$lastCompletionDate",r]}]},then:{$add:[{$ifNull:["$streak",0]},1]},else:1}}}:{},lastCompletionDate:new Date,status:p.QuestStatus.COMPLETED}}],{upsert:!1})}}function ea(a){return v.find(a).lean()}const ta=async a=>await v.create({...a});async function aa(a){const e=await v.findOne(a).lean();return e||y(await ta(a))}function na(a,e,t){return v.findOneAndUpdate(a,e,{upsert:!0,...t,returnDocument:"after"}).lean()}class ra extends Zt{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 aa(e)}fetchManyFromDb(e){return ea(e)}updateInDb(e,t,n){return na(e,t,n)}}const ne=new ra;class sa extends f{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 ia=async a=>await W.create({user:a});async function ua(a){const e=await W.findOne({user:a}).lean();return e||y(await ia(a))}const ca=(a,e)=>W.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class da extends sa{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return ua(e)}updateInDb(e,t){return ca(e,t)}}const re=new da;class la extends f{async updateDailyReport(e){const t=await U.get(e),n=await ae.get(e),r=await ne.getMany({user:e,status:p.QuestStatus.COMPLETED}),i=await re.get(e);await this.update(e,{$set:{xpYesterday:t.xp.amount,berryYesterday:t.berry,previousCompletedQuest:r.map(({questId:u})=>u),"previousOrnament.unlockedBadges":n.unlockedBadges,"previousOrnament.unlockedTitles":n.unlockedTitles,"previousOrnament.unlockedBackgrounds":n.unlockedBackgrounds,previousMessageSent:i.messageSent}})}async getDailyReport(e){const{previousOrnament:t,previousCompletedQuest:n,xpYesterday:r,berryYesterday:i,previousMessageSent:u}=await this.get(e),l=await U.get(e),o=await ne.getMany({user:e,status:p.QuestStatus.COMPLETED}),E=await ae.get(e),x=await re.get(e),{berry:I,xp:ie}=l,{voice:$e,amount:Vn}=ie,{unlockedBadges:Xn,unlockedBackgrounds:Ln,unlockedTitles:Jn}=E;return{berry:I-i,xp:Vn-r,message:x.messageSent-u,voice:d.sameDay($e.lastConnection,d.yesterday())?$e.minutesInVoiceToday:0,quest:d.exclude(o.map(({questId:Zn})=>Zn),n),badge:d.exclude(Xn,t.unlockedBadges),title:d.exclude(Jn,t.unlockedTitles),background:d.exclude(Ln,t.unlockedBackgrounds)}}async getAllDailyReportsToSend(){const e=await ee.getUsersWithDailyReportEnable(),t=await ge.getMany({_id:{$in:e.map(({user:n})=>n)},faction:{$ne:"citizen"}});return await Promise.all(t.map(async({_id:n,discordId:r})=>({report:await this.getDailyReport(n),user:n,discordId:r})))}}const oa=a=>j.create({user:a});async function pa(a){const e=await j.findOne({user:a}).lean();return e||y(await oa(a))}const ya=(a,e)=>j.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class fa extends la{constructor(){super(60)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return pa(e)}updateInDb(e,t){return ya(e,t)}}const ma=new fa;class ha extends f{async setGuessGame(e,t,n,r){await this.update(e,{$set:{guess:{amount:t,tries:n,numberToGuess:r,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 Sa=async a=>await K.create({user:a});async function wa(a){const e=await K.findOne({user:a}).lean();return e||y(await Sa(a))}const ga=(a,e)=>K.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class ba extends ha{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return wa(e)}updateInDb(e,t){return ga(e,t)}}const $a=new ba,Ua=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},xp:{type:Number,default:0},berry:{type:Number,default:0},faction:{type:Number,default:0}}),R=s.models?.UserRank||s.model("UserRank",Ua);class Ea extends f{async computeAllXpRanks(){const t=(await D.aggregate([{$setWindowFields:{sortBy:{"xp.amount":-1},output:{xpRank:{$rank:{}}}}},{$project:{user:1,xpRank:1}}])).map(({user:n,xpRank:r})=>({updateOne:{filter:{user:n},update:{$set:{xp:r}},upsert:!0}}));t.length>0&&await R.bulkWrite(t),this.clearAll()}async computeAllBerryRanks(){const t=(await D.aggregate([{$setWindowFields:{sortBy:{berry:-1},output:{berryRank:{$rank:{}}}}},{$project:{user:1,berryRank:1}}])).map(({user:n,berryRank:r})=>({updateOne:{filter:{user:n},update:{$set:{berry:r}},upsert:!0}}));t.length>0&&await R.bulkWrite(t),this.clearAll()}async computeAllFactionRanks(){const t=(await g.aggregate([{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$setWindowFields:{partitionBy:"$faction",sortBy:{"meta.xp.amount":-1},output:{factionRank:{$rank:{}}}}},{$project:{factionRank:1}}])).map(({_id:n,factionRank:r})=>({updateOne:{filter:{user:n},update:{$set:{faction:r}},upsert:!0}}));t.length>0&&await R.bulkWrite(t),this.clearAll()}async computeAllRanks(){await Promise.all([this.computeAllXpRanks(),this.computeAllBerryRanks(),this.computeAllFactionRanks()])}}const Da=async a=>await R.create({user:a});async function Ta(a){const e=await R.findOne({user:a}).lean();return e||y(await Da(a))}const Oa=(a,e)=>R.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).lean();class Ia extends Ea{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return Ta(e)}updateInDb(e,t){return Oa(e,t)}}const va=new Ia;class Ma extends f{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,n){await this.update(e,{$push:{lastGames:{$each:[{gameType:t,endState:n}],$position:0,$slice:20}}})}async drawIncrement(e){await this.update(e,{$inc:{drawCount:1}})}async bet666(e){const t=d.yesterday();t.setHours(0,0,0,0);const n=new Date;n.setHours(0,0,0,0),await A.updateOne({user:e,"bet666.last":{$gte:t,$lt:n}},{$inc:{"bet666.count":1},$set:{"bet666.last":new Date}}),await A.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 Aa=async a=>await A.create({user:a});async function ka(a){const e=await A.findOne({user:a}).lean();return e||y(await Aa(a))}const qa=(a,e)=>A.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Ra extends Ma{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 Ba=new Ra;class _a extends f{async workIncrement(e){await this.update(e,{$inc:{workCount:1}})}async updateTotalSpentInShop(e,t){await this.update(e,{$inc:{totalSpentInShop:t}})}}const Ca=a=>z.create({user:a});async function xa(a){const e=await z.findOne({user:a}).lean();return e||y(await Ca(a))}const Na=(a,e)=>z.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Fa extends _a{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return xa(e)}updateInDb(e,t){return Na(e,t)}}const ja=new Fa;class Ha extends f{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 Ka=async a=>await G.create({user:a});async function Pa(a){const e=await G.findOne({user:a}).lean();return e||y(await Ka(a))}const Qa=(a,e)=>G.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class za extends Ha{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Pa(e)}updateInDb(e,t){return Qa(e,t)}}const Wa=new za;class Ga extends f{async readEdito(e){const t=new Date;t.setHours(0,0,0,0),await T.updateOne({user:e,"edito.lastTimeRead":{$gte:t}},{$inc:{"edito.readToday":1},$set:{"edito.lastTimeRead":new Date}}),await T.updateOne({user:e,"edito.lastTimeRead":{$lt:t}},{$set:{"edito.lastTimeRead":new Date,"edito.readToday":1}}),this.invalidate(e)}async getTotalEditoReadToday(){const e=new Date;return e.setHours(0,0,0,0),(await T.aggregate([{$match:{"edito.lastTimeRead":{$gte:e},"edito.readToday":{$gt:0}}},{$group:{_id:null,total:{$sum:"$edito.readToday"}}}]))[0]?.total??0}}const Ya=async a=>await T.create({user:a});async function Va(a){const e=await T.findOne({user:a}).lean();return e||y(await Ya(a))}const Xa=(a,e)=>T.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class La extends Ga{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Va(e)}updateInDb(e,t){return Xa(e,t)}}const Ja=new La;class Za extends f{async updateCraftStats(e,t,n){const r=await m.get(n);!r||!m.isItem(r)||await this.update(e,{$inc:{"crafts.totalCrafted":t}})}async incrementAlcoholDrink(e,t,n){["wine","beer","rhum"].includes(t)&&await this.update(e,{$inc:{"alcohols.wines":t==="wine"?n:0,"alcohols.beers":t==="beer"?n:0,"alcohols.rhums":t==="rhum"?n:0,"alcohols.totalConsumed":n}})}async incrementBottleUsedToday(e,t){const n=new Date;n.setHours(0,0,0,0),await k.updateOne({user:e,"bottle.lastUsed":{$gte:n}},{$inc:{"bottle.usedToday":t},$set:{"bottle.lastUsed":new Date}}),await k.updateOne({user:e,"bottle.lastUsed":{$lt:n}},{$set:{"bottle.lastUsed":new Date,"bottle.usedToday":t}}),this.invalidate(e)}async incrementBottleUsedTotal(e,t){await this.update(e,{$inc:{"bottle.totalUsed":t}})}async incrementChestOpenedTotal(e,t){await this.update(e,{$inc:{"chest.totalOpened":t}})}}const en=async a=>await k.create({user:a});async function tn(a){const e=await k.findOne({user:a}).lean();return e||y(await en(a))}const an=(a,e)=>k.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class nn extends Za{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return tn(e)}updateInDb(e,t){return an(e,t)}}const rn=new nn;class sn extends w{async maxCraftQuantity(e,t){const n=await $.get(e);let r=1/0;for(const i of t)r=Math.min(r,Math.floor((n.itemList[i.entityId]??0)/i.size));return r}async hasEnoughItemsForRecipe(e,t,n){const r=await $.get(e);for(const i of t.entities)if((r.itemList[i.entityId]??0)<i.size*n)return!1;return!0}decodeCraftId(e){return e.split(";").map((t,n)=>({entityId:t==="null"?null:t,index:n}))}encodeCraftId(e){return e.map(({entityId:t})=>`${t}`).join(";")}async isValidRecipe(e){return!!(await this.getAll()).find(n=>n.craftId===e)}async getRecipeResult(e,t){const n=await $.get(e),r=(await O.getPanoplyBonus(n.equippedItems)).find(([i,u])=>i.panoplyId==="little_blacksmith"&&u!==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}}const un=new s.Schema({entityId:{type:String,required:!0},size:{type:Number,required:!0}},{_id:!1}),cn=new s.Schema({entityId:{type:String,required:!0},size:{type:Number,required:!0}},{_id:!1}),dn=new s.Schema({craftId:{type:String,unique:!0,required:!0},name:{type:String,required:!0},entities:{type:[un],required:!0},result:{type:cn,required:!0}},{minimize:!1}),V=s.models?.Recipes||s.model("Recipes",dn),ln=async a=>await V.create({...a}),on=async(a,e)=>V.find(a,{},e).lean();async function pn(a){const e=await V.findOne({craftId:a}).lean();return e||null}const yn=(a,e)=>V.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class fn extends sn{constructor(){super(3600)}createInDb(e){return ln(e)}updateInDb(e,t){return yn(e,t)}fetchFromDb(e){return pn(e)}fetchManyFromDb(e,t){return on(e,t)}normalizeKey(e){return e}getKey(e){return e.craftId}}const mn=new fn,hn=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}}),X=s.models?.Bans||s.model("Bans",hn),Sn=(a,e)=>X.deleteOne({bannedUserId:a,guildId:e});class wn extends w{async getUnbanUsers(){return this.getMany({unbannedTimestamp:{$lte:new Date,$ne:null}})}async banUserFromGuild({bannedUserId:e,guildId:t,...n}){await this.update({bannedUserId:e,guildId:t},{...n})}async isBannedFromGuild(e,t){const n=await this.get({bannedUserId:e,guildId:t});return!!(n&&(!n.unbannedTimestamp||n.unbannedTimestamp>new Date))}async deleteBan(e,t){await Sn(e,t),this.invalidate({bannedUserId:e,guildId:t})}}const gn=a=>X.find(a).lean(),bn=a=>X.findOne(a).lean(),$n=(a,e)=>X.findOneAndUpdate(a,e,{returnDocument:"after",upsert:!0}).lean();class Un extends wn{constructor(){super(3600*36)}normalizeKey(e){return`${e.guildId}/${e.bannedUserId}`}getKey({bannedUserId:e,guildId:t}){return{bannedUserId:e,guildId:t}}fetchFromDb(e){return bn(e)}fetchManyFromDb(e){return gn(e)}updateInDb(e,t){return $n(e,t)}}const En=new Un,Dn=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}}}),L=s.models?.Invitation||s.model("Invitation",Dn),Tn=a=>L.create({...a}),On=async a=>{await L.deleteMany({...a})};class In extends f{async sendInvitation({senderId:e,receiverId:t,gameMode:n,...r}){return await this.get({senderId:e,gameMode:n,receiverId:t})?null:await Tn({...r,senderId:e,gameMode:n,receiverId:t})}async deleteInvitation({senderId:e,receiverId:t,gameMode:n}){await On({senderId:e,gameMode:n,receiverId:t}),this.invalidate({senderId:e,gameMode:n,receiverId:t})}}const vn=a=>L.findOne({...a}).lean(),Mn=(a,e)=>L.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class An extends In{constructor(){super(3600)}normalizeKey(e){return`${e.gameMode}/${e.receiverId}/${e.senderId}`}getKey({receiverId:e,gameMode:t,senderId:n}){return{gameMode:t,receiverId:e,senderId:n}}fetchFromDb(e){return vn(e)}updateInDb(e,t){return Mn(e,t)}}const kn=new An;class qn extends f{async randomizeEditoPrice(e){const t=d.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 setRankingMessage(e,t){await this.update({guildId:e},{$set:{"ranking.messageId":t}})}async addCrewChannelId(e,t,n){await this.update({guildId:e},{$push:{"crew.crewChannelIds":{channelId:n,crewId:t}}})}async updateRolesId(e,t){await this.update({guildId:e},{$set:Object.fromEntries(Object.entries(t).map(([n,r])=>[`roles.${n}`,r]))})}async updateChannelId(e,t){await this.update({guildId:e},{$set:Object.fromEntries(Object.entries(t).map(([n,r])=>[`channels.${n}`,r]))})}}const Rn=new s.Schema({guildId:{type:String,required:!0,unique:!0},ranking:{messageId:{type:String,default:null}},roles:{premium:{type:String,default:null},booster:{type:String,default:null},scam:{type:String,default:null},canChangeFaction:{type:String,default:null},canChooseFaction:{type:String,default:null},staff:{type:String,default:null},moderator:{type:String,default:null},marine:{type:String,default:null},pirate:{type:String,default:null},revolutionary:{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:{type:String,default:null},crew:{type:String,default:null},ranking:{type:String,default:null}},edito:{price:{type:Number,default:100},messageId:{type:String,default:null}},crew:{crewChannelIds:{type:[{channelId:{type:String},crewId:{type:String}}],default:[]}}}),se=s.models?.Settings||s.model("Settings",Rn),Bn=a=>se.create({guildId:a}),_n=async a=>{const e=await se.findOne({guildId:a}).lean();return e||y(await Bn(a))},Cn=(a,e)=>se.findOneAndUpdate(a,e,{upsert:!0,returnDocument:"after"}).lean();class xn extends qn{constructor(){super(3600*24*30)}normalizeKey(e){return e}getKey({guildId:e}){return e}fetchFromDb(e){return _n(e)}updateInDb(e,t){return Cn(e,t)}}const Nn=new xn,Fn=new s.Schema({warnedUserId:{type:String,required:!0,index:!0},authorId:String,date:{type:Date,default:Date.now()},reason:{type:String,default:null}}),J=s.models?.Warn||s.model("Warn",Fn),jn=a=>J.countDocuments(a),Hn=a=>J.create({...a}),Kn=a=>J.findByIdAndDelete(a).lean();class Pn extends w{getUserWarns(e){return this.getMany({warnedUserId:e})}getUserWarnCount(e){return jn({warnedUserId:e})}async createWarn(e){await Hn(e)}async deleteWarn(e){const t=await Kn(e);return t&&this.invalidate(this.getKey(t)),t}}const Qn=a=>J.find(a).lean();class zn extends Pn{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 Qn(e)}updateInDb(){throw new Error("Method not implemented.")}}const Wn=new zn,Gn=a=>{s.connect(a)};class Yn extends s.Types.ObjectId{}c.COOLDOWN_COMMANDS=Fe,c.ObjectId=Yn,c.QUEST_MIDDLEWARE_EVENT_NAME=S,c.banService=En,c.connectToServices=Gn,c.emitQuestMiddlewareEvent=h,c.entityService=m,c.invitationService=kn,c.ornamentService=b,c.panoplyService=O,c.recipeService=mn,c.registerQuestMiddlewareEvents=Te,c.reminderService=be,c.settingsService=Nn,c.userCooldownService=Ht,c.userDailyReportService=ma,c.userEncyclopediaService=Y,c.userGamesService=$a,c.userInventoryService=$,c.userMetaService=U,c.userOrnamentService=ae,c.userQuestService=ne,c.userRankService=va,c.userService=ge,c.userSettingsService=ee,c.userStatsCasinoService=Ba,c.userStatsEconomyService=ja,c.userStatsEngagementService=re,c.userStatsFlagsService=Wa,c.userStatsFrequencyService=Ja,c.userStatsInventoryService=rn,c.warnService=Wn,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})}));
|
|
1
|
+
(function(l,s){typeof exports=="object"&&typeof module<"u"?s(exports,require("mongoose"),require("@opfr/definitions"),require("node-cache"),require("events"),require("@opfr/utils-lang")):typeof define=="function"&&define.amd?define(["exports","mongoose","@opfr/definitions","node-cache","events","@opfr/utils-lang"],s):(l=typeof globalThis<"u"?globalThis:l||self,s(l.services={},l.mongoose,l["@opfr/definitions"],l["node-cache"],l.events,l["@opfr/utils-lang"]))})(this,(function(l,s,p,Me,Ae,o){"use strict";function qe(n){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(n){for(const t in n)if(t!=="default"){const r=Object.getOwnPropertyDescriptor(n,t);Object.defineProperty(e,t,r.get?r:{enumerable:!0,get:()=>n[t]})}}return e.default=n,Object.freeze(e)}const pe=qe(Ae),j="___ALL_ENTITIES___";class f{cache;constructor(e){this.cache=new Me({stdTTL:e,checkperiod:e*.2,useClones:!1})}async get(e,t){const r=this.normalizeKey(e),a=this.cache.get(r);if(a)return a;const i=await this.fetchFromDb(e,t??{});return i&&this.cache.set(r,i),i}async update(e,t,r){const a=await this.updateInDb(e,t,r);if(a){const i=this.getKey(a);this.cache.del(j),this.cache.set(this.normalizeKey(i),a)}return a}invalidate(e){this.cache.del(j),e&&this.cache.del(this.normalizeKey(e))}clearAll(){this.cache.flushAll()}}class m extends f{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,t={}){const r=await this.fetchManyFromDb(e,t);return r.forEach(a=>{this.cache.set(this.normalizeKey(this.getKey(a)),a)}),r}}const ye=new pe.EventEmitter,S=(n,e,t)=>{ye.emit(n,e,t)},ke=n=>{for(const[e,t]of Object.entries(n))ye.on(e,(r,a)=>{t(r,a)})},w={USER:"middleware/quest/USER",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_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"},fe=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:p.QuestStatus.IN_PROGRESS,index:1},lastCompletionDate:Date,streak:Number},{minimize:!1});fe.post("findOneAndUpdate",function(n){n&&S(w.USER_QUEST,n.user._id,n)});const q=s.models?.UserQuest||s.model("UserQuest",fe),Re=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},commands:{type:Map,of:Date,default:new Map}}),H=s.models?.UserCooldown||s.model("UserCooldown",Re),xe=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}}),P=s.models?.UserDailyReport||s.model("UserDailyReport",xe),_e=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},encyclopedia:{type:[String],default:[]}}),Q=s.models?.UserEncyclopedia||s.model("UserEncyclopedia",_e),Ce=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}}),z=s.models?.UserGames||s.model("UserGames",Ce),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(n){n&&S(w.USER_INVENTORY,n.user._id,n)});const Y=s.models?.UserInventory||s.model("UserInventory",me),Be=new pe.EventEmitter,Fe=(n,e)=>{Be.emit(n,e)},k={multiplier:{type:Number,default:0},origin:String,expireAt:{type:Date,default:null},startAt:{type:Date,default:null}},he=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},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:[k],default:[]},work:{type:[k],default:[]}},berry:{work:{type:[k],default:[]},global:{type:[k],default:[]}},drop:{work:{type:[k],default:[]}},xp:{global:{type:[k],default:[]}}},hp:{type:Number,default:100},energyMax:{type:Number,default:10},energy:{type:Number,default:10},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}},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}}});he.post("findOneAndUpdate",async function(n){n&&(S(w.USER_META,n.user._id,n),n.hp<=0&&Fe("death",n.user._id))});const D=s.models?.UserMeta||s.model("UserMeta",he),Se=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"}});Se.post("findOneAndUpdate",function(n){n&&S(w.USER_ORNAMENT,n.user._id,n)});const G=s.models?.UserOrnament||s.model("UserOrnament",Se),Ne=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:{commands:{type:Map,of:Boolean,default:new Map}}}),B=s.models?.UserSettings||s.model("UserSettings",Ne),we=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}}});we.post("findOneAndUpdate",function(n){n&&S(w.USER_STATS_CASINO,n.user._id,n)});const R=s.models?.UserStatsCasino||s.model("UserStatsCasino",we),ge=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},workCount:{type:Number,default:0},totalSpentInShop:{type:Number,default:0}});ge.post("findOneAndUpdate",function(n){n&&S(w.USER_STATS_ECONOMY,n.user._id,n)});const W=s.models?.UserStatsEconomy||s.model("UserStatsEconomy",ge),be=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:[]}});be.post("findOneAndUpdate",function(n){n&&S(w.USER_STATS_ENGAGEMENT,n.user._id,n)});const V=s.models?.UserStatsEngagement||s.model("UserStatsEngagement",be),$e=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}}});$e.post("findOneAndUpdate",function(n){n&&S(w.USER_STATS_FLAGS,n.user._id,n)});const X=s.models?.UserStatsFlags||s.model("UserStatsFlags",$e),Ie=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},edito:{readToday:{type:Number,default:0,index:!0},lastTimeRead:{type:Date,default:new Date,index:!0}}});Ie.post("findOneAndUpdate",function(n){n&&S(w.USER_STATS_FREQUENCY,n.user._id,n)});const M=s.models?.UserStatsFrequency||s.model("UserStatsFrequency",Ie),Ue=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}}});Ue.post("findOneAndUpdate",function(n){n&&S(w.USER_STATS_INVENTORY,n.user._id,n)});const x=s.models?.UserStatsInventory||s.model("UserStatsInventory",Ue),se=new s.Schema({discordId:{type:String,required:!0,unique:!0},scam:{type:Boolean,default:!1},birthday:{type:Date,default:null,index:1},faction:{type:String,default:p.DEFAULT_FACTION,index:1},canChangeFaction:{type:Boolean,default:!1},canChooseFaction:{type:Boolean,default:!1}});se.post("findOneAndUpdate",function(n){n&&S(w.USER,n._id,n)}),se.post("deleteOne",async function(){const n=this.getQuery()._id;await H.deleteOne({user:n}),await P.deleteOne({user:n}),await Q.deleteOne({user:n}),await z.deleteOne({user:n}),await Y.deleteOne({user:n}),await D.deleteOne({user:n}),await G.deleteOne({user:n}),await q.deleteMany({user:n}),await B.deleteOne({user:n}),await R.deleteOne({user:n}),await W.deleteOne({user:n}),await V.deleteOne({user:n}),await X.deleteOne({user:n}),await M.deleteOne({user:n}),await x.deleteOne({user:n})});const $=s.models?.User||s.model("User",se);class Ke extends m{getByObjectId(e){return this.update({_id:e},{})}getNextBirthdays(){const e=new Date,t=e.getFullYear();return $.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}}])}getFactionRanking(e){return $.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 $.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 $.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 q.aggregate([{$match:{status:p.QuestStatus.COMPLETED}},{$group:{_id:"$user",questCount:{$sum:1}}},{$setWindowFields:{sortBy:{questCount:-1},output:{rank:{$rank:{}}}}},{$sort:{rank:1}},{$limit:10},{$lookup:{from:"users",localField:"_id",foreignField:"_id",as:"user"}},{$unwind:"$user"},{$project:{_id:0,discordId:"$user.discordId",questCount:1,rank:1}}])}getTodayAllBirthday(){const e=new Date;return $.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}})}async updateScam(e,t){await this.update({discordId:e},{$set:{scam:t}})}}const je=(n,e)=>$.find(n,{},e).lean(),y=n=>n.toObject({flattenMaps:!0,flattenObjectIds:!1}),He=n=>$.create({discordId:n});async function Pe(n,{upsert:e=!0,...t}){const r=await $.findOne({discordId:n},{},t).lean();return!r&&e?y(await He(n)):r}const Qe=(n,e)=>$.findOneAndUpdate(n,e,{upsert:!0,returnDocument:"after"}).lean();class ze extends Ke{constructor(){super(3600)}normalizeKey(e){return e}getKey({discordId:e}){return e}fetchFromDb(e,t){return Pe(e,t)}fetchManyFromDb(e,t){return je(e,t)}updateInDb(e,t){return Qe(e,t)}}const Te=new ze,Ye=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}),F=s.models?.Reminder||s.model("Reminder",Ye),Ge=async n=>{await F.deleteMany(n)},We=async(n,e)=>{await F.deleteOne({user:n,type:e})};class Ve extends m{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 We(e,t),this.invalidate({user:e,type:t})}async deleteSelectedReminders(e){const t=e.map(r=>r._id);await Ge({_id:{$in:t}}),e.forEach(r=>{this.invalidate({user:r.user,type:r.type})})}}function Xe(n,e){return F.find(n,{},e).lean()}async function Le(n){const e=await F.findOne(n).lean();return e||null}async function Je(n,e,t){return F.findOneAndUpdate(n,e,{...t,returnDocument:"after"}).lean()}class Ze extends Ve{constructor(){super(300)}getKey(e){return{user:e.user,type:e.type}}normalizeKey({user:e,type:t}){return`${e.toString()}/${t}`}fetchFromDb(e){return Le(e)}fetchManyFromDb(e,t){return Xe(e,t)}updateInDb(e,t,r={upsert:!1}){return Je(e,t,r)}}const ve=new Ze,et=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",et),tt=(n,e)=>N.find(n,{},e).lean(),nt=async(n,e)=>N.find(n,{},e).populate("equipments");async function rt(n){const e=await N.findOne({panoplyId:n}).lean();return e||null}const at=async n=>N.findOne(n).populate("equipments");class st extends m{getAllPopulated(){return nt({},{})}getPopulated(e){return at({panoplyId:e})}hasPanoply(e,t){const r=o.filterNullAndUndefined(Object.values(e)),a=t.equipments.filter(i=>r.find(u=>u.entityId===i.entityId)).length;if(a===t.equipments.length)return t.fullBonus;if(a>=t.equipments.length/2)return t.halfBonus}async getPanoplyBonus(e){const t=[],r=await this.getAllPopulated();for(const a of r){const i=o.filterNullAndUndefined(Object.values(e)),u=a.equipments.filter(c=>i.find(({entityId:d})=>d===c.entityId));u.length===a.equipments.length?t.push([a,"full"]):u.length>=a.equipments.length/2?t.push([a,"half"]):u.length>=1&&t.push([a,null])}return t}}const it=async(n,e)=>N.findOneAndUpdate(n,e,{returnDocument:"after"}).lean();class ut extends st{constructor(){super(3600)}normalizeKey(e){return e}getKey({panoplyId:e}){return e}updateInDb(e,t){return it(e,t)}fetchFromDb(e){return rt(e)}fetchManyFromDb(e,t){return tt(e,t)}}const A=new ut,ct=new s.Schema({type:{type:String,enum:p.EFFECT_KEYS,required:!0},params:{type:s.Schema.Types.Mixed}},{_id:!1}),dt=new s.Schema({entityId:{unique:!0,required:!0,type:String}},{minimize:!1,discriminatorKey:"type"}),lt=new s.Schema({category:{required:!0,type:String},subtype:{type:String},rankId:String,effects:{type:[ct],default:[]},usage:{_id:!1,type:{mode:String,craft:Boolean},default:void 0}}),ot=new s.Schema({category:{required:!0,type:String},characteristics:{_id:!1,type:Object},panoply:String}),_=s.models?.Entities||s.model("Entities",dt),pt=_.discriminator("item",lt);_.discriminator("equipment",ot);const yt=async(n,e)=>_.find(n,{},e).lean(),ft=async(n,e)=>pt.find(n,{},e).lean();class mt extends m{isEntity(e){return!!e&&"entityId"in e}isItem(e){return e.type==="item"}isEquipment(e){return e.type==="equipment"}async isEntityId(e,t=()=>!0){return(await this.getAll()).filter(t).map(({entityId:a})=>a).includes(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,[a,i])=>{const u=t.find(({entityId:c})=>c===a);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 getAllItemsBy(e){return(await ft({},{})).filter(e)}async fromDBToEquipableEquipment(e){const r=(await this.getAll()).filter(a=>this.isEquipment(a)).find(({entityId:a})=>a===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 A.getAllPopulated();for(const a of p.EQUIPMENT_SLOT){const i=e[a];i&&(t=o.mergeObjects(t,(await this.fromDBToEquipableEquipment(i)).characteristics,(u,c)=>u+c))}for(const a of r){const i=A.hasPanoply(e,a);i&&!("target"in i)&&(t=o.mergeObjects(t,i,(u,c)=>u+c))}return t}filterUsableEntities(e){return e.filter(t=>this.isConsumableItem(t)&&t.usage?.mode)}hasUsableEntities(e){return!!e.find(t=>this.isConsumableItem(t)&&t.usage?.mode)}isChestItem(e){return this.isItem(e)&&e.category==="chest"}isConsumableItem(e){return this.isItem(e)&&e.category==="consumable"}isResourceItem(e){return this.isItem(e)&&e.category==="resource"}isSameEquipment(e,t){return e.entityId===t.entityId&&e.seed===t.seed}seedEquipment(e,t){const r=o.seededRandom(t),a=o.sortBy(o.recordToArray(e.characteristics),([i])=>i);return{...e,seed:t,characteristics:Object.fromEntries(a.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))}}const ht=async n=>await _.create({...n});async function St(n){const e=await _.findOne({entityId:n}).lean();return e||null}const wt=(n,e)=>_.findOneAndUpdate(n,e,{returnDocument:"after"}).lean();class gt extends mt{constructor(){super(3600)}createInDb(e){return ht(e)}updateInDb(e,t){return wt(e,t)}fetchFromDb(e){return St(e)}fetchManyFromDb(e,t){return yt(e,t)}normalizeKey(e){return e}getKey(e){return e.entityId}}const h=new gt;class bt extends f{hasAlreadyFoundEntity(e,t){return e.encyclopedia.includes(t)}async addEntities(e,t){await this.update(e,{$addToSet:{encyclopedia:{$each:t}}})}}const $t=async n=>await Q.create({user:n});async function It(n){const e=await Q.findOne({user:n}).lean();return e||y(await $t(n))}const Ut=(n,e)=>Q.findOneAndUpdate({user:n},e,{upsert:!0,returnDocument:"after"}).lean();class Tt extends bt{constructor(){super(300)}fetchFromDb(e){return It(e)}getKey({user:e}){return e}normalizeKey(e){return e.toString()}updateInDb(e,t){return Ut(e,t)}}const L=new Tt;class vt extends f{async getUserEquipmentsCharacteristics(e){let t={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};for(const r of p.EQUIPMENT_SLOT){const a=e.equippedItems?.[r];if(!a)continue;const i=await h.fromDBToEquipableEquipment(a);t=o.mergeObjects(t,i.characteristics,(u,c)=>u+c)}return t}async hasInventoryRequirements(e,t){const r=await this.get(e);return o.recordToArray(t).reduce((a,[i,u])=>a&&(r.itemList[i]??0)>=(u??0),!0)}async hasEnoughEntity(e,t,r){return((await this.get(e)).itemList[r]??0)>=t}async getItemList(e){return(await this.get(e)).itemList}async calcMinStreakForWorkLoot(e){const t=await this.get(e),r=(await A.getPanoplyBonus(t.equippedItems)).find(([a,i])=>a.panoplyId==="marine"&&i!==null);return r&&r[1]==="full"?10:r&&r[1]==="half"?20:1/0}async hasRevolutionaryBuff(e){const t=await this.get(e);return(await A.getPanoplyBonus(t.equippedItems)).find(([a,i])=>a.panoplyId==="revolutionary"&&i!==null)?.[1]??null}async addItem(e,t,r){await this.update(e,{$inc:{[`itemList.${t}`]:r}}),await L.addEntities(e,[t])}async addItems(e,t){await this.update(e,{$inc:Object.fromEntries(Object.entries(t).filter(([,r])=>(r??0)>0).map(([r,a])=>[`itemList.${r}`,a]))}),await L.addEntities(e,o.recordToArray(t).filter(([,r])=>r>0).map(([r])=>r))}async removeItem(e,t,r){r!==0&&await this.update(e,[{$set:{[`itemList.${t}`]:{$max:[{$add:[`$itemList.${t}`,-r]},0]}}}])}async removeEquipment(e,t,r){await this.update(e,{$pull:{equipmentList:{entityId:t,seed:r}}})}async removeAllItem(e,t){await this.update(e,{$set:{[`itemList.${t}`]:0}})}async addEquipments(e,t){await this.update(e,{$push:{equipmentList:{$each:t}}}),await L.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 v.getMaxHp(e),a=Object.fromEntries(o.recordToArray(t).map(([i,u])=>[`equippedItems.${i}`,u]));await this.update(e,{$set:a}),await v.updateHp(e,r)}async unequip(e,t){const r=await v.getMaxHp(e);await this.update(e,{$set:{[`equippedItems.${t}`]:null}}),await v.updateHp(e,r)}async craftItem(e,t,r,a){for(const{entityId:c,size:d}of t.entities)await this.removeItem(e,c,d*r);const{entityId:i,size:u}=t.result;await h.isEntityId(i,h.isEquipment)?await this.addEquipments(e,[{entityId:i,seed:a}]):await h.isEntityId(i,h.isItem)&&await this.addItem(e,i,u*r)}async dismantleEntity(e,t,r,a,i){h.isEquipment(t)?await this.removeEquipment(e,t.entityId,i):h.isItem(t)&&await this.removeItem(e,t.entityId,a);for(const{entityId:u,quantity:c}of r)await h.isEntityId(u,h.isItem)&&await this.addItem(e,u,a*c);await this.removeItem(e,"tools",1)}async enchantItem(e,t,r,a,i){await this.removeItem(e,t,i*4),await this.removeItem(e,a,i),await this.addItem(e,r,i)}async unlockRecipe(e,t){await this.update(e,{$addToSet:{recipes:t}})}}const Et=n=>Y.create({user:n});async function Ot(n){const e=await Y.findOne({user:n}).lean();return e||y(await Et(n))}const Dt=(n,e)=>Y.findOneAndUpdate({user:n},e,{upsert:!0,returnDocument:"after"}).lean();class Mt extends vt{constructor(){super(300)}fetchFromDb(e){return Ot(e)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}updateInDb(e,t){return Dt(e,t)}}const T=new Mt;class At extends m{async getTotalCharacteristics(e){const{characteristics:t,scrolls:r}=await this.get(e);return o.arrayToRecord(p.CHARACTERISTICS.map(a=>[a,p.getComputedCharacteristicValue(t[a])+r[a]]))}async isCooldownForXpPassed(e){const t=await this.get(e);return Date.now()-t.xp.lastMessageWithXp.getTime()>60*1e3}async getAllWithExpiredBuffs(){const e=new Date;return this.getMany({$or:[{"xp.boost":{$lt:e}},{"buffs.cooldown.casino":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.cooldown.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.berry.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.berry.global":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.drop.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.xp.global":{$elemMatch:{expireAt:{$lt:e}}}}]})}async calcXpBoost(e){const t=await this.get(e),{boost:r}=t.xp,a=r!==null&&Date.now()<r.getTime()?.2:0,i=Math.max(t.premium?.5:0,t.booster?.25:0);return a+i+t.buffs.xp.global.reduce((u,{expireAt:c,startAt:d,multiplier:g})=>d&&d>new Date||c&&o.hasExpire(c)?u:u+g,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=p.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 a=r?1:await this.calcBuffMultiplier(e,"berry","global");return Math.ceil(t*(a||1))}async calcBuffMultiplier(e,t,r){return(await this.get(e)).buffs[t][r].reduce((u,{expireAt:c,startAt:d,multiplier:g})=>u+(new Date>=(d??new Date)&&(!c||!o.hasExpire(c))?g:0),1)}async getMaxHp(e){const t=await T.get(e),{vitality:r}=await this.getTotalCharacteristics(e),a=await T.getUserEquipmentsCharacteristics(t);return(r+a.vitality)*p.HP_PER_VITALITY+p.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 T.get(e),a=await T.getUserEquipmentsCharacteristics(r),i=o.mergeObjects(await this.getTotalCharacteristics(e),a,(u,c)=>u+c);if("sum"in t){let u=0;for(const c of t.characteristics)u+=i[c]??0;return u>=t.sum}else{for(const u of Object.keys(t))if(i[u]<(t[u]??0))return!1;return!0}}async hasMalusBuff(e){const t=await this.get(e);for(const r of Object.values(t.buffs))for(const a of Object.values(r))for(const{multiplier:i,startAt:u,expireAt:c}of a)if(i<0&&(!c||!o.hasExpire(c))&&(u??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 a of t)await this.updateBuff(e,a);return}const r=p.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,a){const i=await h.fromDBToEquipableEquipment(t),u=o.filterNullAndUndefined(Object.values(r)),d=(await A.getAllPopulated()).find(b=>b.panoplyId===i.panoply);if(!d)return;const g=d.equipments.filter(b=>(u.find(U=>b.entityId===U.entityId)||!a&&i.entityId===b.entityId)&&(a?i.entityId!==b.entityId:!0)).length,O=g===d.equipments.length?d.fullBonus:g>=d.equipments.length/2?d.halfBonus:void 0;d.halfBonus&&"target"in d.halfBonus&&await this.removeBuff(e,d.halfBonus),d.fullBonus&&"target"in d.fullBonus&&await this.removeBuff(e,d.fullBonus),O&&"target"in O&&await this.updateBuff(e,O)}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),a=Object.fromEntries(Object.entries(t).filter(([,i])=>i!==0).map(([i,u])=>[`characteristics.${i}`,u]));await this.update(e,{$inc:a}),await this.updateHp(e,r)}async addScrollCharacteristic(e,t){const r=await this.getMaxHp(e),a=Object.fromEntries(Object.entries(t).filter(([,i])=>i!==0).map(([i,u])=>[`scrolls.${i}`,u]));await this.update(e,{$inc:a}),await this.updateHp(e,r)}async resetCharacteristics(e){const t=await this.getMaxHp(e),r={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};await this.update(e,{$set:{characteristics:r},$inc:{berry:-1e8}}),await this.updateHp(e,t)}async updateLastMessageWithXpDate(e){await this.update(e,{$set:{"xp.lastMessageWithXp":new Date}})}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 updateUserXp(e,t){const r=await this.calcXp(e,t,await this.getHpRatio(e));return await this.addXp(e,r),r}async updateUserBerry(e,t,r){const a=await this.calcBerry(e,t,r);return await this.addBerry(e,a),a}}const qt=n=>D.find(n).lean(),kt=async n=>await D.create({user:n});async function Rt(n){const e=await D.findOne({user:n}).lean();return e||y(await kt(n))}const xt=(n,e)=>D.findOneAndUpdate({user:n},e,{returnDocument:"after",upsert:!0}).lean();class _t extends At{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Rt(e)}fetchManyFromDb(e){return qt(e)}updateInDb(e,t){return xt(e,t)}}const v=new _t;class Ct extends m{async updateSendDailyQuest(e,t){await this.update(e,{$set:{sendDailyQuest:t}})}async updateSendDailyReport(e,t){await this.update(e,{$set:{sendDailyReport:t}})}async updateInventorySort(e,t){await this.update(e,{$set:{"sort.inventory":t}})}async updateReminderSettings(e,t,r){await this.update(e,{$set:{[`reminder.${t}`]:r}})}getUsersWithDailyReportEnable(){return this.getMany({sendDailyReport:!0})}}const Bt=n=>B.find(n).lean(),Ft=async n=>await B.create({user:n});async function Nt(n){const e=await B.findOne({user:n}).lean();return e||y(await Ft(n))}const Kt=(n,e)=>B.findOneAndUpdate({user:n},e,{returnDocument:"after",upsert:!0}).lean();class jt extends Ct{constructor(){super(3600)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return Nt(e)}fetchManyFromDb(e){return Bt(e)}updateInDb(e,t){return Kt(e,t)}}const ie=new jt;class Ht extends f{async getCommandCooldown(e,t){return(await this.get(e)).commands[t]}async lockUserCommand(e){await this.update(e,{$set:{lockUserCommand:new Date(Date.now()+2*3600*1e3)}}),await v.gainHp(e,1)}async useCommand(e,t,r){const{reminder:a}=await ie.get(e);await this.update(e,{$set:{[`commands.${t}`]:new Date(Date.now()+r)}}),a.commands[t]&&await ve.addReminder(e,`commands/${t}`,new Date(Date.now()+r))}}const Pt=async n=>await H.create({user:n});async function Qt(n){const e=await H.findOne({user:n}).lean();return e||y(await Pt(n))}const zt=(n,e)=>H.findOneAndUpdate({user:n},e,{returnDocument:"after",upsert:!0}).lean();class Yt extends Ht{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return Qt(e)}updateInDb(e,t){return zt(e,t)}}const Gt=new Yt;class Wt extends m{async isOrnamentIds(e,t=()=>!0){const a=(await this.getAll()).filter(t).map(({ornamentId:i})=>i);return e.every(i=>a.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(e=>this.isBackground(e))}async getAllTitles(){return(await this.getAll()).filter(e=>this.isTitle(e))}async getAllFactionTitles(){return(await this.getAll()).filter(e=>this.isFactionTitle(e))}async getAllQuestTitles(){return(await this.getAll()).filter(e=>this.isQuestTitle(e))}async getAllShopTitles(){return(await this.getAll()).filter(e=>this.isShopTitle(e))}formatBackgroundId(e){const t=o.isString(e)?e:e.ornamentId;return t==="background_default"?"par défaut":`"${o.capitalizeAllWords(t.split("_").join(" "))}"`}async getSomeShopTitles(e){const t=await this.getAllShopTitles();return o.sortBy(o.pickNthByOdds(e,t,r=>r.ornamentId,r=>r.odd??0),r=>r.price)}async getSomeBackgrounds(e){const t=await this.getAllBackgrounds();return o.sortBy(o.pickNthByOdds(e,t,r=>r.ornamentId,r=>r.odd??0),r=>r.price??0)}pickEachRarityOrnament(e,t){if(t.length!==p.RANK_IDS_WITHOUT_BASIC.length)throw new RangeError("pickEachRarityOrnament - must give same number of odds than ranks");return o.filterNullAndUndefined(t.map((r,a)=>{const i=p.RANK_IDS_WITHOUT_BASIC[a],u=e[i];return Math.random()>r||!u||!u.length?null:o.pickFrom(u)}))}}const Vt=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}),ue=s.models?.Ornaments||s.model("Ornaments",Vt),Xt=async(n,e)=>ue.find(n,{},e).lean();async function Lt(n){const e=await ue.findOne({ornamentId:n}).lean();return e||null}const Jt=(n,e)=>ue.findOneAndUpdate(n,e,{returnDocument:"after"}).lean();class Zt extends Wt{constructor(){super(3600)}updateInDb(e,t){return Jt(e,t)}fetchFromDb(e){return Lt(e)}fetchManyFromDb(e,t){return Xt(e,t)}getKey(e){return e.ornamentId}normalizeKey(e){return e}}const I=new Zt;class en extends f{async unlockTitle(e,t){await I.isOrnamentIds([t],I.isTitle)&&await this.update(e,{$addToSet:{unlockedTitles:t}})}async unlockTitles(e,t){await I.isOrnamentIds(t,I.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 I.isOrnamentIds([t],I.isBackground)&&await this.update(e,{$addToSet:{unlockedBackgrounds:t}})}async unlockBackgrounds(e,t){await I.isOrnamentIds(t,I.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 tn=async n=>await G.create({user:n});async function nn(n){const e=await G.findOne({user:n}).lean();return e||y(await tn(n))}const rn=async(n,e)=>G.findOneAndUpdate({user:n},e,{upsert:!0,returnDocument:"after"}).lean();class an extends en{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return nn(e)}updateInDb(e,t){return rn(e,t)}}const ce=new an;class sn extends m{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 getCompletedCount(e){return(await this.getMany({user:e,status:p.QuestStatus.COMPLETED})).length}async completeQuest(e,t=!1){const r=o.yesterday();r.setHours(0,0,0,0);const a=new Date;return a.setHours(0,0,0,0),this.update(e,[{$set:{...t?{streak:{$cond:{if:{$and:[{$gte:["$lastCompletionDate",r]},{$lt:["$lastCompletionDate",a]}]},then:{$add:[{$ifNull:["$streak",0]},1]},else:1}}}:{},lastCompletionDate:new Date,status:p.QuestStatus.COMPLETED}}],{upsert:!1})}}function un(n){return q.find(n).lean()}const cn=async n=>await q.create({...n});async function dn(n){const e=await q.findOne(n).lean();return e||y(await cn(n))}function ln(n,e,t){return q.findOneAndUpdate(n,e,{upsert:!0,...t,returnDocument:"after"}).lean()}class on extends sn{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 dn(e)}fetchManyFromDb(e){return un(e)}updateInDb(e,t,r){return ln(e,t,r)}}const de=new on;class pn extends f{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 yn=async n=>await V.create({user:n});async function fn(n){const e=await V.findOne({user:n}).lean();return e||y(await yn(n))}const mn=(n,e)=>V.findOneAndUpdate({user:n},e,{upsert:!0,returnDocument:"after"}).lean();class hn extends pn{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return fn(e)}updateInDb(e,t){return mn(e,t)}}const le=new hn;class Sn extends f{async updateDailyReport(e){const t=await v.get(e),r=await ce.get(e),a=await de.getMany({user:e,status:p.QuestStatus.COMPLETED}),i=await le.get(e);await this.update(e,{$set:{xpYesterday:t.xp.amount,berryYesterday:t.berry,previousCompletedQuest:a.map(({questId:u})=>u),"previousOrnament.unlockedBadges":r.unlockedBadges,"previousOrnament.unlockedTitles":r.unlockedTitles,"previousOrnament.unlockedBackgrounds":r.unlockedBackgrounds,previousMessageSent:i.messageSent}})}async getDailyReport(e){const{previousOrnament:t,previousCompletedQuest:r,xpYesterday:a,berryYesterday:i,previousMessageSent:u}=await this.get(e),c=await v.get(e),d=await de.getMany({user:e,status:p.QuestStatus.COMPLETED}),g=await ce.get(e),O=await le.get(e),{berry:b,xp:U}=c,{voice:De,amount:Ua}=U,{unlockedBadges:Ta,unlockedBackgrounds:va,unlockedTitles:Ea}=g;return{berry:b-i,xp:Ua-a,message:O.messageSent-u,voice:o.sameDay(De.lastConnection,o.yesterday())?De.minutesInVoiceToday:0,quest:o.exclude(d.map(({questId:Oa})=>Oa),r),badge:o.exclude(Ta,t.unlockedBadges),title:o.exclude(Ea,t.unlockedTitles),background:o.exclude(va,t.unlockedBackgrounds)}}async getAllDailyReportsToSend(){const e=await ie.getUsersWithDailyReportEnable(),t=await Te.getMany({_id:{$in:e.map(({user:r})=>r)},faction:{$ne:"citizen"}});return await Promise.all(t.map(async({_id:r,discordId:a})=>({report:await this.getDailyReport(r),user:r,discordId:a})))}}const wn=n=>P.create({user:n});async function gn(n){const e=await P.findOne({user:n}).lean();return e||y(await wn(n))}const bn=(n,e)=>P.findOneAndUpdate({user:n},e,{upsert:!0,returnDocument:"after"}).lean();class $n extends Sn{constructor(){super(60)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return gn(e)}updateInDb(e,t){return bn(e,t)}}const In=new $n;class Un extends f{async setGuessGame(e,t,r,a){await this.update(e,{$set:{guess:{amount:t,tries:r,numberToGuess:a,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 Tn=async n=>await z.create({user:n});async function vn(n){const e=await z.findOne({user:n}).lean();return e||y(await Tn(n))}const En=(n,e)=>z.findOneAndUpdate({user:n},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 vn(e)}updateInDb(e,t){return En(e,t)}}const Dn=new On,Mn=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},xp:{type:Number,default:0},berry:{type:Number,default:0},faction:{type:Number,default:0}}),C=s.models?.UserRank||s.model("UserRank",Mn);class An extends f{async computeAllXpRanks(){const t=(await D.aggregate([{$setWindowFields:{sortBy:{"xp.amount":-1},output:{xpRank:{$rank:{}}}}},{$project:{user:1,xpRank:1}}])).map(({user:r,xpRank:a})=>({updateOne:{filter:{user:r},update:{$set:{xp:a}},upsert:!0}}));t.length>0&&await C.bulkWrite(t),this.clearAll()}async computeAllBerryRanks(){const t=(await D.aggregate([{$setWindowFields:{sortBy:{berry:-1},output:{berryRank:{$rank:{}}}}},{$project:{user:1,berryRank:1}}])).map(({user:r,berryRank:a})=>({updateOne:{filter:{user:r},update:{$set:{berry:a}},upsert:!0}}));t.length>0&&await C.bulkWrite(t),this.clearAll()}async computeAllFactionRanks(){const t=(await $.aggregate([{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$setWindowFields:{partitionBy:"$faction",sortBy:{"meta.xp.amount":-1},output:{factionRank:{$rank:{}}}}},{$project:{factionRank:1}}])).map(({_id:r,factionRank:a})=>({updateOne:{filter:{user:r},update:{$set:{faction:a}},upsert:!0}}));t.length>0&&await C.bulkWrite(t),this.clearAll()}async computeAllRanks(){await Promise.all([this.computeAllXpRanks(),this.computeAllBerryRanks(),this.computeAllFactionRanks()])}}const qn=async n=>await C.create({user:n});async function kn(n){const e=await C.findOne({user:n}).lean();return e||y(await qn(n))}const Rn=(n,e)=>C.findOneAndUpdate({user:n},e,{returnDocument:"after",upsert:!0}).lean();class xn extends An{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return kn(e)}updateInDb(e,t){return Rn(e,t)}}const _n=new xn,Cn=new s.Schema({speakerId:{type:String,required:!0},order:{type:Number},args:{type:[String],enum:p.STORY_MESSAGE_ARGS,default:void 0}},{_id:!1}),Bn=new s.Schema({stepId:{type:String,required:!0},type:{type:String,required:!0,enum:p.STORY_STEP_TYPES},actionType:{type:String,enum:p.STORY_ACTION_TYPES},messages:{type:[Cn],default:void 0},payload:{type:s.Schema.Types.Mixed,default:void 0},next:{type:String}},{_id:!1}),Fn=new s.Schema({sceneId:{type:String,required:!0},steps:{type:Map,of:Bn,required:!0},entryStepId:{type:String,required:!0},next:{type:String}},{_id:!1}),Nn=new s.Schema({chapterId:{type:String,required:!0},scenes:{type:Map,of:Fn,required:!0},entrySceneId:{type:String,required:!0},next:{type:String}},{_id:!1}),Kn=new s.Schema({type:{type:String,required:!0,enum:p.STORY_SPEAKER_TYPES},speakerId:{type:String,required:!0}},{_id:!1}),Ee=new s.Schema({storyId:{type:String,required:!0,unique:!0},speakers:{type:[Kn],required:!0},chapters:{type:Map,of:Nn,required:!0},entryChapterId:{type:String,required:!0}});Ee.pre("findOneAndUpdate",function(){this.setOptions({runValidators:!0})});const J=s.models?.Story||s.model("Story",Ee),jn=async n=>await J.create(n),Z={storyId:"main",speakers:p.speakers,chapters:{[p.chapterOne.chapterId]:p.chapterOne},entryChapterId:p.chapterOne.chapterId};class Hn extends m{async seed(){return await this.get(Z.storyId)?this.update({storyId:Z.storyId},{$set:Z}):jn(Z)}}const Pn=(n,e={})=>J.find(n,null,e).lean(),Qn=n=>J.findOne({storyId:n}).lean(),zn=(n,e)=>J.findOneAndUpdate({storyId:n},e,{returnDocument:"after"}).lean();class Yn extends Hn{constructor(){super(86400)}normalizeKey(e){return e}getKey(e){return e.storyId}fetchFromDb(e){return Qn(e)}fetchManyFromDb(e,t){return Pn(e,t)}updateInDb(e,t){const r=typeof e=="string"?e:e.storyId;return zn(r,t)}}const E=new Yn,Gn=new s.Schema({chapterId:{type:String,required:!0},sceneId:{type:String,required:!0},stepId:{type:String,required:!0},value:{type:String,required:!0}},{_id:!1}),Oe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,ref:"User",index:!0},storyId:{type:String,required:!0},currentChapterId:{type:String,required:!0},currentSceneId:{type:String,required:!0},currentStepId:{type:String,required:!0},status:{type:String,required:!0,enum:["in_progress","completed"],default:"in_progress"},choices:{type:[Gn],default:[]}});Oe.index({user:1,storyId:1},{unique:!0});const K=s.models?.UserStory||s.model("UserStory",Oe),Wn=async(n,e,t,r,a)=>await K.create({user:n,storyId:e,currentChapterId:t,currentSceneId:r,currentStepId:a,status:"in_progress"}),Vn=(n,e)=>K.deleteOne({user:n,storyId:e}).then(()=>{}),Xn=(n,e,t,r)=>{const a=n.chapters[e];if(!a)return null;const i=a.scenes[t];if(!i)return null;if(i.steps[r])return{chapterId:e,sceneId:t,stepId:r};if(i.next){const u=a.scenes[i.next];if(u)return{chapterId:e,sceneId:i.next,stepId:u.entryStepId}}if(a.next){const u=n.chapters[a.next];if(u){const c=u.scenes[u.entrySceneId];if(c)return{chapterId:a.next,sceneId:u.entrySceneId,stepId:c.entryStepId}}}return null},ee=(n,e)=>{const t=n.chapters[e.currentChapterId];if(!t)return null;const r=t.scenes[e.currentSceneId];return r?r.steps[e.currentStepId]??null:null},Ln=(n,e,t,r,a)=>{const i=[],u=new Set;let c=n.entryStepId;for(;c&&!u.has(c);){u.add(c);const d=n.steps[c];if(!d)break;if(d.type!=="action"){if(i.push({step:d}),c===a)break;c=d.next;continue}if(d.actionType==="button"){const O=e.find(U=>U.chapterId===t&&U.sceneId===r&&U.stepId===c);if(!O){i.push({step:d});break}const b=d.payload.find(U=>U.actionId===O.value);if(!b||(i.push({step:d,selectedAction:b}),c===a))break;c=b.next;continue}if(i.push({step:d}),c===a)break;c=d.payload[0]?.next}return i};class Jn extends m{async getCurrentStep(e,t){const r=await this.get({user:e,storyId:t});if(!r)return null;const a=await E.get(t);return a?ee(a,r):null}async getSceneSteps(e,t,r,a){const i=await this.get({user:e,storyId:t});if(!i)return null;const u=await E.get(t);if(!u)return null;const c=u.chapters[r];if(!c)return null;const d=c.scenes[a];if(!d)return null;const g=i.status==="in_progress"&&i.currentChapterId===r&&i.currentSceneId===a;return Ln(d,i.choices,r,a,g?i.currentStepId:void 0)}async start(e,t){const r=await E.get(t);if(!r)return null;const a=r.chapters[r.entryChapterId];if(!a)return null;const i=a.scenes[a.entrySceneId];if(!i)return null;await Vn(e,t),this.invalidate({user:e,storyId:t});const u=await Wn(e,t,r.entryChapterId,a.entrySceneId,i.entryStepId),c=y(u);return this.cache.set(this.normalizeKey({user:e,storyId:t}),c),c}async advanceToNext(e,t){const r=await this.get({user:e,storyId:t});if(!r)return{status:"error"};if(r.status==="completed")return{status:"completed"};const a=await E.get(t);if(!a)return{status:"error"};const i=ee(a,r);if(!i)return{status:"error"};if(i.type==="action")return{status:"action_required"};if(!i.next)return{status:"scene_ended"};const u=a.chapters[r.currentChapterId];if(!u)return{status:"error"};const c=u.scenes[r.currentSceneId];if(!c)return{status:"error"};if(!c.steps[i.next])return{status:"scene_ended"};const d=await this.advanceTo(e,t,a,r.currentChapterId,r.currentSceneId,i.next);return d?{status:"advanced",data:d}:{status:"error"}}async advanceToNextScene(e,t){const r=await this.get({user:e,storyId:t});if(!r||r.status==="completed")return null;const a=await E.get(t);if(!a)return null;const i=a.chapters[r.currentChapterId];if(!i)return null;const u=i.scenes[r.currentSceneId];if(!u||!u.next)return null;const c=i.scenes[u.next];return c?this.update({user:e,storyId:t},{$set:{currentSceneId:u.next,currentStepId:c.entryStepId}}):null}async validateCommandAndAdvance(e,t,r){const a=await this.get({user:e,storyId:t});if(!a||a.status==="completed")return null;const i=await E.get(t);if(!i)return null;const u=ee(i,a);if(!u||u.type!=="action"||u.actionType!=="command")return null;const c=u.payload.find(d=>d.commandId===r);return c?this.advanceTo(e,t,i,a.currentChapterId,a.currentSceneId,c.next):null}async validateActionAndAdvance(e,t,r){const a=await this.get({user:e,storyId:t});if(!a||a.status==="completed")return null;const i=await E.get(t);if(!i)return null;const u=ee(i,a);if(!u||u.type!=="action")return null;const c=u.payload.find(d=>d.actionId===r);return c?this.advanceTo(e,t,i,a.currentChapterId,a.currentSceneId,c.next,{chapterId:a.currentChapterId,sceneId:a.currentSceneId,stepId:a.currentStepId,value:r}):null}async advanceTo(e,t,r,a,i,u,c){const d=Xn(r,a,i,u);return d?this.update({user:e,storyId:t},{$set:{currentChapterId:d.chapterId,currentSceneId:d.sceneId,currentStepId:d.stepId},...c&&{$push:{choices:c}}}):this.update({user:e,storyId:t},{$set:{status:"completed"},...c&&{$push:{choices:c}}})}}const Zn=(n,e={})=>K.find(n,null,e).lean(),er=(n,e)=>K.findOne({user:n,storyId:e}).lean(),tr=(n,e)=>K.findOneAndUpdate(n,e,{returnDocument:"after"}).lean();class nr extends Jn{constructor(){super(120)}normalizeKey(e){return`${e.user.toString()}:${e.storyId}`}getKey(e){return{user:e.user,storyId:e.storyId}}fetchFromDb(e){return er(e.user,e.storyId)}fetchManyFromDb(e,t){return Zn(e,t)}updateInDb(e,t){return tr(e,t)}}const rr=new nr;class ar extends f{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 R.updateOne({user:e,"bet666.last":{$gte:t,$lt:r}},{$inc:{"bet666.count":1},$set:{"bet666.last":new Date}}),await R.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 sr=async n=>await R.create({user:n});async function ir(n){const e=await R.findOne({user:n}).lean();return e||y(await sr(n))}const ur=(n,e)=>R.findOneAndUpdate({user:n},e,{upsert:!0,returnDocument:"after"}).lean();class cr extends ar{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return ir(e)}updateInDb(e,t){return ur(e,t)}}const dr=new cr;class lr extends f{async workIncrement(e){await this.update(e,{$inc:{workCount:1}})}async updateTotalSpentInShop(e,t){await this.update(e,{$inc:{totalSpentInShop:t}})}}const or=n=>W.create({user:n});async function pr(n){const e=await W.findOne({user:n}).lean();return e||y(await or(n))}const yr=(n,e)=>W.findOneAndUpdate({user:n},e,{upsert:!0,returnDocument:"after"}).lean();class fr extends lr{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return pr(e)}updateInDb(e,t){return yr(e,t)}}const mr=new fr;class hr extends f{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 Sr=async n=>await X.create({user:n});async function wr(n){const e=await X.findOne({user:n}).lean();return e||y(await Sr(n))}const gr=(n,e)=>X.findOneAndUpdate({user:n},e,{upsert:!0,returnDocument:"after"}).lean();class br extends hr{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 $r=new br;class Ir extends f{async readEdito(e){const t=new Date;t.setHours(0,0,0,0),await M.updateOne({user:e,"edito.lastTimeRead":{$gte:t}},{$inc:{"edito.readToday":1},$set:{"edito.lastTimeRead":new Date}}),await M.updateOne({user:e,"edito.lastTimeRead":{$lt:t}},{$set:{"edito.lastTimeRead":new Date,"edito.readToday":1}}),this.invalidate(e)}async getTotalEditoReadToday(){const e=new Date;return e.setHours(0,0,0,0),(await M.aggregate([{$match:{"edito.lastTimeRead":{$gte:e},"edito.readToday":{$gt:0}}},{$group:{_id:null,total:{$sum:"$edito.readToday"}}}]))[0]?.total??0}}const Ur=async n=>await M.create({user:n});async function Tr(n){const e=await M.findOne({user:n}).lean();return e||y(await Ur(n))}const vr=(n,e)=>M.findOneAndUpdate({user:n},e,{upsert:!0,returnDocument:"after"}).lean();class Er extends Ir{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Tr(e)}updateInDb(e,t){return vr(e,t)}}const Or=new Er;class Dr extends f{async updateCraftStats(e,t,r){const a=await h.get(r);!a||!h.isItem(a)||await this.update(e,{$inc:{"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 x.updateOne({user:e,"bottle.lastUsed":{$gte:r}},{$inc:{"bottle.usedToday":t},$set:{"bottle.lastUsed":new Date}}),await x.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 Mr=async n=>await x.create({user:n});async function Ar(n){const e=await x.findOne({user:n}).lean();return e||y(await Mr(n))}const qr=(n,e)=>x.findOneAndUpdate({user:n},e,{upsert:!0,returnDocument:"after"}).lean();class kr extends Dr{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Ar(e)}updateInDb(e,t){return qr(e,t)}}const Rr=new kr;class xr extends m{async maxCraftQuantity(e,t){const r=await T.get(e);let a=1/0;for(const i of t)a=Math.min(a,Math.floor((r.itemList[i.entityId]??0)/i.size));return a}async hasEnoughItemsForRecipe(e,t,r){const a=await T.get(e);for(const i of t.entities)if((a.itemList[i.entityId]??0)<i.size*r)return!1;return!0}decodeCraftId(e){return e.split(";").map((t,r)=>({entityId:t==="null"?null:t,index:r}))}encodeCraftId(e){return e.map(({entityId:t})=>`${t}`).join(";")}async isValidRecipe(e){return!!(await this.getAll()).find(r=>r.craftId===e)}async getRecipeResult(e,t){const r=await T.get(e),a=(await A.getPanoplyBonus(r.equippedItems)).find(([i,u])=>i.panoplyId==="little_blacksmith"&&u!==null);return a?.[1]==="full"&&t==="chest_3"?"chest_blacksmith_3":a?.[1]==="half"&&t==="chest_2"?"chest_blacksmith_2":a?.[1]==="half"&&t==="chest_1"?"chest_blacksmith_1":t}}const _r=new s.Schema({entityId:{type:String,required:!0},size:{type:Number,required:!0}},{_id:!1}),Cr=new s.Schema({entityId:{type:String,required:!0},size:{type:Number,required:!0}},{_id:!1}),Br=new s.Schema({craftId:{type:String,unique:!0,required:!0},name:{type:String,required:!0},entities:{type:[_r],required:!0},result:{type:Cr,required:!0}},{minimize:!1}),te=s.models?.Recipes||s.model("Recipes",Br),Fr=async n=>await te.create({...n}),Nr=async(n,e)=>te.find(n,{},e).lean();async function Kr(n){const e=await te.findOne({craftId:n}).lean();return e||null}const jr=(n,e)=>te.findOneAndUpdate(n,e,{returnDocument:"after"}).lean();class Hr extends xr{constructor(){super(3600)}createInDb(e){return Fr(e)}updateInDb(e,t){return jr(e,t)}fetchFromDb(e){return Kr(e)}fetchManyFromDb(e,t){return Nr(e,t)}normalizeKey(e){return e}getKey(e){return e.craftId}}const Pr=new Hr,Qr=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",Qr),zr=(n,e)=>ne.deleteOne({bannedUserId:n,guildId:e});class Yr extends m{async getUnbanUsers(){return this.getMany({unbannedTimestamp:{$lte:new Date,$ne:null}})}async banUserFromGuild({bannedUserId:e,guildId:t,...r}){await this.update({bannedUserId:e,guildId:t},{...r})}async isBannedFromGuild(e,t){const r=await this.get({bannedUserId:e,guildId:t});return!!(r&&(!r.unbannedTimestamp||r.unbannedTimestamp>new Date))}async deleteBan(e,t){await zr(e,t),this.invalidate({bannedUserId:e,guildId:t})}}const Gr=n=>ne.find(n).lean(),Wr=n=>ne.findOne(n).lean(),Vr=(n,e)=>ne.findOneAndUpdate(n,e,{returnDocument:"after",upsert:!0}).lean();class Xr extends Yr{constructor(){super(3600*36)}normalizeKey(e){return`${e.guildId}/${e.bannedUserId}`}getKey({bannedUserId:e,guildId:t}){return{bannedUserId:e,guildId:t}}fetchFromDb(e){return Wr(e)}fetchManyFromDb(e){return Gr(e)}updateInDb(e,t){return Vr(e,t)}}const Lr=new Xr,Jr=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}}}),re=s.models?.Invitation||s.model("Invitation",Jr),Zr=n=>re.create({...n}),ea=async n=>{await re.deleteMany({...n})};class ta extends f{async sendInvitation({senderId:e,receiverId:t,gameMode:r,...a}){return await this.get({senderId:e,gameMode:r,receiverId:t})?null:await Zr({...a,senderId:e,gameMode:r,receiverId:t})}async deleteInvitation({senderId:e,receiverId:t,gameMode:r}){await ea({senderId:e,gameMode:r,receiverId:t}),this.invalidate({senderId:e,gameMode:r,receiverId:t})}}const na=n=>re.findOne({...n}).lean(),ra=(n,e)=>re.findOneAndUpdate(n,e,{returnDocument:"after"}).lean();class aa extends ta{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 na(e)}updateInDb(e,t){return ra(e,t)}}const sa=new aa;class ia extends f{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 setRankingMessage(e,t){await this.update({guildId:e},{$set:{"ranking.messageId":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,a])=>[`roles.${r}`,a]))})}async updateChannelId(e,t){await this.update({guildId:e},{$set:Object.fromEntries(Object.entries(t).map(([r,a])=>[`channels.${r}`,a]))})}}const ua=new s.Schema({guildId:{type:String,required:!0,unique:!0},ranking:{messageId:{type:String,default:null}},roles:{premium:{type:String,default:null},booster:{type:String,default:null},scam:{type:String,default:null},canChangeFaction:{type:String,default:null},canChooseFaction:{type:String,default:null},staff:{type:String,default:null},moderator:{type:String,default:null},marine:{type:String,default:null},pirate:{type:String,default:null},revolutionary:{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:{type:String,default:null},crew:{type:String,default:null},ranking:{type:String,default:null}},edito:{price:{type:Number,default:100},messageId:{type:String,default:null}},crew:{crewChannelIds:{type:[{channelId:{type:String},crewId:{type:String}}],default:[]}}}),oe=s.models?.Settings||s.model("Settings",ua),ca=n=>oe.create({guildId:n}),da=async n=>{const e=await oe.findOne({guildId:n}).lean();return e||y(await ca(n))},la=(n,e)=>oe.findOneAndUpdate(n,e,{upsert:!0,returnDocument:"after"}).lean();class oa extends ia{constructor(){super(3600*24*30)}normalizeKey(e){return e}getKey({guildId:e}){return e}fetchFromDb(e){return da(e)}updateInDb(e,t){return la(e,t)}}const pa=new oa,ya=new s.Schema({warnedUserId:{type:String,required:!0,index:!0},authorId:String,date:{type:Date,default:Date.now()},reason:{type:String,default:null}}),ae=s.models?.Warn||s.model("Warn",ya),fa=n=>ae.countDocuments(n),ma=n=>ae.create({...n}),ha=n=>ae.findByIdAndDelete(n).lean();class Sa extends m{getUserWarns(e){return this.getMany({warnedUserId:e})}getUserWarnCount(e){return fa({warnedUserId:e})}async createWarn(e){await ma(e)}async deleteWarn(e){const t=await ha(e);return t&&this.invalidate(this.getKey(t)),t}}const wa=n=>ae.find(n).lean();class ga extends Sa{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 wa(e)}updateInDb(){throw new Error("Method not implemented.")}}const ba=new ga,$a=n=>{s.connect(n)};class Ia extends s.Types.ObjectId{}l.ObjectId=Ia,l.QUEST_MIDDLEWARE_EVENT_NAME=w,l.banService=Lr,l.connectToServices=$a,l.emitQuestMiddlewareEvent=S,l.entityService=h,l.invitationService=sa,l.ornamentService=I,l.panoplyService=A,l.recipeService=Pr,l.registerQuestMiddlewareEvents=ke,l.reminderService=ve,l.settingsService=pa,l.storyService=E,l.userCooldownService=Gt,l.userDailyReportService=In,l.userEncyclopediaService=L,l.userGamesService=Dn,l.userInventoryService=T,l.userMetaService=v,l.userOrnamentService=ce,l.userQuestService=de,l.userRankService=_n,l.userService=Te,l.userSettingsService=ie,l.userStatsCasinoService=dr,l.userStatsEconomyService=mr,l.userStatsEngagementService=le,l.userStatsFlagsService=$r,l.userStatsFrequencyService=Or,l.userStatsInventoryService=Rr,l.userStoryService=rr,l.warnService=ba,Object.defineProperty(l,Symbol.toStringTag,{value:"Module"})}));
|
package/dist/services/index.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export * from './user-ornament';
|
|
|
9
9
|
export * from './user-quest';
|
|
10
10
|
export * from './user-rank';
|
|
11
11
|
export * from './user-settings';
|
|
12
|
+
export * from './user-story';
|
|
12
13
|
export * from './user-stats/casino';
|
|
13
14
|
export * from './user-stats/economy';
|
|
14
15
|
export * from './user-stats/engagement';
|
|
@@ -23,6 +24,7 @@ export * from './ban';
|
|
|
23
24
|
export * from './invitations';
|
|
24
25
|
export * from './reminder';
|
|
25
26
|
export * from './settings';
|
|
27
|
+
export * from './story';
|
|
26
28
|
export * from './warn';
|
|
27
29
|
export * from './types';
|
|
28
30
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAE7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AAEzB,cAAc,OAAO,CAAC;AACtB,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AAEvB,cAAc,SAAS,CAAC"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { Document, Types } from 'mongoose';
|
|
2
|
-
|
|
3
|
-
export type ReminderType = 'custom' | `commands/${CooldownCommand}` | 'raid/classic' | 'raid/special';
|
|
2
|
+
export type ReminderType = 'custom' | `commands/${string}`;
|
|
4
3
|
export interface Reminder {
|
|
5
4
|
user: Types.ObjectId;
|
|
6
5
|
type: ReminderType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/reminder/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEhD,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/reminder/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEhD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,YAAY,MAAM,EAAE,CAAC;AAE3D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC;IAErB,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,gBAAiB,SAAQ,QAAQ,EAAE,QAAQ;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../src/services/story/definition/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAGtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAG9C,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,aAAa,CACiB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Schema } from 'mongoose';
|
|
2
|
+
import type { StoryDocument } from '../types';
|
|
3
|
+
declare const storySchema: Schema<StoryDocument, import("mongoose").Model<StoryDocument, any, any, any, import("mongoose").Document<unknown, any, StoryDocument, any, {}> & StoryDocument & Required<{
|
|
4
|
+
_id: import("mongoose").Types.ObjectId;
|
|
5
|
+
}> & {
|
|
6
|
+
__v: number;
|
|
7
|
+
}, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, StoryDocument, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<StoryDocument>, {}, import("mongoose").ResolveSchemaOptions<import("mongoose").DefaultSchemaOptions>> & import("mongoose").FlatRecord<StoryDocument> & Required<{
|
|
8
|
+
_id: import("mongoose").Types.ObjectId;
|
|
9
|
+
}> & {
|
|
10
|
+
__v: number;
|
|
11
|
+
}>;
|
|
12
|
+
export { storySchema };
|
|
13
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/services/story/definition/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AASlC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AA2D9C,QAAA,MAAM,WAAW;;;;;;;;EASf,CAAC;AAMH,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AbstractCachedServiceWithFetchMany } from '../AbstractCachedService';
|
|
2
|
+
import type { Story, StoryDocument } from './types';
|
|
3
|
+
export declare abstract class StoryHelper extends AbstractCachedServiceWithFetchMany<Story, StoryDocument, string> {
|
|
4
|
+
seed(): Promise<StoryDocument | (import("mongoose").FlattenMaps<StoryDocument> & Required<{
|
|
5
|
+
_id: import("mongoose").Types.ObjectId;
|
|
6
|
+
}> & {
|
|
7
|
+
__v: number;
|
|
8
|
+
}) | null>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../../src/services/story/helper.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kCAAkC,EAAE,MAAM,0BAA0B,CAAC;AAE9E,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAWpD,8BAAsB,WAAY,SAAQ,kCAAkC,CAC1E,KAAK,EACL,aAAa,EACb,MAAM,CACP;IACc,IAAI;;;;;CAOlB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/story/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,SAAS,CAAC;AAE7B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../../src/services/story/process/create.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAErD,eAAO,MAAM,WAAW,GAAU,OAAO,KAAK,KAAG,OAAO,CAAC,aAAa,CAErE,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { QueryOptions, RootFilterQuery } from 'mongoose';
|
|
2
|
+
import type { Lean } from '../../types';
|
|
3
|
+
import type { StoryDocument } from '../types';
|
|
4
|
+
export declare const findStories: (filter: RootFilterQuery<StoryDocument>, options?: QueryOptions<StoryDocument>) => Promise<Lean<StoryDocument>[]>;
|
|
5
|
+
//# sourceMappingURL=findMany.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findMany.d.ts","sourceRoot":"","sources":["../../../../src/services/story/process/findMany.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE9D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,eAAO,MAAM,WAAW,GACtB,QAAQ,eAAe,CAAC,aAAa,CAAC,EACtC,UAAS,YAAY,CAAC,aAAa,CAAM,KACxC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAE/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findOne.d.ts","sourceRoot":"","sources":["../../../../src/services/story/process/findOne.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,eAAO,MAAM,SAAS,GACpB,SAAS,MAAM,KACd,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAEpC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Lean, MongooseUpdate } from '../../types';
|
|
2
|
+
import type { StoryDocument } from '../types';
|
|
3
|
+
export declare const updateStory: (storyId: string, update: MongooseUpdate<StoryDocument>) => Promise<Lean<StoryDocument> | null>;
|
|
4
|
+
//# sourceMappingURL=updateOne.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateOne.d.ts","sourceRoot":"","sources":["../../../../src/services/story/process/updateOne.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,eAAO,MAAM,WAAW,GACtB,SAAS,MAAM,EACf,QAAQ,cAAc,CAAC,aAAa,CAAC,KACpC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAMpC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { QueryOptions, RootFilterQuery } from 'mongoose';
|
|
2
|
+
import type { Lean, MongooseUpdate } from '../types';
|
|
3
|
+
import { StoryHelper } from './helper';
|
|
4
|
+
import type { StoryDocument } from './types';
|
|
5
|
+
declare class StoryService extends StoryHelper {
|
|
6
|
+
constructor();
|
|
7
|
+
protected normalizeKey(key: string): string;
|
|
8
|
+
protected getKey(e: Lean<StoryDocument>): string;
|
|
9
|
+
protected fetchFromDb(filter: string): Promise<Lean<StoryDocument> | null>;
|
|
10
|
+
protected fetchManyFromDb(filter: RootFilterQuery<StoryDocument>, options: QueryOptions<StoryDocument>): Promise<Lean<StoryDocument>[]>;
|
|
11
|
+
protected updateInDb(filter: RootFilterQuery<StoryDocument>, update: MongooseUpdate<StoryDocument>): Promise<Lean<StoryDocument> | null>;
|
|
12
|
+
}
|
|
13
|
+
export declare const storyService: StoryService;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/story/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE9D,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAIvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,cAAM,YAAa,SAAQ,WAAW;;IAKpC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI3C,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,MAAM;IAIhD,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;IAI1E,SAAS,CAAC,eAAe,CACvB,MAAM,EAAE,eAAe,CAAC,aAAa,CAAC,EACtC,OAAO,EAAE,YAAY,CAAC,aAAa,CAAC,GACnC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;IAIjC,SAAS,CAAC,UAAU,CAClB,MAAM,EAAE,eAAe,CAAC,aAAa,CAAC,EACtC,MAAM,EAAE,cAAc,CAAC,aAAa,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;CAOvC;AAED,eAAO,MAAM,YAAY,cAAqB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Document } from 'mongoose';
|
|
2
|
+
import type { ChapterId, StoryChapter, StorySpeaker } from '@opfr/definitions';
|
|
3
|
+
export interface Story {
|
|
4
|
+
storyId: string;
|
|
5
|
+
speakers: StorySpeaker[];
|
|
6
|
+
chapters: Record<ChapterId, StoryChapter>;
|
|
7
|
+
entryChapterId: ChapterId;
|
|
8
|
+
}
|
|
9
|
+
export interface StoryDocument extends Document, Story {
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/story/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE/E,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAC1C,cAAc,EAAE,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,aAAc,SAAQ,QAAQ,EAAE,KAAK;CAAG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/services/user-cooldown/definition/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAErD,QAAA,MAAM,kBAAkB;;;;;;;;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/services/user-cooldown/definition/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAErD,QAAA,MAAM,kBAAkB;;;;;;;;EAatB,CAAC;AAEH,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { Types } from 'mongoose';
|
|
2
2
|
import { AbstractCachedService } from '../AbstractCachedService';
|
|
3
|
-
import type {
|
|
3
|
+
import type { UserCooldown, UserCooldownDocument } from './types';
|
|
4
4
|
export declare abstract class UserCooldownHelper extends AbstractCachedService<UserCooldown, UserCooldownDocument, Types.ObjectId, true> {
|
|
5
|
-
getCommandCooldown(userId: Types.ObjectId, commandName:
|
|
5
|
+
getCommandCooldown(userId: Types.ObjectId, commandName: string): Promise<Date>;
|
|
6
6
|
lockUserCommand(userId: Types.ObjectId): Promise<void>;
|
|
7
|
-
useCommand(userId: Types.ObjectId, commandName:
|
|
7
|
+
useCommand(userId: Types.ObjectId, commandName: string, ms: number): Promise<void>;
|
|
8
8
|
}
|
|
9
9
|
//# sourceMappingURL=helper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../../src/services/user-cooldown/helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAIjE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../../src/services/user-cooldown/helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAIjE,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAElE,8BAAsB,kBAAmB,SAAQ,qBAAqB,CACpE,YAAY,EACZ,oBAAoB,EACpB,KAAK,CAAC,QAAQ,EACd,IAAI,CACL;IACc,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM;IAK9D,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ;IAStC,UAAU,CACrB,MAAM,EAAE,KAAK,CAAC,QAAQ,EACtB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,MAAM;CAkBb"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/user-cooldown/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/user-cooldown/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,SAAS,CAAC;AAE7B,cAAc,WAAW,CAAC"}
|
|
@@ -1,14 +1,7 @@
|
|
|
1
1
|
import type { Document, Types } from 'mongoose';
|
|
2
|
-
import type { COOLDOWN_COMMANDS } from './constants';
|
|
3
|
-
export type CooldownCommand = (typeof COOLDOWN_COMMANDS)[number];
|
|
4
2
|
export interface UserCooldown {
|
|
5
3
|
user: Types.ObjectId;
|
|
6
|
-
|
|
7
|
-
classic: Date;
|
|
8
|
-
special: Date;
|
|
9
|
-
};
|
|
10
|
-
lockUserCommand: Date;
|
|
11
|
-
commands: Record<CooldownCommand, Date>;
|
|
4
|
+
commands: Record<string, Date>;
|
|
12
5
|
}
|
|
13
6
|
export interface UserCooldownDocument extends Document, UserCooldown {
|
|
14
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/user-cooldown/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEhD,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/user-cooldown/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC;IAErB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,oBAAqB,SAAQ,QAAQ,EAAE,YAAY;CAAG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/services/user-settings/definition/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAErD,QAAA,MAAM,kBAAkB;;;;;;;;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/services/user-settings/definition/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAErD,QAAA,MAAM,kBAAkB;;;;;;;;EAqBtB,CAAC;AAEH,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { Document, Types } from 'mongoose';
|
|
2
2
|
import type { SortValue } from '@opfr/definitions';
|
|
3
3
|
import type { Path } from '@opfr/utils-type';
|
|
4
|
-
import type { CooldownCommand } from '../user-cooldown';
|
|
5
4
|
export interface UserSettings {
|
|
6
5
|
user: Types.ObjectId;
|
|
7
6
|
sort: {
|
|
@@ -10,11 +9,7 @@ export interface UserSettings {
|
|
|
10
9
|
sendDailyReport: boolean;
|
|
11
10
|
sendDailyQuest: boolean;
|
|
12
11
|
reminder: {
|
|
13
|
-
|
|
14
|
-
classic: boolean;
|
|
15
|
-
special: boolean;
|
|
16
|
-
};
|
|
17
|
-
commands: Record<CooldownCommand, boolean>;
|
|
12
|
+
commands: Record<string, boolean>;
|
|
18
13
|
};
|
|
19
14
|
}
|
|
20
15
|
export type UserSettingsReminderPath = Path<UserSettings['reminder']>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/user-settings/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/user-settings/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC;IAErB,IAAI,EAAE;QACJ,SAAS,EAAE,SAAS,CAAC;KACtB,CAAC;IAEF,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;IAExB,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACnC,CAAC;CACH;AAED,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;AAEtE,MAAM,WAAW,oBAAqB,SAAQ,QAAQ,EAAE,YAAY;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../src/services/user-story/definition/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAGtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGlD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,iBAAiB,CACyB,CAAC"}
|