@opfr/services 1.7.0 → 1.8.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 +196 -208
- package/dist/index.umd.js +1 -1
- package/dist/services/recipe/definition/schema.d.ts.map +1 -1
- package/dist/services/recipe/helper.d.ts +2 -4
- package/dist/services/recipe/helper.d.ts.map +1 -1
- package/dist/services/recipe/process/findOne.d.ts +1 -1
- package/dist/services/recipe/process/findOne.d.ts.map +1 -1
- package/dist/services/recipe/types.d.ts +7 -10
- package/dist/services/recipe/types.d.ts.map +1 -1
- package/dist/services/user-inventory/helper.d.ts +5 -8
- package/dist/services/user-inventory/helper.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/services/recipe/data.d.ts +0 -3
- package/dist/services/recipe/data.d.ts.map +0 -1
package/dist/index.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
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"})}));
|
|
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,h=(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)})},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"},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&&h(S.USER_QUEST,n.user._id,n)});const A=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),Ce=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},encyclopedia:{type:[String],default:[]}}),z=s.models?.UserEncyclopedia||s.model("UserEncyclopedia",Ce),_e=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}}),Q=s.models?.UserGames||s.model("UserGames",_e),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&&h(S.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)},q={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:[q],default:[]},work:{type:[q],default:[]}},berry:{work:{type:[q],default:[]},global:{type:[q],default:[]}},drop:{work:{type:[q],default:[]}},xp:{global:{type:[q],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&&(h(S.USER_META,n.user._id,n),n.hp<=0&&Fe("death",n.user._id))});const O=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&&h(S.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&&h(S.USER_STATS_CASINO,n.user._id,n)});const k=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&&h(S.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&&h(S.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&&h(S.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&&h(S.USER_STATS_FREQUENCY,n.user._id,n)});const D=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&&h(S.USER_STATS_INVENTORY,n.user._id,n)});const R=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&&h(S.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 z.deleteOne({user:n}),await Q.deleteOne({user:n}),await Y.deleteOne({user:n}),await O.deleteOne({user:n}),await G.deleteOne({user:n}),await A.deleteMany({user:n}),await B.deleteOne({user:n}),await k.deleteOne({user:n}),await W.deleteOne({user:n}),await V.deleteOne({user:n}),await X.deleteOne({user:n}),await D.deleteOne({user:n}),await R.deleteOne({user:n})});const b=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 b.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 b.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 b.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 b.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 A.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 b.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)=>b.find(n,{},e).lean(),y=n=>n.toObject({flattenMaps:!0,flattenObjectIds:!1}),He=n=>b.create({discordId:n});async function Pe(n,{upsert:e=!0,...t}){const r=await b.findOne({discordId:n},{},t).lean();return!r&&e?y(await He(n)):r}const ze=(n,e)=>b.findOneAndUpdate(n,e,{upsert:!0,returnDocument:"after"}).lean();class Qe 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 ze(e,t)}}const Te=new Qe,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 x=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}),C=s.models?.Entities||s.model("Entities",dt),pt=C.discriminator("item",lt);C.discriminator("equipment",ot);const yt=async(n,e)=>C.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 x.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=x.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 C.create({...n});async function St(n){const e=await C.findOne({entityId:n}).lean();return e||null}const wt=(n,e)=>C.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 $=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 z.create({user:n});async function It(n){const e=await z.findOne({user:n}).lean();return e||y(await $t(n))}const Ut=(n,e)=>z.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 $.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 x.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 x.getPanoplyBonus(t.equippedItems)).find(([a,i])=>a.panoplyId==="revolutionary"&&i!==null)?.[1]??null}async hasRecipe(e,t){return(await this.get(e)).recipes.includes(t)}async getRecipes(e){return(await this.get(e)).recipes}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 T.getMaxHp(e),a=Object.fromEntries(o.recordToArray(t).map(([i,u])=>[`equippedItems.${i}`,u]));await this.update(e,{$set:a}),await T.updateHp(e,r)}async unequip(e,t){const r=await T.getMaxHp(e);await this.update(e,{$set:{[`equippedItems.${t}`]:null}}),await T.updateHp(e,r)}async craftItem(e,t,r,a){for(const{entityId:c,size:d}of t.entities)await this.removeItem(e,c,(d??1)*r);const{entityId:i,size:u}=t.result;await $.isEntityId(i,$.isEquipment)?await this.addEquipments(e,[{entityId:i,seed:a}]):await $.isEntityId(i,$.isItem)&&await this.addItem(e,i,(u??1)*r)}async unlockRecipe(e,t){await this.hasRecipe(e,t)||await this.update(e,{$push:{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 M=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:w})=>d&&d>new Date||c&&o.hasExpire(c)?u:u+w,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:w})=>u+(new Date>=(d??new Date)&&(!c||!o.hasExpire(c))?w:0),1)}async getMaxHp(e){const t=await M.get(e),{vitality:r}=await this.getTotalCharacteristics(e),a=await M.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 M.get(e),a=await M.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 $.fromDBToEquipableEquipment(t),u=o.filterNullAndUndefined(Object.values(r)),d=(await x.getAllPopulated()).find(g=>g.panoplyId===i.panoply);if(!d)return;const w=d.equipments.filter(g=>(u.find(U=>g.entityId===U.entityId)||!a&&i.entityId===g.entityId)&&(a?i.entityId!==g.entityId:!0)).length,E=w===d.equipments.length?d.fullBonus:w>=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),E&&"target"in E&&await this.updateBuff(e,E)}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=>O.find(n).lean(),kt=async n=>await O.create({user:n});async function Rt(n){const e=await O.findOne({user:n}).lean();return e||y(await kt(n))}const xt=(n,e)=>O.findOneAndUpdate({user:n},e,{returnDocument:"after",upsert:!0}).lean();class Ct 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 T=new Ct;class _t 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 _t{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 T.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 zt(n){const e=await H.findOne({user:n}).lean();return e||y(await Pt(n))}const Qt=(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 zt(e)}updateInDb(e,t){return Qt(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 A.find(n).lean()}const cn=async n=>await A.create({...n});async function dn(n){const e=await A.findOne(n).lean();return e||y(await cn(n))}function ln(n,e,t){return A.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 T.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 T.get(e),d=await de.getMany({user:e,status:p.QuestStatus.COMPLETED}),w=await ce.get(e),E=await le.get(e),{berry:g,xp:U}=c,{voice:De,amount:Ua}=U,{unlockedBadges:Ta,unlockedBackgrounds:va,unlockedTitles:Ea}=w;return{berry:g-i,xp:Ua-a,message:E.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 Q.create({user:n});async function vn(n){const e=await Q.findOne({user:n}).lean();return e||y(await Tn(n))}const En=(n,e)=>Q.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}}),_=s.models?.UserRank||s.model("UserRank",Mn);class An extends f{async computeAllXpRanks(){const t=(await O.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 _.bulkWrite(t),this.clearAll()}async computeAllBerryRanks(){const t=(await O.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 _.bulkWrite(t),this.clearAll()}async computeAllFactionRanks(){const t=(await b.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 _.bulkWrite(t),this.clearAll()}async computeAllRanks(){await Promise.all([this.computeAllXpRanks(),this.computeAllBerryRanks(),this.computeAllFactionRanks()])}}const qn=async n=>await _.create({user:n});async function kn(n){const e=await _.findOne({user:n}).lean();return e||y(await qn(n))}const Rn=(n,e)=>_.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 Cn=new xn,_n=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:[_n],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(),zn=n=>J.findOne({storyId:n}).lean(),Qn=(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 zn(e)}fetchManyFromDb(e,t){return Pn(e,t)}updateInDb(e,t){const r=typeof e=="string"?e:e.storyId;return Qn(r,t)}}const v=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 E=e.find(U=>U.chapterId===t&&U.sceneId===r&&U.stepId===c);if(!E){i.push({step:d});break}const g=d.payload.find(U=>U.actionId===E.value);if(!g||(i.push({step:d,selectedAction:g}),c===a))break;c=g.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 v.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 v.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 w=i.status==="in_progress"&&i.currentChapterId===r&&i.currentSceneId===a;return Ln(d,i.choices,r,a,w?i.currentStepId:void 0)}async start(e,t){const r=await v.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 v.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 v.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 v.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 v.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 k.updateOne({user:e,"bet666.last":{$gte:t,$lt:r}},{$inc:{"bet666.count":1},$set:{"bet666.last":new Date}}),await k.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 k.create({user:n});async function ir(n){const e=await k.findOne({user:n}).lean();return e||y(await sr(n))}const ur=(n,e)=>k.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 D.updateOne({user:e,"edito.lastTimeRead":{$gte:t}},{$inc:{"edito.readToday":1},$set:{"edito.lastTimeRead":new Date}}),await D.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 D.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 D.create({user:n});async function Tr(n){const e=await D.findOne({user:n}).lean();return e||y(await Ur(n))}const vr=(n,e)=>D.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 $.get(r);!a||!$.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 R.updateOne({user:e,"bottle.lastUsed":{$gte:r}},{$inc:{"bottle.usedToday":t},$set:{"bottle.lastUsed":new Date}}),await R.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 R.create({user:n});async function Ar(n){const e=await R.findOne({user:n}).lean();return e||y(await Mr(n))}const qr=(n,e)=>R.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 M.get(e);let a=1/0;for(const i of t)a=Math.min(a,Math.floor((r.itemList[i.entityId]??0)/(i.size??1)));return a}async hasEnoughItemsForRecipe(e,t,r){const a=await M.get(e);for(const i of t.entities)if((a.itemList[i.entityId]??0)<(i.size??1)*r)return!1;return!0}async isValidRecipe(e){return!!(await this.getAll()).find(r=>r.recipeId===e)}async getRecipeResult(e,t){return t}}const Cr=new s.Schema({entityId:{type:String,required:!0},size:{type:Number,default:1}},{_id:!1}),_r=new s.Schema({entityId:{type:String,required:!0},size:{type:Number}},{_id:!1}),Br=new s.Schema({recipeId:{type:String,unique:!0,required:!0},rankId:String,type:{type:String,required:!0},entities:{type:[Cr],required:!0},result:{type:_r,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({recipeId: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.recipeId}}const Pr=new Hr,zr=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",zr),Qr=(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 Qr(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=S,l.banService=Lr,l.connectToServices=$a,l.emitQuestMiddlewareEvent=h,l.entityService=$,l.invitationService=sa,l.ornamentService=I,l.panoplyService=x,l.recipeService=Pr,l.registerQuestMiddlewareEvents=ke,l.reminderService=ve,l.settingsService=pa,l.storyService=v,l.userCooldownService=Gt,l.userDailyReportService=In,l.userEncyclopediaService=L,l.userGamesService=Dn,l.userInventoryService=M,l.userMetaService=T,l.userOrnamentService=ce,l.userQuestService=de,l.userRankService=Cn,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"})}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/services/recipe/definition/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAkB/C,QAAA,MAAM,YAAY;;;;;;;;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/services/recipe/definition/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAkB/C,QAAA,MAAM,YAAY;;;;;;;;EAWjB,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import type { Types } from 'mongoose';
|
|
2
2
|
import { AbstractCachedServiceWithFetchMany } from '../AbstractCachedService';
|
|
3
|
-
import type {
|
|
3
|
+
import type { Recipe, RecipeDocument, RecipeEntity, RecipeId } from './types';
|
|
4
4
|
export declare abstract class RecipeHelper extends AbstractCachedServiceWithFetchMany<Recipe, RecipeDocument, string> {
|
|
5
5
|
maxCraftQuantity(userId: Types.ObjectId, recipeEntities: RecipeEntity[]): Promise<number>;
|
|
6
6
|
hasEnoughItemsForRecipe(userId: Types.ObjectId, recipe: Recipe, quantity: number): Promise<boolean>;
|
|
7
|
-
|
|
8
|
-
encodeCraftId(craft: Craft): CraftId;
|
|
9
|
-
isValidRecipe(craftId: CraftId): Promise<boolean>;
|
|
7
|
+
isValidRecipe(recipeId: RecipeId): Promise<boolean>;
|
|
10
8
|
getRecipeResult(userId: Types.ObjectId, entityId: string): Promise<string>;
|
|
11
9
|
}
|
|
12
10
|
//# sourceMappingURL=helper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../../src/services/recipe/helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,OAAO,EAAE,kCAAkC,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../../src/services/recipe/helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,OAAO,EAAE,kCAAkC,EAAE,MAAM,0BAA0B,CAAC;AAE9E,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE9E,8BAAsB,YAAa,SAAQ,kCAAkC,CAC3E,MAAM,EACN,cAAc,EACd,MAAM,CACP;IACc,gBAAgB,CAC3B,MAAM,EAAE,KAAK,CAAC,QAAQ,EACtB,cAAc,EAAE,YAAY,EAAE,GAC7B,OAAO,CAAC,MAAM,CAAC;IAeL,uBAAuB,CAClC,MAAM,EAAE,KAAK,CAAC,QAAQ,EACtB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM;IAeL,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAKnD,eAAe,CAC1B,MAAM,EAAE,KAAK,CAAC,QAAQ,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC;CAGnB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { Lean } from '../../types';
|
|
2
2
|
import type { RecipeDocument } from '../types';
|
|
3
|
-
export declare function findRecipe(
|
|
3
|
+
export declare function findRecipe(recipeId: string): Promise<Lean<RecipeDocument> | null>;
|
|
4
4
|
//# sourceMappingURL=findOne.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findOne.d.ts","sourceRoot":"","sources":["../../../../src/services/recipe/process/findOne.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,wBAAsB,UAAU,CAC9B,
|
|
1
|
+
{"version":3,"file":"findOne.d.ts","sourceRoot":"","sources":["../../../../src/services/recipe/process/findOne.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,CAOtC"}
|
|
@@ -1,21 +1,18 @@
|
|
|
1
1
|
import type { Document } from 'mongoose';
|
|
2
|
-
|
|
3
|
-
export type
|
|
4
|
-
entityId: string | null;
|
|
5
|
-
index: number;
|
|
6
|
-
};
|
|
7
|
-
export type Craft = CraftObject[];
|
|
2
|
+
import type { ItemSubType, RankId } from '@opfr/definitions';
|
|
3
|
+
export type RecipeId = string;
|
|
8
4
|
export type RecipeEntity = {
|
|
9
5
|
entityId: string;
|
|
10
|
-
size
|
|
6
|
+
size?: number;
|
|
11
7
|
};
|
|
12
8
|
export type RecipeResultEntity = {
|
|
13
9
|
entityId: string;
|
|
14
|
-
size
|
|
10
|
+
size?: number;
|
|
15
11
|
};
|
|
16
12
|
export type Recipe = {
|
|
17
|
-
|
|
18
|
-
|
|
13
|
+
recipeId: RecipeId;
|
|
14
|
+
rankId: RankId;
|
|
15
|
+
type: ItemSubType;
|
|
19
16
|
entities: RecipeEntity[];
|
|
20
17
|
result: RecipeResultEntity;
|
|
21
18
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/recipe/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/recipe/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE7D,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IAEf,IAAI,EAAE,WAAW,CAAC;IAElB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,MAAM,EAAE,kBAAkB,CAAC;CAC5B,CAAC;AAEF,MAAM,WAAW,cAAe,SAAQ,QAAQ,EAAE,MAAM;CAAG"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Types } from 'mongoose';
|
|
2
|
-
import type { CharacteristicsRecord, DBEquipment,
|
|
2
|
+
import type { CharacteristicsRecord, DBEquipment, EquipmentSlot, EquippedItems } from '@opfr/definitions';
|
|
3
3
|
import { AbstractCachedService } from '../AbstractCachedService';
|
|
4
|
-
import type { Recipe } from '../recipe';
|
|
4
|
+
import type { Recipe, RecipeId } from '../recipe';
|
|
5
5
|
import type { Lean } from '../types';
|
|
6
6
|
import type { UserInventory, UserInventoryDocument } from './types';
|
|
7
7
|
export declare abstract class UserInventoryHelper extends AbstractCachedService<UserInventory, UserInventoryDocument, Types.ObjectId, true> {
|
|
@@ -11,6 +11,8 @@ export declare abstract class UserInventoryHelper extends AbstractCachedService<
|
|
|
11
11
|
getItemList(userId: Types.ObjectId): Promise<Record<string, number>>;
|
|
12
12
|
calcMinStreakForWorkLoot(userId: Types.ObjectId): Promise<number>;
|
|
13
13
|
hasRevolutionaryBuff(userId: Types.ObjectId): Promise<"full" | "half" | null>;
|
|
14
|
+
hasRecipe(userId: Types.ObjectId, recipeId: string): Promise<boolean>;
|
|
15
|
+
getRecipes(userId: Types.ObjectId): Promise<string[]>;
|
|
14
16
|
addItem(userId: Types.ObjectId, itemId: string, quantity: number): Promise<void>;
|
|
15
17
|
addItems(userId: Types.ObjectId, items: Partial<Record<string, number>>): Promise<void>;
|
|
16
18
|
removeItem(userId: Types.ObjectId, itemId: string, quantity: number): Promise<void>;
|
|
@@ -22,11 +24,6 @@ export declare abstract class UserInventoryHelper extends AbstractCachedService<
|
|
|
22
24
|
equip(userId: Types.ObjectId, equipments: EquippedItems): Promise<void>;
|
|
23
25
|
unequip(userId: Types.ObjectId, slot: EquipmentSlot): Promise<void>;
|
|
24
26
|
craftItem(userId: Types.ObjectId, recipe: Recipe, quantity: number, seed: number): Promise<void>;
|
|
25
|
-
|
|
26
|
-
entityId: string;
|
|
27
|
-
quantity: number;
|
|
28
|
-
}[], size: number, seed: number): Promise<void>;
|
|
29
|
-
enchantItem(userId: Types.ObjectId, entityId: string, enchantResult: string, enchantedStoneId: string, size: number): Promise<void>;
|
|
30
|
-
unlockRecipe(userId: Types.ObjectId, recipeId: string): Promise<void>;
|
|
27
|
+
unlockRecipe(userId: Types.ObjectId, recipeId: RecipeId): Promise<void>;
|
|
31
28
|
}
|
|
32
29
|
//# sourceMappingURL=helper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../../src/services/user-inventory/helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,OAAO,KAAK,EACV,qBAAqB,EACrB,WAAW,EACX,
|
|
1
|
+
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../../src/services/user-inventory/helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,OAAO,KAAK,EACV,qBAAqB,EACrB,WAAW,EACX,aAAa,EACb,aAAa,EACd,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAGrC,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAEpE,8BAAsB,mBAAoB,SAAQ,qBAAqB,CACrE,aAAa,EACb,qBAAqB,EACrB,KAAK,CAAC,QAAQ,EACd,IAAI,CACL;IACc,gCAAgC,CAC3C,aAAa,EAAE,IAAI,CAAC,qBAAqB,CAAC;IA6B/B,wBAAwB,CACnC,MAAM,EAAE,KAAK,CAAC,QAAQ,EACtB,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAWtC,eAAe,CAC1B,MAAM,EAAE,KAAK,CAAC,QAAQ,EACtB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM;IAML,WAAW,CACtB,MAAM,EAAE,KAAK,CAAC,QAAQ,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAKrB,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ;IAgB/C,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ;IAY3C,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM;IAMlD,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ;IASjC,OAAO,CAClB,MAAM,EAAE,KAAK,CAAC,QAAQ,EACtB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM;IASL,QAAQ,CACnB,MAAM,EAAE,KAAK,CAAC,QAAQ,EACtB,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAiB3B,UAAU,CACrB,MAAM,EAAE,KAAK,CAAC,QAAQ,EACtB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM;IAgBL,eAAe,CAC1B,MAAM,EAAE,KAAK,CAAC,QAAQ,EACtB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM;IAYV,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM;IAIpD,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE;IAUzD,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ;IAUrC,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM;IAQ7D,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,aAAa;IAevD,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,aAAa;IAWnD,SAAS,CACpB,MAAM,EAAE,KAAK,CAAC,QAAQ,EACtB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM;IAaD,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ;CAOrE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opfr/services",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "OPFR services",
|
|
6
6
|
"author": "Matthieu VEIGA",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"@faker-js/faker": "10.1.0",
|
|
23
|
-
"@opfr/definitions": "^1.
|
|
23
|
+
"@opfr/definitions": "^1.9.0",
|
|
24
24
|
"@opfr/utils-lang": "^1.1.1",
|
|
25
25
|
"@opfr/utils-type": "^1.1.0",
|
|
26
26
|
"mongodb-memory-server": "11.0.1",
|
|
@@ -46,5 +46,5 @@
|
|
|
46
46
|
"node_modules",
|
|
47
47
|
"dist"
|
|
48
48
|
],
|
|
49
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "e4c39f2901e6edcf98fac781214afbd547972e5a"
|
|
50
50
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../src/services/recipe/data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,eAAO,MAAM,OAAO,EAAE,MAAM,EAq4B3B,CAAC"}
|