@opfr/services 1.5.1 → 1.6.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 +631 -1255
- package/dist/index.umd.js +1 -1
- package/dist/services/entities/definition/model.d.ts +12 -2
- package/dist/services/entities/definition/model.d.ts.map +1 -1
- package/dist/services/entities/definition/schema.d.ts +20 -2
- package/dist/services/entities/definition/schema.d.ts.map +1 -1
- package/dist/services/entities/helper.d.ts +5 -20
- package/dist/services/entities/helper.d.ts.map +1 -1
- package/dist/services/entities/process/findMany.d.ts +2 -1
- package/dist/services/entities/process/findMany.d.ts.map +1 -1
- package/dist/services/entities/process/findOne.d.ts +3 -1
- package/dist/services/entities/process/findOne.d.ts.map +1 -1
- package/dist/services/entities/types.d.ts +5 -1
- package/dist/services/entities/types.d.ts.map +1 -1
- package/dist/services/index.d.ts +0 -2
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/user/definition/schema.d.ts.map +1 -1
- package/dist/services/user-inventory/definition/schema.d.ts.map +1 -1
- package/dist/services/user-inventory/helper.d.ts +1 -3
- package/dist/services/user-inventory/helper.d.ts.map +1 -1
- package/dist/services/user-meta/definition/schema.d.ts.map +1 -1
- package/dist/services/user-meta/helper.d.ts +1 -1
- package/dist/services/user-meta/helper.d.ts.map +1 -1
- package/dist/services/user-meta/types.d.ts +2 -4
- package/dist/services/user-meta/types.d.ts.map +1 -1
- package/dist/services/user-ornament/definition/schema.d.ts.map +1 -1
- package/dist/services/user-quest/definition/schema.d.ts.map +1 -1
- package/dist/services/user-stats/casino/definition/schema.d.ts.map +1 -1
- package/dist/services/user-stats/economy/definition/schema.d.ts.map +1 -1
- package/dist/services/user-stats/engagement/definition/schema.d.ts.map +1 -1
- package/dist/services/user-stats/flags/definition/schema.d.ts.map +1 -1
- package/dist/services/user-stats/frequency/definition/schema.d.ts.map +1 -1
- package/dist/services/user-stats/inventory/definition/schema.d.ts.map +1 -1
- package/dist/services/user-stats/inventory/helper.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/services/shop/definition/model.d.ts +0 -4
- package/dist/services/shop/definition/model.d.ts.map +0 -1
- package/dist/services/shop/definition/schema.d.ts +0 -13
- package/dist/services/shop/definition/schema.d.ts.map +0 -1
- package/dist/services/shop/helper.d.ts +0 -14
- package/dist/services/shop/helper.d.ts.map +0 -1
- package/dist/services/shop/index.d.ts +0 -4
- package/dist/services/shop/index.d.ts.map +0 -1
- package/dist/services/shop/items/background.d.ts +0 -18
- package/dist/services/shop/items/background.d.ts.map +0 -1
- package/dist/services/shop/items/boostXp.d.ts +0 -18
- package/dist/services/shop/items/boostXp.d.ts.map +0 -1
- package/dist/services/shop/items/bottle.d.ts +0 -18
- package/dist/services/shop/items/bottle.d.ts.map +0 -1
- package/dist/services/shop/items/chest.d.ts +0 -18
- package/dist/services/shop/items/chest.d.ts.map +0 -1
- package/dist/services/shop/items/default.d.ts +0 -21
- package/dist/services/shop/items/default.d.ts.map +0 -1
- package/dist/services/shop/items/equipments.d.ts +0 -18
- package/dist/services/shop/items/equipments.d.ts.map +0 -1
- package/dist/services/shop/items/index.d.ts +0 -10
- package/dist/services/shop/items/index.d.ts.map +0 -1
- package/dist/services/shop/items/object.d.ts +0 -18
- package/dist/services/shop/items/object.d.ts.map +0 -1
- package/dist/services/shop/items/repair.d.ts +0 -18
- package/dist/services/shop/items/repair.d.ts.map +0 -1
- package/dist/services/shop/items/store.d.ts +0 -18
- package/dist/services/shop/items/store.d.ts.map +0 -1
- package/dist/services/shop/items/title.d.ts +0 -18
- package/dist/services/shop/items/title.d.ts.map +0 -1
- package/dist/services/shop/process/create.d.ts +0 -4
- package/dist/services/shop/process/create.d.ts.map +0 -1
- package/dist/services/shop/process/findOne.d.ts +0 -5
- package/dist/services/shop/process/findOne.d.ts.map +0 -1
- package/dist/services/shop/process/updateOne.d.ts +0 -5
- package/dist/services/shop/process/updateOne.d.ts.map +0 -1
- package/dist/services/shop/service.d.ts +0 -19
- package/dist/services/shop/service.d.ts.map +0 -1
- package/dist/services/shop/types.d.ts +0 -5
- package/dist/services/shop/types.d.ts.map +0 -1
- package/dist/services/user-shop/definition/model.d.ts +0 -4
- package/dist/services/user-shop/definition/model.d.ts.map +0 -1
- package/dist/services/user-shop/definition/schema.d.ts +0 -13
- package/dist/services/user-shop/definition/schema.d.ts.map +0 -1
- package/dist/services/user-shop/helper.d.ts +0 -9
- package/dist/services/user-shop/helper.d.ts.map +0 -1
- package/dist/services/user-shop/index.d.ts +0 -3
- package/dist/services/user-shop/index.d.ts.map +0 -1
- package/dist/services/user-shop/process/create.d.ts +0 -4
- package/dist/services/user-shop/process/create.d.ts.map +0 -1
- package/dist/services/user-shop/process/findOne.d.ts +0 -5
- package/dist/services/user-shop/process/findOne.d.ts.map +0 -1
- package/dist/services/user-shop/process/updateOne.d.ts +0 -5
- package/dist/services/user-shop/process/updateOne.d.ts.map +0 -1
- package/dist/services/user-shop/service.d.ts +0 -14
- package/dist/services/user-shop/service.d.ts.map +0 -1
- package/dist/services/user-shop/types.d.ts +0 -9
- package/dist/services/user-shop/types.d.ts.map +0 -1
package/dist/index.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(d,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):(d=typeof globalThis<"u"?globalThis:d||self,s(d.services={},d.mongoose,d["@opfr/definitions"],d["node-cache"],d.events,d["@opfr/utils-lang"]))})(this,(function(d,s,y,_e,Ce,o){"use strict";function Ne(a){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(a){for(const t in a)if(t!=="default"){const n=Object.getOwnPropertyDescriptor(a,t);Object.defineProperty(e,t,n.get?n:{enumerable:!0,get:()=>a[t]})}}return e.default=a,Object.freeze(e)}const le=Ne(Ce),F="___ALL_ENTITIES___";class m{cache;constructor(e){this.cache=new _e({stdTTL:e,checkperiod:e*.2,useClones:!1})}async get(e,t){const n=this.normalizeKey(e),r=this.cache.get(n);if(r)return r;const i=await this.fetchFromDb(e,t??{});return i&&this.cache.set(n,i),i}async update(e,t,n){const r=await this.updateInDb(e,t,n);if(r){const i=this.getKey(r);this.cache.del(F),this.cache.set(this.normalizeKey(i),r)}return r}invalidate(e){this.cache.del(F),e&&this.cache.del(this.normalizeKey(e))}clearAll(){this.cache.flushAll()}}class $ extends m{async getAll(){const e=this.cache.get(F);if(e)return e;const t=await this.fetchManyFromDb({},{});return this.cache.set(F,t),t.forEach(n=>{this.cache.set(this.normalizeKey(this.getKey(n)),n)}),t}async getMany(e,t={}){const n=await this.fetchManyFromDb(e,t);return n.forEach(r=>{this.cache.set(this.normalizeKey(this.getKey(r)),r)}),n}}const oe=new le.EventEmitter,g=(a,e,t)=>{oe.emit(a,e,t)},xe=a=>{for(const[e,t]of Object.entries(a))oe.on(e,(n,r)=>{t(n,r)})},b={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"},pe=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:y.QuestStatus.IN_PROGRESS,index:1},lastCompletionDate:Date,streak:Number},{minimize:!1});pe.post("findOneAndUpdate",function(a){g(b.USER_QUEST,a.user._id,a)});const B=s.models?.UserQuest||s.model("UserQuest",pe),Fe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},raid:{classic:{type:Date,default:new Date(0)},special:{type:Date,default:new Date(0)}},lockUserCommand:{type:Date,default:new Date(0)},commands:{work:{type:Date,default:new Date(0)},dice:{type:Date,default:new Date(0)},doubleOrQuit:{type:Date,default:new Date(0)},priceIsRight:{type:Date,default:new Date(0)},blackJack:{type:Date,default:new Date(0)},rps:{type:Date,default:new Date(0)}}}),j=s.models?.UserCooldown||s.model("UserCooldown",Fe),je=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}}),z=s.models?.UserDailyReport||s.model("UserDailyReport",je),ze=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},encyclopedia:{type:[String],default:[]}}),H=s.models?.UserEncyclopedia||s.model("UserEncyclopedia",ze),He=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User",index:1},guess:{type:{tries:Number,amount:Number,numberToGuess:Number,lastGuess:Number},default:null}}),K=s.models?.UserGames||s.model("UserGames",He),ye=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});ye.post("findOneAndUpdate",function(a){g(b.USER_INVENTORY,a.user._id,a)});const P=s.models?.UserInventory||s.model("UserInventory",ye),Ke=new le.EventEmitter,Pe=(a,e)=>{Ke.emit(a,e)},A={multiplier:{type:Number,default:0},origin:String,expireAt:{type:Date,default:null},startAt:{type:Date,default:null}},fe=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:[A],default:[]},work:{type:[A],default:[]}},berry:{work:{type:[A],default:[]},global:{type:[A],default:[]}},drop:{work:{type:[A],default:[]}},xp:{global:{type:[A],default:[]}}},hp:{type:Number,default:100},workUnluckyStreak:{type:Number,default:0},characteristics:{vitality:{type:Number,default:0},strength:{type:Number,default:0},agility:{type:Number,default:0},chance:{type:Number,default:0},intelligence:{type:Number,default:0},wisdom:{type:Number,default:0}},resetCharacteristics:{free:{type:Boolean,default:!0},nextAvailable:{type:Date,default:null}},scrolls:{vitality:{type:Number,default:0},strength:{type:Number,default:0},agility:{type:Number,default:0},chance:{type:Number,default:0},intelligence:{type:Number,default:0},wisdom:{type:Number,default:0}}});fe.post("findOneAndUpdate",async function(a){g(b.USER_META,a.user._id,a),a.hp<=0&&Pe("death",a.user._id)});const O=s.models?.UserMeta||s.model("UserMeta",fe),me=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"}});me.post("findOneAndUpdate",function(a){g(b.USER_ORNAMENT,a.user._id,a)});const Q=s.models?.UserOrnament||s.model("UserOrnament",me),Qe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},sort:{inventory:{type:String,default:"alpha"}},sendDailyReport:{type:Boolean,default:!1,index:!0},sendDailyQuest:{type:Boolean,default:!1},reminder:{raid:{classic:{type:Boolean,default:!1},special:{type:Boolean,default:!1}},commands:{work:{type:Boolean,default:!1},dice:{type:Boolean,default:!1},qod:{type:Boolean,default:!1},blackjack:{type:Boolean,default:!1},guess:{type:Boolean,default:!1},rps:{type:Boolean,default:!1}}}}),R=s.models?.UserSettings||s.model("UserSettings",Qe),We=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},lastShopId:s.Schema.Types.ObjectId,limit:{type:s.Schema.Types.Mixed,default:{}}},{minimize:!1}),W=s.models?.UserShop||s.model("UserShop",We),he=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}}});he.post("findOneAndUpdate",function(a){g(b.USER_STATS_CASINO,a.user._id,a)});const M=s.models?.UserStatsCasino||s.model("UserStatsCasino",he),Se=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}});Se.post("findOneAndUpdate",function(a){g(b.USER_STATS_ECONOMY,a.user._id,a)});const G=s.models?.UserStatsEconomy||s.model("UserStatsEconomy",Se),we=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:[]}});we.post("findOneAndUpdate",function(a){g(b.USER_STATS_ENGAGEMENT,a.user._id,a)});const Y=s.models?.UserStatsEngagement||s.model("UserStatsEngagement",we),ge=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}}});ge.post("findOneAndUpdate",function(a){g(b.USER_STATS_FLAGS,a.user._id,a)});const V=s.models?.UserStatsFlags||s.model("UserStatsFlags",ge),be=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}}});be.post("findOneAndUpdate",function(a){g(b.USER_STATS_FREQUENCY,a.user._id,a)});const T=s.models?.UserStatsFrequency||s.model("UserStatsFrequency",be),$e=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}}});$e.post("findOneAndUpdate",function(a){g(b.USER_STATS_INVENTORY,a.user._id,a)});const k=s.models?.UserStatsInventory||s.model("UserStatsInventory",$e),ae=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:y.DEFAULT_FACTION,index:1},canChangeFaction:{type:Boolean,default:!1},canChooseFaction:{type:Boolean,default:!1}});ae.post("findOneAndUpdate",function(a){g(b.USER,a._id,a)}),ae.post("deleteOne",async function(){const a=this.getQuery()._id;await j.deleteOne({user:a}),await z.deleteOne({user:a}),await H.deleteOne({user:a}),await K.deleteOne({user:a}),await P.deleteOne({user:a}),await O.deleteOne({user:a}),await Q.deleteOne({user:a}),await B.deleteMany({user:a}),await R.deleteOne({user:a}),await W.deleteOne({user:a}),await M.deleteOne({user:a}),await G.deleteOne({user:a}),await Y.deleteOne({user:a}),await V.deleteOne({user:a}),await T.deleteOne({user:a}),await k.deleteOne({user:a})});const I=s.models?.User||s.model("User",ae);class Ge extends ${getByObjectId(e){return this.update({_id:e},{})}getNextBirthdays(){const e=new Date,t=e.getFullYear();return I.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 I.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 I.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 I.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 B.aggregate([{$match:{status:y.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 I.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 Ye=(a,e)=>I.find(a,{},e).lean(),f=a=>a.toObject({flattenMaps:!0,flattenObjectIds:!1}),Ve=a=>I.create({discordId:a});async function Xe(a,{upsert:e=!0,...t}){const n=await I.findOne({discordId:a},{},t).lean();return!n&&e?f(await Ve(a)):n}const Le=(a,e)=>I.findOneAndUpdate(a,e,{upsert:!0,returnDocument:"after"}).lean();class Je extends Ge{constructor(){super(3600)}normalizeKey(e){return e}getKey({discordId:e}){return e}fetchFromDb(e,t){return Xe(e,t)}fetchManyFromDb(e,t){return Ye(e,t)}updateInDb(e,t){return Le(e,t)}}const Ie=new Je,Ze=["work",...y.GAME_TYPES],et=new s.Schema({user:{type:s.Schema.Types.ObjectId,ref:"User",required:!0,index:!0},date:{type:Date,index:-1,required:!0},type:{type:String,required:!0}},{minimize:!1}),_=s.models?.Reminder||s.model("Reminder",et),tt=async a=>{await _.deleteMany(a)},at=async(a,e)=>{await _.deleteOne({user:a,type:e})};class nt extends ${getAllPassedReminder(){return this.getMany({date:{$lte:new Date}})}async addReminder(e,t,n){await this.update({user:e,type:t},{$set:{date:n}},{upsert:!0})}async updateReminderDate(e,t,n){await this.update({user:e,type:t},[{$set:{date:{$add:["$date",n]}}}])}async removeReminder(e,t){await at(e,t),this.invalidate({user:e,type:t})}async deleteSelectedReminders(e){const t=e.map(n=>n._id);await tt({_id:{$in:t}}),e.forEach(n=>{this.invalidate({user:n.user,type:n.type})})}}function rt(a,e){return _.find(a,{},e).lean()}async function st(a){const e=await _.findOne(a).lean();return e||null}async function it(a,e,t){return _.findOneAndUpdate(a,e,{...t,returnDocument:"after"}).lean()}class ut extends nt{constructor(){super(300)}getKey(e){return{user:e.user,type:e.type}}normalizeKey({user:e,type:t}){return`${e.toString()}/${t}`}fetchFromDb(e){return st(e)}fetchManyFromDb(e,t){return rt(e,t)}updateInDb(e,t,n={upsert:!1}){return it(e,t,n)}}const Ee=new ut,ct=new s.Schema({panoplyId:{unique:!0,index:1,required:!0,type:String},name:{required:!0,type:String},equipments:{required:!0,type:[{type:s.Schema.Types.ObjectId,ref:"Entities"}]},fullBonusStr:{type:String},halfBonusStr:{type:String},fullBonus:s.Schema.Types.Mixed,halfBonus:s.Schema.Types.Mixed},{minimize:!1}),C=s.models?.Panoplies||s.model("Panoplies",ct),dt=(a,e)=>C.find(a,{},e).lean(),lt=async(a,e)=>C.find(a,{},e).populate("equipments");async function ot(a){const e=await C.findOne({panoplyId:a}).lean();return e||null}const pt=async a=>C.findOne(a).populate("equipments");class yt extends ${getAllPopulated(){return lt({},{})}getPopulated(e){return pt({panoplyId:e})}hasPanoply(e,t){const n=o.filterNullAndUndefined(Object.values(e)),r=t.equipments.filter(i=>n.find(u=>u.entityId===i.entityId)).length;if(r===t.equipments.length)return t.fullBonus;if(r>=t.equipments.length/2)return t.halfBonus}async getPanoplyBonus(e){const t=[],n=await this.getAllPopulated();for(const r of n){const i=o.filterNullAndUndefined(Object.values(e)),u=r.equipments.filter(l=>i.find(({entityId:c})=>c===l.entityId));u.length===r.equipments.length?t.push([r,"full"]):u.length>=r.equipments.length/2?t.push([r,"half"]):u.length>=1&&t.push([r,null])}return t}}const ft=async(a,e)=>C.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class mt extends yt{constructor(){super(3600)}normalizeKey(e){return e}getKey({panoplyId:e}){return e}updateInDb(e,t){return ft(e,t)}fetchFromDb(e){return ot(e)}fetchManyFromDb(e,t){return dt(e,t)}}const E=new mt;class ht extends ${isEntity(e){return!!e&&"entityId"in e}isItem(e){return e.category!=="equipment"}isEquipment(e){return e.category==="equipment"}async isEntityId(e,t=()=>!0){return(await this.getAll()).filter(t).map(({entityId:r})=>r).includes(e)}async getSomeStoreItems(e){const t=(await this.getAll()).filter(this.isStoreItem);return o.sortBy(o.pickNthByOdds(e,t,n=>n.entityId,n=>n.shop.odd??0),n=>n.shop.price)}async getSomeRepairItems(e){const t=(await this.getAll()).filter(this.isRepairItem);return o.shuffle(t).slice(0,e)}async getSomeObjectItems(e){const t=(await this.getAll()).filter(this.isObjectItem);return o.shuffle(t.filter(n=>!!n.shop?.price)).slice(0,e)}async idArrayToEntities(e){return(await this.getAll()).filter(t=>e.includes(t.entityId))}recordToEntities(e){return this.idArrayToEntities(Object.keys(e))}async recordToEntityTuple(e){const t=await this.getAll();return o.recordToArray(e).reduce((n,[r,i])=>{const u=t.find(({entityId:l})=>l===r);return u&&n.push([u,i]),n},[])}async getAllEntitiesLimit(){const e=await this.getAll();return o.arrayToRecord(e.map(t=>[t.entityId,t.shop?.limit??0]))}async getAllEntitiesBy(e){return(await this.getAll()).filter(e)}async fromDBToEquipableEquipment(e){const n=(await this.getAll()).filter(this.isEquipment).find(({entityId:r})=>r===e.entityId);if(!n)throw new Error(`cannot find any equipment: ${e.entityId}`);return this.seedEquipment(n,e.seed)}async getUserEquipmentsCharacteristics(e){let t={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};const n=await E.getAllPopulated();for(const r of y.EQUIPMENT_SLOT){const i=e[r];i&&(t=o.mergeObjects(t,(await this.fromDBToEquipableEquipment(i)).characteristics,(u,l)=>u+l))}for(const r of n){const i=E.hasPanoply(e,r);i&&!("target"in i)&&(t=o.mergeObjects(t,i,(u,l)=>u+l))}return t}filterCraftEntities(e){return e.filter(t=>t.usage?.craft)}filterDismantleEntities(e){return e.filter(t=>t.usage?.dismantle)}filterUsableEntities(e){return e.filter(t=>t.usage?.mode)}filterEnchantableEntities(e){return e.filter(t=>t.usage?.enchant)}hasCraftEntities(e){return!!e.find(t=>t.usage?.craft)}hasDismantleEntities(e){return!!e.find(t=>t.usage?.dismantle)}hasEnchantableEntities(e){return!!e.find(t=>t.usage?.enchant)}hasUsableEntities(e){return!!e.find(t=>t.usage?.mode)}isChestItem(e){return e.type==="chest"}isBottleItem(e){return e.type==="bottle"}isBoostItem(e){return e.type==="boost"}isRepairItem(e){return e.type==="repair"}isStoreItem(e){return e.type==="store"}isObjectItem(e){return e.type==="object"}isScrollItem(e){return e.type==="scroll"}isCookedMeal(e){return e.type==="cookedMeal"}isAlcoholItem(e){return e.type==="alcohol"}isSameEquipment(e,t){return e.entityId===t.entityId&&e.seed===t.seed}seedEquipment(e,t){const n=o.seededRandom(t),r=o.sortBy(o.recordToArray(e.characteristics),([i])=>i);return{...e,seed:t,characteristics:Object.fromEntries(r.map(([i,u])=>[i,Array.isArray(u)?o.randomBetween(u[0],u[1]+1,n):u]))}}isEquipped(e,t){return!!Object.values(e).find(n=>n&&this.isSameEquipment(n,t))}calcILvl(e){return Object.values(e.characteristics).reduce((n,r)=>n+r,0)+e.level}}const St=new s.Schema({type:{type:String,enum:y.EFFECT_KEYS,required:!0},params:{type:s.Schema.Types.Mixed}},{_id:!1}),wt=new s.Schema({entityId:{unique:!0,required:!0,type:String},type:{required:!0,type:String},name:{required:!0,_id:!1,type:{key:{required:!0,type:String},context:String}},description:{_id:!1,type:{key:{required:!0,type:String},context:String}},image:{required:!0,type:String},emojis:{required:!0,type:String},category:{required:!0,type:String},effects:{type:[St],default:[]},rankId:String,usage:{_id:!1,type:{mode:String,craft:Boolean,enchant:String,dismantle:{type:[{type:{entityId:String,quantity:Number},_id:!1}],default:void 0}},default:void 0},shop:{default:void 0,_id:!1,type:{price:{required:!0,type:Number},limit:Number,size:Number,odd:Number}},bottle:{default:void 0,_id:!1,type:{xp:{type:s.Schema.Types.Union,of:[Number,[Number]],required:!0},buffs:{required:!0,default:[],type:[{target:{type:String,required:!0},multiplier:{type:Number,required:!0},origin:{type:String,required:!0},startIn:{type:Number,default:null},endIn:{type:Number,default:null},_id:!1}]},hp:Number,tier:Number}},ms:Number,characteristics:{_id:!1,type:Object},level:Number,panoply:String},{minimize:!1}),X=s.models?.Entities||s.model("Entities",wt),gt=async a=>await X.create({...a}),bt=async(a,e)=>X.find(a,{},e).lean();async function $t(a){const e=await X.findOne({entityId:a}).lean();return e||null}const It=(a,e)=>X.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class Et extends ht{constructor(){super(3600)}createInDb(e){return gt(e)}updateInDb(e,t){return It(e,t)}fetchFromDb(e){return $t(e)}fetchManyFromDb(e,t){return bt(e,t)}normalizeKey(e){return e}getKey(e){return e.entityId}}const p=new Et;class Ut extends m{hasAlreadyFoundEntity(e,t){return e.encyclopedia.includes(t)}async addEntities(e,t){await this.update(e,{$addToSet:{encyclopedia:{$each:t}}})}}const Dt=async a=>await H.create({user:a});async function Ot(a){const e=await H.findOne({user:a}).lean();return e||f(await Dt(a))}const Tt=(a,e)=>H.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class vt extends Ut{constructor(){super(300)}fetchFromDb(e){return Ot(e)}getKey({user:e}){return e}normalizeKey(e){return e.toString()}updateInDb(e,t){return Tt(e,t)}}const L=new vt;class Bt extends m{getPanoplyEffectiveBonus(e,t){const n=o.filterNullAndUndefined(Object.values(e.equippedItems)),r=t.equipments.filter(i=>n.find(u=>u.entityId===i.entityId)).length;if(r===t.equipments.length)return t.fullBonus;if(r>=t.equipments.length/2)return t.halfBonus}async getUserEquipmentsCharacteristics(e){let t={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};const n=await E.getAllPopulated();for(const r of y.EQUIPMENT_SLOT){const i=e.equippedItems?.[r];if(!i)continue;const u=await p.fromDBToEquipableEquipment(i);t=o.mergeObjects(t,u.characteristics,(l,c)=>l+c)}for(const r of n){const i=this.getPanoplyEffectiveBonus(e,r);i&&!("target"in i)&&(t=o.mergeObjects(t,i,(u,l)=>u+l))}return t}async hasInventoryRequirements(e,t){const n=await this.get(e);return o.recordToArray(t).reduce((r,[i,u])=>r&&(n.itemList[i]??0)>=(u??0),!0)}async hasEnoughEntity(e,t,n){return((await this.get(e)).itemList[n]??0)>=t}async getItemList(e){return(await this.get(e)).itemList}async calcBottleMultiplier(e,{bottle:{buffs:t}}){const n=await this.get(e),i=(await E.getPanoplyBonus(n.equippedItems)).find(([u,l])=>u.panoplyId==="herbalist"&&l!==null);return i&&i[1]==="full"?t.map(u=>({...u,multiplier:u.multiplier*1.25})):i&&i[1]==="half"?t.map(u=>({...u,multiplier:u.multiplier*1.1})):t}async calcMinStreakForWorkLoot(e){const t=await this.get(e),n=(await E.getPanoplyBonus(t.equippedItems)).find(([r,i])=>r.panoplyId==="marine"&&i!==null);return n&&n[1]==="full"?10:n&&n[1]==="half"?20:1/0}async hasRevolutionaryBuff(e){const t=await this.get(e);return(await E.getPanoplyBonus(t.equippedItems)).find(([r,i])=>r.panoplyId==="revolutionary"&&i!==null)?.[1]??null}async addItem(e,t,n){await this.update(e,{$inc:{[`itemList.${t}`]:n}}),await L.addEntities(e,[t])}async addItems(e,t){await this.update(e,{$inc:Object.fromEntries(Object.entries(t).filter(([,n])=>(n??0)>0).map(([n,r])=>[`itemList.${n}`,r]))}),await L.addEntities(e,o.recordToArray(t).filter(([,n])=>n>0).map(([n])=>n))}async removeItem(e,t,n){n!==0&&await this.update(e,[{$set:{[`itemList.${t}`]:{$max:[{$add:[`$itemList.${t}`,-n]},0]}}}])}async removeEquipment(e,t,n){await this.update(e,{$pull:{equipmentList:{entityId:t,seed:n}}})}async removeAllItem(e,t){await this.update(e,{$set:{[`itemList.${t}`]:0}})}async addEquipments(e,t){await this.update(e,{$push:{equipmentList:{$each:t}}}),await L.addEntities(e,t.map(n=>n.entityId))}async saveEquipments(e){await this.update(e,[{$set:{equipmentSave:{$push:["$equipmentSave","$equippedItems"]}}}])}async changeEquippedEquipment(e,t){const n=await this.get(e);n?.equipmentSave[t]&&await this.equip(e,n.equipmentSave[t])}async equip(e,t){const n=await U.getMaxHp(e),r=Object.fromEntries(o.recordToArray(t).map(([i,u])=>[`equippedItems.${i}`,u]));await this.update(e,{$set:r}),await U.updateHp(e,n)}async unequip(e,t){const n=await U.getMaxHp(e);await this.update(e,{$set:{[`equippedItems.${t}`]:null}}),await U.updateHp(e,n)}async craftItem(e,t,n,r){for(const{entityId:l,size:c}of t.entities)await this.removeItem(e,l,c*n);const{entityId:i,size:u}=t.result;await p.isEntityId(i,p.isEquipment)?await this.addEquipments(e,[{entityId:i,seed:r}]):await p.isEntityId(i,p.isItem)&&await this.addItem(e,i,u*n)}async dismantleEntity(e,t,n,r,i){p.isEquipment(t)?await this.removeEquipment(e,t.entityId,i):p.isItem(t)&&await this.removeItem(e,t.entityId,r);for(const{entityId:u,quantity:l}of n)await p.isEntityId(u,p.isItem)&&await this.addItem(e,u,r*l);await this.removeItem(e,"tools",1)}async enchantItem(e,t,n,r,i){await this.removeItem(e,t,i*4),await this.removeItem(e,r,i),await this.addItem(e,n,i)}async unlockRecipe(e,t){await this.update(e,{$addToSet:{recipes:t}})}}const At=a=>P.create({user:a});async function Mt(a){const e=await P.findOne({user:a}).lean();return e||f(await At(a))}const kt=(a,e)=>P.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class qt extends Bt{constructor(){super(300)}fetchFromDb(e){return Mt(e)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}updateInDb(e,t){return kt(e,t)}}const h=new qt;class Rt extends ${async getTotalCharacteristics(e){const{characteristics:t,scrolls:n}=await this.get(e);return o.arrayToRecord(y.CHARACTERISTICS.map(r=>[r,y.getComputedCharacteristicValue(t[r])+n[r]]))}async isCooldownForXpPassed(e){const t=await this.get(e);return Date.now()-t.xp.lastMessageWithXp.getTime()>60*1e3}async getAllWithExpiredBuffs(){const e=new Date;return this.getMany({$or:[{"xp.boost":{$lt:e}},{"buffs.cooldown.casino":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.cooldown.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.berry.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.berry.global":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.drop.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.xp.global":{$elemMatch:{expireAt:{$lt:e}}}}]})}async calcXpBoost(e){const t=await this.get(e),{boost:n}=t.xp,r=n!==null&&Date.now()<n.getTime()?.2:0,i=Math.max(t.premium?.5:0,t.booster?.25:0);return r+i+t.buffs.xp.global.reduce((u,{expireAt:l,startAt:c,multiplier:w})=>c&&c>new Date||l&&o.hasExpire(l)?u:u+w,0)}calcMessageXp(e){const t=e.trim().length,n=2;return t<10?10*n:t>300?300*n:t*n}async getXpDeathPenalties(e){const t=await this.get(e),n=y.getCurrentLevel(t.xp.amount);return n<=10?5e3:n<=20?1e4:n<=30?2e4:n<=40?3e4:n<=50?5e4:n<=60?75e3:n<=70?15e4:n<=80?25e4:n<=90?4e5:n<=100?75e4:14e6}async calcXp(e,t,n){return t*=1+await this.calcXpBoost(e),Math.ceil(t*n)}async calcBerry(e,t,n){if(t<=0)return t;const r=n?1:await this.calcBuffMultiplier(e,"berry","global");return Math.ceil(t*(r||1))}async calcBuffMultiplier(e,t,n){return(await this.get(e)).buffs[t][n].reduce((u,{expireAt:l,startAt:c,multiplier:w})=>u+(new Date>=(c??new Date)&&(!l||!o.hasExpire(l))?w:0),1)}async getMaxHp(e){const t=await h.get(e),{vitality:n}=await this.getTotalCharacteristics(e),r=await h.getUserEquipmentsCharacteristics(t);return(n+r.vitality)*y.HP_PER_VITALITY+y.DEFAULT_MAX_HP}async getHpRatio(e){const t=await this.get(e),n=await this.getMaxHp(e);return Math.min(t.hp/n,1)}async hasCharacteristicRequirement(e,t){const n=await h.get(e),r=await h.getUserEquipmentsCharacteristics(n),i=o.mergeObjects(await this.getTotalCharacteristics(e),r,(u,l)=>u+l);if("sum"in t){let u=0;for(const l of t.characteristics)u+=i[l]??0;return u>=t.sum}else{for(const u of Object.keys(t))if(i[u]<(t[u]??0))return!1;return!0}}async hasMalusBuff(e){const t=await this.get(e);for(const n of Object.values(t.buffs))for(const r of Object.values(n))for(const{multiplier:i,startAt:u,expireAt:l}of r)if(i<0&&(!l||!o.hasExpire(l))&&(u??new Date)<=new Date)return!0;return!1}async addBerry(e,t){await this.update(e,[{$set:{berry:{$max:[{$add:["$berry",t]},0]}}}])}async addXp(e,t){await this.update(e,{$inc:{"xp.amount":t}})}async updatePremium(e,t){await this.update(e,{$set:{premium:t}})}async updateBooster(e,t){await this.update(e,{$set:{booster:t}})}async updateBoost(e,t){const{xp:{boost:n}}=await this.update(e,[{$set:{"xp.boost":{$cond:{if:{$or:[{$not:"$xp.boost"},{$lt:["$xp.boost",new Date]}]},then:{$add:[new Date,t]},else:{$add:["$xp.boost",t]}}}}}]);return n}async updateBuff(e,t){if(Array.isArray(t)){for(const r of t)await this.updateBuff(e,r);return}const n=y.transformToDBBuff(t);await this.update(e,[{$set:{[`buffs.${t.target}`]:{$map:{input:`$buffs.${t.target}`,as:"buff",in:{$cond:{if:{$eq:[{$substr:["$$buff.origin",0,{$indexOfBytes:["$$buff.origin","/"]}]},t.origin.split("/")[0]]},then:{multiplier:t.multiplier,origin:t.origin,expireAt:n.expireAt?{$cond:{if:{$lt:["$$buff.expireAt",new Date]},then:n.expireAt,else:{$add:["$$buff.expireAt",(t.endIn??0)*60*60*1e3]}}}:null,startAt:{$cond:{if:{$gte:["$$buff.startAt",new Date]},then:"$$buff.startAt",else:{$add:[new Date,(t.startIn??0)*60*60*1e3]}}}},else:"$$buff"}}}}}},{$set:{[`buffs.${t.target}`]:{$cond:{if:{$in:[t.origin.split("/")[0],{$map:{input:`$buffs.${t.target}`,as:"buff",in:{$substr:["$$buff.origin",0,{$indexOfBytes:["$$buff.origin","/"]}]}}}]},then:`$buffs.${t.target}`,else:{$concatArrays:[`$buffs.${t.target}`,[{...n}]]}}}}}])}async removeBuff(e,t){await this.update(e,{$pull:{[`buffs.${t.target}`]:{origin:t.origin}}})}async updatePanoplyBuff(e,t,n,r){const i=await p.fromDBToEquipableEquipment(t),u=o.filterNullAndUndefined(Object.values(n)),c=(await E.getAllPopulated()).find(v=>v.panoplyId===i.panoply);if(!c)return;const w=c.equipments.filter(v=>(u.find(de=>v.entityId===de.entityId)||!r&&i.entityId===v.entityId)&&(r?i.entityId!==v.entityId:!0)).length,x=w===c.equipments.length?c.fullBonus:w>=c.equipments.length/2?c.halfBonus:void 0;c.halfBonus&&"target"in c.halfBonus&&await this.removeBuff(e,c.halfBonus),c.fullBonus&&"target"in c.fullBonus&&await this.removeBuff(e,c.fullBonus),x&&"target"in x&&await this.updateBuff(e,x)}async gainHp(e,t){const n=await this.get(e),i=await this.getMaxHp(e)-n.hp;await this.update(e,{$set:{hp:n.hp+Math.floor(Math.min(t,i))}})}async loseHp(e,t){await this.update(e,[{$set:{hp:{$max:[{$add:["$hp",-t]},0]}}}])}async updateHp(e,t){const n=await this.getMaxHp(e);await this.update(e,[{$set:{hp:{$round:[{$multiply:[{$divide:["$hp",t]},n]},0]}}}])}async addCharacteristics(e,t){const n=await this.getMaxHp(e),r=Object.fromEntries(Object.entries(t).filter(([,i])=>i!==0).map(([i,u])=>[`characteristics.${i}`,u]));await this.update(e,{$inc:r}),await this.updateHp(e,n)}async addScrollCharacteristic(e,t){const n=await this.getMaxHp(e),r=Object.fromEntries(Object.entries(t).filter(([,i])=>i!==0).map(([i,u])=>[`scrolls.${i}`,u]));await this.update(e,{$inc:r}),await this.updateHp(e,n)}async resetCharacteristics(e,t){const n=await this.getMaxHp(e),r={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};t?await this.update(e,{$set:{characteristics:r,"resetCharacteristics.free":!1}}):await this.update(e,{$set:{characteristics:r,"resetCharacteristics.nextAvailable":new Date(Date.now()+720*60*60*1e3)},$inc:{berry:-1e8}}),await this.updateHp(e,n)}async updateLastMessageWithXpDate(e){await this.update(e,{$set:{"xp.lastMessageWithXp":new Date}})}async resetMinutesInVoiceToday(e){await this.update(e,{$set:{"xp.voice.minutesInVoiceToday":0}})}async addMinutesInVoiceToday(e,t){await this.update(e,{$inc:{"xp.voice.minutesInVoiceToday":t}})}async updateLastVoiceConnection(e,t){await this.update(e,{$set:{"xp.voice.lastConnection":t}})}async incrementWorkUnluckyStreak(e){await this.update(e,{$inc:{workUnluckyStreak:1}})}async resetWorkUnluckyStreak(e){await this.update(e,{$set:{workUnluckyStreak:0}})}async updateUserXp(e,t){const n=await this.calcXp(e,t,await this.getHpRatio(e));return await this.addXp(e,n),n}async updateUserBerry(e,t,n){const r=await this.calcBerry(e,t,n);return await this.addBerry(e,r),r}}const _t=a=>O.find(a).lean(),Ct=async a=>await O.create({user:a});async function Nt(a){const e=await O.findOne({user:a}).lean();return e||f(await Ct(a))}const xt=(a,e)=>O.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).lean();class Ft extends Rt{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Nt(e)}fetchManyFromDb(e){return _t(e)}updateInDb(e,t){return xt(e,t)}}const U=new Ft;class jt extends ${async updateSendDailyQuest(e,t){await this.update(e,{$set:{sendDailyQuest:t}})}async updateSendDailyReport(e,t){await this.update(e,{$set:{sendDailyReport:t}})}async updateInventorySort(e,t){await this.update(e,{$set:{"sort.inventory":t}})}async updateReminderSettings(e,t,n){await this.update(e,{$set:{[`reminder.${t}`]:n}})}getUsersWithDailyReportEnable(){return this.getMany({sendDailyReport:!0})}}const zt=a=>R.find(a).lean(),Ht=async a=>await R.create({user:a});async function Kt(a){const e=await R.findOne({user:a}).lean();return e||f(await Ht(a))}const Pt=(a,e)=>R.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).lean();class Qt extends jt{constructor(){super(3600)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return Kt(e)}fetchManyFromDb(e){return zt(e)}updateInDb(e,t){return Pt(e,t)}}const ne=new Qt;class Wt extends m{async getCommandCooldown(e,t){return(await this.get(e)).commands[t]}async lockUserCommand(e){await this.update(e,{$set:{lockUserCommand:new Date(Date.now()+2*3600*1e3)}}),await U.gainHp(e,1)}async useCommand(e,t,n){const{reminder:r}=await ne.get(e);await this.update(e,{$set:{[`commands.${t}`]:new Date(Date.now()+n)}}),r.commands[t]&&await Ee.addReminder(e,`commands/${t}`,new Date(Date.now()+n))}}const Gt=async a=>await j.create({user:a});async function Yt(a){const e=await j.findOne({user:a}).lean();return e||f(await Gt(a))}const Vt=(a,e)=>j.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).lean();class Xt extends Wt{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return Yt(e)}updateInDb(e,t){return Vt(e,t)}}const Lt=new Xt;class Jt extends ${async isOrnamentIds(e,t=()=>!0){const r=(await this.getAll()).filter(t).map(({ornamentId:i})=>i);return e.every(i=>r.includes(i))}isOrnament(e){return!!e&&"ornamentId"in e}isTitle(e){return e.type==="title"}isBackground(e){return e.type==="background"}isQuestTitle(e){return this.isTitle(e)&&!("faction"in e)&&!("price"in e)}isFactionTitle(e){return this.isTitle(e)&&"faction"in e}isShopTitle(e){return this.isTitle(e)&&"price"in e}async getAllBackgrounds(){return(await this.getAll()).filter(this.isBackground)}async getAllTitles(){return(await this.getAll()).filter(this.isTitle)}async getAllFactionTitles(){return(await this.getAll()).filter(this.isFactionTitle)}async getAllQuestTitles(){return(await this.getAll()).filter(this.isQuestTitle)}async getAllShopTitles(){return(await this.getAll()).filter(this.isShopTitle)}formatBackgroundId(e){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,n=>n.ornamentId,n=>n.odd??0),n=>n.price)}async getSomeBackgrounds(e){const t=await this.getAllBackgrounds();return o.sortBy(o.pickNthByOdds(e,t,n=>n.ornamentId,n=>n.odd??0),n=>n.price??0)}pickEachRarityOrnament(e,t){if(t.length!==y.RANK_IDS_WITHOUT_BASIC.length)throw new RangeError("pickEachRarityOrnament - must give same number of odds than ranks");return o.filterNullAndUndefined(t.map((n,r)=>{const i=y.RANK_IDS_WITHOUT_BASIC[r],u=e[i];return Math.random()>n||!u||!u.length?null:o.pickFrom(u)}))}}const Zt=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}),re=s.models?.Ornaments||s.model("Ornaments",Zt),ea=async(a,e)=>re.find(a,{},e).lean();async function ta(a){const e=await re.findOne({ornamentId:a}).lean();return e||null}const aa=(a,e)=>re.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class na extends Jt{constructor(){super(3600)}updateInDb(e,t){return aa(e,t)}fetchFromDb(e){return ta(e)}fetchManyFromDb(e,t){return ea(e,t)}getKey(e){return e.ornamentId}normalizeKey(e){return e}}const S=new na;class ra extends m{async unlockTitle(e,t){await S.isOrnamentIds([t],S.isTitle)&&await this.update(e,{$addToSet:{unlockedTitles:t}})}async unlockTitles(e,t){await S.isOrnamentIds(t,S.isTitle)&&await this.update(e,{$addToSet:{unlockedTitles:{$each:t}}})}async selectTitle(e,t){await this.update(e,{$set:{selectedTitle:t}})}async unlockBackground(e,t){await S.isOrnamentIds([t],S.isBackground)&&await this.update(e,{$addToSet:{unlockedBackgrounds:t}})}async unlockBackgrounds(e,t){await S.isOrnamentIds(t,S.isBackground)&&await this.update(e,{$addToSet:{unlockedBackgrounds:{$each:t}}})}async selectBackground(e,t){await this.update(e,{$set:{selectedBackground:t}})}async unlockBadge(e,t,n){t.isProgressive?await this.update(e,{$addToSet:{unlockedBadges:`${t.id}_${n}`}}):await this.update(e,{$addToSet:{unlockedBadges:t.id}})}async unlockFactionBadge(e,t){await this.update(e,{$addToSet:{unlockedFactionBadges:{$each:[`b_marine_${t}`,`b_revolutionary_${t}`,`b_pirate_${t}`]}}})}async unlockProfileAsset(e,t){await this.update(e,{$addToSet:{unlockedProfileAssets:t}})}async unlockBag(e,t){await this.update(e,{$addToSet:{unlockedBags:t}})}async selectBag(e,t){await this.update(e,{$set:{selectedBag:t}})}}const sa=async a=>await Q.create({user:a});async function ia(a){const e=await Q.findOne({user:a}).lean();return e||f(await sa(a))}const ua=async(a,e)=>Q.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class ca extends ra{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return ia(e)}updateInDb(e,t){return ua(e,t)}}const N=new ca;class da extends ${async getStatus(e,t){return(await this.get({user:e,questId:t})).status}async isCompleted(e,t){return await this.getStatus(e,t)==="COMPLETED"}async isStreaking(e,t){const{lastCompletionDate:n}=await this.get({user:e,questId:t});return!!n&&o.sameDay(o.yesterday(),n)}async getStreakMultiplier(e,t){const n=await this.get({user:e,questId:t});return await this.isStreaking(e,t)?1+Math.min(2,(n.streak??0)/10):1}async getCompletedCount(e){return(await this.getMany({user:e,status:y.QuestStatus.COMPLETED})).length}async completeQuest(e,t=!1){const n=o.yesterday();n.setHours(0,0,0,0);const r=new Date;return r.setHours(0,0,0,0),this.update(e,[{$set:{...t?{streak:{$cond:{if:{$and:[{$gte:["$lastCompletionDate",n]},{$lt:["$lastCompletionDate",r]}]},then:{$add:[{$ifNull:["$streak",0]},1]},else:1}}}:{},lastCompletionDate:new Date,status:y.QuestStatus.COMPLETED}}],{upsert:!1})}}function la(a){return B.find(a).lean()}const oa=async a=>await B.create({...a});async function pa(a){const e=await B.findOne(a).lean();return e||f(await oa(a))}function ya(a,e,t){return B.findOneAndUpdate(a,e,{upsert:!0,...t,returnDocument:"after"}).lean()}class fa extends da{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 pa(e)}fetchManyFromDb(e){return la(e)}updateInDb(e,t,n){return ya(e,t,n)}}const se=new fa;class ma extends m{async randomMessageIncrement(e){await this.update(e,{$inc:{randomMessageClaimed:1}})}async addWrittenTextChannel(e,t){await this.update(e,{$addToSet:{writeDifferentChatIds:t}})}async incrementMessageSend(e){await this.update(e,{$inc:{messageSent:1}})}async addTotalMinutesInVoice(e,t){await this.update(e,{$inc:{totalMinutesInVoice:t}})}}const ha=async a=>await Y.create({user:a});async function Sa(a){const e=await Y.findOne({user:a}).lean();return e||f(await ha(a))}const wa=(a,e)=>Y.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class ga extends ma{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Sa(e)}updateInDb(e,t){return wa(e,t)}}const ie=new ga;class ba extends m{async updateDailyReport(e){const t=await U.get(e),n=await N.get(e),r=await se.getMany({user:e,status:y.QuestStatus.COMPLETED}),i=await ie.get(e);await this.update(e,{$set:{xpYesterday:t.xp.amount,berryYesterday:t.berry,previousCompletedQuest:r.map(({questId:u})=>u),"previousOrnament.unlockedBadges":n.unlockedBadges,"previousOrnament.unlockedTitles":n.unlockedTitles,"previousOrnament.unlockedBackgrounds":n.unlockedBackgrounds,previousMessageSent:i.messageSent}})}async getDailyReport(e){const{previousOrnament:t,previousCompletedQuest:n,xpYesterday:r,berryYesterday:i,previousMessageSent:u}=await this.get(e),l=await U.get(e),c=await se.getMany({user:e,status:y.QuestStatus.COMPLETED}),w=await N.get(e),x=await ie.get(e),{berry:v,xp:de}=l,{voice:Re,amount:Sr}=de,{unlockedBadges:wr,unlockedBackgrounds:gr,unlockedTitles:br}=w;return{berry:v-i,xp:Sr-r,message:x.messageSent-u,voice:o.sameDay(Re.lastConnection,o.yesterday())?Re.minutesInVoiceToday:0,quest:o.exclude(c.map(({questId:$r})=>$r),n),badge:o.exclude(wr,t.unlockedBadges),title:o.exclude(br,t.unlockedTitles),background:o.exclude(gr,t.unlockedBackgrounds)}}async getAllDailyReportsToSend(){const e=await ne.getUsersWithDailyReportEnable(),t=await Ie.getMany({_id:{$in:e.map(({user:n})=>n)},faction:{$ne:"citizen"}});return await Promise.all(t.map(async({_id:n,discordId:r})=>({report:await this.getDailyReport(n),user:n,discordId:r})))}}const $a=a=>z.create({user:a});async function Ia(a){const e=await z.findOne({user:a}).lean();return e||f(await $a(a))}const Ea=(a,e)=>z.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Ua extends ba{constructor(){super(60)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return Ia(e)}updateInDb(e,t){return Ea(e,t)}}const Da=new Ua;class Oa extends m{async setGuessGame(e,t,n,r){await this.update(e,{$set:{guess:{amount:t,tries:n,numberToGuess:r,lastGuess:0}}})}async resetGuessGame(e){await this.update(e,{$set:{guess:null}})}async updateGuessGame(e){await this.update(e,{$inc:{"guess.tries":1},$set:{"guess.lastGuess":Date.now()}})}}const Ta=async a=>await K.create({user:a});async function va(a){const e=await K.findOne({user:a}).lean();return e||f(await Ta(a))}const Ba=(a,e)=>K.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Aa extends Oa{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return va(e)}updateInDb(e,t){return Ba(e,t)}}const Ma=new Aa,ka=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}}),q=s.models?.UserRank||s.model("UserRank",ka);class qa extends m{async computeAllXpRanks(){const t=(await O.aggregate([{$setWindowFields:{sortBy:{"xp.amount":-1},output:{xpRank:{$rank:{}}}}},{$project:{user:1,xpRank:1}}])).map(({user:n,xpRank:r})=>({updateOne:{filter:{user:n},update:{$set:{xp:r}},upsert:!0}}));t.length>0&&await q.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:n,berryRank:r})=>({updateOne:{filter:{user:n},update:{$set:{berry:r}},upsert:!0}}));t.length>0&&await q.bulkWrite(t),this.clearAll()}async computeAllFactionRanks(){const t=(await I.aggregate([{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$setWindowFields:{partitionBy:"$faction",sortBy:{"meta.xp.amount":-1},output:{factionRank:{$rank:{}}}}},{$project:{factionRank:1}}])).map(({_id:n,factionRank:r})=>({updateOne:{filter:{user:n},update:{$set:{faction:r}},upsert:!0}}));t.length>0&&await q.bulkWrite(t),this.clearAll()}async computeAllRanks(){await Promise.all([this.computeAllXpRanks(),this.computeAllBerryRanks(),this.computeAllFactionRanks()])}}const Ra=async a=>await q.create({user:a});async function _a(a){const e=await q.findOne({user:a}).lean();return e||f(await Ra(a))}const Ca=(a,e)=>q.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).lean();class Na extends qa{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return _a(e)}updateInDb(e,t){return Ca(e,t)}}const xa=new Na;class Fa extends m{async isBuyLimitReached(e,t,n){const r=await p.getAllEntitiesLimit();if(await p.isEntityId(t,p.isEquipment))return!1;const i=await this.get(e),u=i.limit?.[t];let l=r[t];const c=await h.hasRevolutionaryBuff(e);return i.lastShopId!==n?!1:(c==="half"&&t==="chest_2"&&(l+=2),c==="full"&&t==="chest_3"&&(l+=1),!!(l&&u&&u>=l))}async getShopItemRest(e,t,n,r=y.SHOP_DEFAULT_AVAILABLE_ENTITY_AMOUNT){const i=await p.getAllEntitiesLimit();if(await p.isEntityId(t,p.isEquipment))return r;let u=i[t];const l=await this.get(e),c=l.limit?.[t],w=await h.hasRevolutionaryBuff(e);return w==="half"&&t==="chest_2"&&(u+=2),w==="full"&&t==="chest_3"&&(u+=1),u?l.lastShopId!==n?u:c?u-c:Math.min(u,r):r}async increaseBuyLimit(e,t,n,r){await this.update(e,[{$set:{limit:{$cond:{if:{$eq:["$lastShopId",t]},then:{$setField:{field:n,input:{$ifNull:["$limit",{}]},value:{$add:[{$ifNull:[`$limit.${n}`,0]},r]}}},else:{[n]:r}}},lastShopId:t}}])}}const ja=async a=>await W.create({user:a}),za=async a=>{const e=await W.findOne({user:a}).lean();return e||f(await ja(a))},Ha=(a,e)=>W.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Ka extends Fa{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return za(e)}updateInDb(e,t){return Ha(e,t)}}const Pa=new Ka;class Qa extends m{async didSevenDoubleAtDoQ(e){await this.update(e,{$inc:{"doubleOrQuit.sevenDoubleInARowCount":1}})}async winWithBlackjack(e){await this.update(e,{$inc:{"blackJack.blackJackCount":1}})}async updateLastGames(e,t,n){await this.update(e,{$push:{lastGames:{$each:[{gameType:t,endState:n}],$position:0,$slice:20}}})}async drawIncrement(e){await this.update(e,{$inc:{drawCount:1}})}async bet666(e){const t=o.yesterday();t.setHours(0,0,0,0);const n=new Date;n.setHours(0,0,0,0),await M.updateOne({user:e,"bet666.last":{$gte:t,$lt:n}},{$inc:{"bet666.count":1},$set:{"bet666.last":new Date}}),await M.updateOne({user:e,"bet666.last":{$lt:t}},{$set:{"bet666.last":new Date,"bet666.count":1}}),this.invalidate(e)}async updateTotalBet(e,t){await this.update(e,{$inc:{totalBet:t}})}async updateRps(e,t){await this.update(e,[{$set:{"rps.count":{$cond:{if:{$eq:["$rps.lastRpsPlayed",t]},then:{$add:["$rps.count",1]},else:1}},"rps.lastRpsPlayed":t}}])}async hasGuessInOneTry(e){await this.update(e,{$inc:{"priceIsRight.guessInOneTryCount":1}})}async diceDoubleSix(e){await this.update(e,{$inc:{"dice.doubleSixCount":1}})}async diceDrawDoubleSix(e){await this.update(e,{$inc:{"dice.drawWithDoubleSixCount":1}})}}const Wa=async a=>await M.create({user:a});async function Ga(a){const e=await M.findOne({user:a}).lean();return e||f(await Wa(a))}const Ya=(a,e)=>M.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Va extends Qa{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Ga(e)}updateInDb(e,t){return Ya(e,t)}}const Xa=new Va;class La extends m{async workIncrement(e){await this.update(e,{$inc:{workCount:1}})}async updateTotalSpentInShop(e,t){await this.update(e,{$inc:{totalSpentInShop:t}})}}const Ja=a=>G.create({user:a});async function Za(a){const e=await G.findOne({user:a}).lean();return e||f(await Ja(a))}const en=(a,e)=>G.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class tn extends La{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Za(e)}updateInDb(e,t){return en(e,t)}}const Ue=new tn;class an extends m{async hasReportedSomeone(e){await this.update(e,{$set:{reportedSomeone:!0}})}async botPingIncrement(e){await this.update(e,{$inc:{botPingCount:1}})}async hasCelebrateBirthday(e){await this.update(e,{$set:{hasCelebrateBirthday:!0}})}async hasTagEveryone(e){await this.update(e,{$set:{tagEveryone:!0}})}async hasBetMin(e){await this.update(e,{$set:{"gamblingFlags.betMin":!0}})}async hasLoseEverything(e){await this.update(e,{$set:{"gamblingFlags.loseEverything":!0}})}async hasBet10M(e){await this.update(e,{$set:{"gamblingFlags.bet10M":!0}})}async hasWinBet10M(e){await this.update(e,{$set:{"gamblingFlags.winBet10M":!0}})}async hasLose10M(e){await this.update(e,{$set:{"gamblingFlags.lose10M":!0}})}}const nn=async a=>await V.create({user:a});async function rn(a){const e=await V.findOne({user:a}).lean();return e||f(await nn(a))}const sn=(a,e)=>V.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class un extends an{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return rn(e)}updateInDb(e,t){return sn(e,t)}}const cn=new un;class dn extends m{async readEdito(e){const t=new Date;t.setHours(0,0,0,0),await T.updateOne({user:e,"edito.lastTimeRead":{$gte:t}},{$inc:{"edito.readToday":1},$set:{"edito.lastTimeRead":new Date}}),await T.updateOne({user:e,"edito.lastTimeRead":{$lt:t}},{$set:{"edito.lastTimeRead":new Date,"edito.readToday":1}}),this.invalidate(e)}async getTotalEditoReadToday(){const e=new Date;return e.setHours(0,0,0,0),(await T.aggregate([{$match:{"edito.lastTimeRead":{$gte:e},"edito.readToday":{$gt:0}}},{$group:{_id:null,total:{$sum:"$edito.readToday"}}}]))[0]?.total??0}}const ln=async a=>await T.create({user:a});async function on(a){const e=await T.findOne({user:a}).lean();return e||f(await ln(a))}const pn=(a,e)=>T.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class yn extends dn{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return on(e)}updateInDb(e,t){return pn(e,t)}}const fn=new yn;class mn extends m{async updateCraftStats(e,t,n){const r=await p.get(n);!r||!p.isItem(r)||await this.update(e,{$inc:{"crafts.cookedMeal":p.isCookedMeal(r)?t:0,"crafts.scrolls":p.isScrollItem(r)?t:0,"crafts.totalCrafted":t}})}async incrementAlcoholDrink(e,t,n){["wine","beer","rhum"].includes(t)&&await this.update(e,{$inc:{"alcohols.wines":t==="wine"?n:0,"alcohols.beers":t==="beer"?n:0,"alcohols.rhums":t==="rhum"?n:0,"alcohols.totalConsumed":n}})}async incrementBottleUsedToday(e,t){const n=new Date;n.setHours(0,0,0,0),await k.updateOne({user:e,"bottle.lastUsed":{$gte:n}},{$inc:{"bottle.usedToday":t},$set:{"bottle.lastUsed":new Date}}),await k.updateOne({user:e,"bottle.lastUsed":{$lt:n}},{$set:{"bottle.lastUsed":new Date,"bottle.usedToday":t}}),this.invalidate(e)}async incrementBottleUsedTotal(e,t){await this.update(e,{$inc:{"bottle.totalUsed":t}})}async incrementChestOpenedTotal(e,t){await this.update(e,{$inc:{"chest.totalOpened":t}})}}const hn=async a=>await k.create({user:a});async function Sn(a){const e=await k.findOne({user:a}).lean();return e||f(await hn(a))}const wn=(a,e)=>k.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class gn extends mn{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Sn(e)}updateInDb(e,t){return wn(e,t)}}const bn=new gn;class $n extends ${async maxCraftQuantity(e,t){const n=await h.get(e);let r=1/0;for(const i of t)r=Math.min(r,Math.floor((n.itemList[i.entityId]??0)/i.size));return r}async hasEnoughItemsForRecipe(e,t,n){const r=await h.get(e);for(const i of t.entities)if((r.itemList[i.entityId]??0)<i.size*n)return!1;return!0}decodeCraftId(e){return e.split(";").map((t,n)=>({entityId:t==="null"?null:t,index:n}))}encodeCraftId(e){return e.map(({entityId:t})=>`${t}`).join(";")}async isValidRecipe(e){return!!(await this.getAll()).find(n=>n.craftId===e)}async getRecipeResult(e,t){const n=await h.get(e),r=(await E.getPanoplyBonus(n.equippedItems)).find(([i,u])=>i.panoplyId==="little_blacksmith"&&u!==null);return r?.[1]==="full"&&t==="chest_3"?"chest_blacksmith_3":r?.[1]==="half"&&t==="chest_2"?"chest_blacksmith_2":r?.[1]==="half"&&t==="chest_1"?"chest_blacksmith_1":t}}const In=new s.Schema({entityId:{type:String,required:!0},size:{type:Number,required:!0}},{_id:!1}),En=new s.Schema({entityId:{type:String,required:!0},size:{type:Number,required:!0}},{_id:!1}),Un=new s.Schema({craftId:{type:String,unique:!0,required:!0},name:{type:String,required:!0},entities:{type:[In],required:!0},result:{type:En,required:!0}},{minimize:!1}),J=s.models?.Recipes||s.model("Recipes",Un),Dn=async a=>await J.create({...a}),On=async(a,e)=>J.find(a,{},e).lean();async function Tn(a){const e=await J.findOne({craftId:a}).lean();return e||null}const vn=(a,e)=>J.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class Bn extends $n{constructor(){super(3600)}createInDb(e){return Dn(e)}updateInDb(e,t){return vn(e,t)}fetchFromDb(e){return Tn(e)}fetchManyFromDb(e,t){return On(e,t)}normalizeKey(e){return e}getKey(e){return e.craftId}}const An=new Bn,Mn=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}}),Z=s.models?.Bans||s.model("Bans",Mn),kn=(a,e)=>Z.deleteOne({bannedUserId:a,guildId:e});class qn extends ${async getUnbanUsers(){return this.getMany({unbannedTimestamp:{$lte:new Date,$ne:null}})}async banUserFromGuild({bannedUserId:e,guildId:t,...n}){await this.update({bannedUserId:e,guildId:t},{...n})}async isBannedFromGuild(e,t){const n=await this.get({bannedUserId:e,guildId:t});return!!(n&&(!n.unbannedTimestamp||n.unbannedTimestamp>new Date))}async deleteBan(e,t){await kn(e,t),this.invalidate({bannedUserId:e,guildId:t})}}const Rn=a=>Z.find(a).lean(),_n=a=>Z.findOne(a).lean(),Cn=(a,e)=>Z.findOneAndUpdate(a,e,{returnDocument:"after",upsert:!0}).lean();class Nn extends qn{constructor(){super(3600*36)}normalizeKey(e){return`${e.guildId}/${e.bannedUserId}`}getKey({bannedUserId:e,guildId:t}){return{bannedUserId:e,guildId:t}}fetchFromDb(e){return _n(e)}fetchManyFromDb(e){return Rn(e)}updateInDb(e,t){return Cn(e,t)}}const xn=new Nn,Fn=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}}}),ee=s.models?.Invitation||s.model("Invitation",Fn),jn=a=>ee.create({...a}),zn=async a=>{await ee.deleteMany({...a})};class Hn extends m{async sendInvitation({senderId:e,receiverId:t,gameMode:n,...r}){return await this.get({senderId:e,gameMode:n,receiverId:t})?null:await jn({...r,senderId:e,gameMode:n,receiverId:t})}async deleteInvitation({senderId:e,receiverId:t,gameMode:n}){await zn({senderId:e,gameMode:n,receiverId:t}),this.invalidate({senderId:e,gameMode:n,receiverId:t})}}const Kn=a=>ee.findOne({...a}).lean(),Pn=(a,e)=>ee.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class Qn extends Hn{constructor(){super(3600)}normalizeKey(e){return`${e.gameMode}/${e.receiverId}/${e.senderId}`}getKey({receiverId:e,gameMode:t,senderId:n}){return{gameMode:t,receiverId:e,senderId:n}}fetchFromDb(e){return Kn(e)}updateInDb(e,t){return Pn(e,t)}}const Wn=new Qn;class Gn extends m{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,n){await this.update({guildId:e},{$push:{"crew.crewChannelIds":{channelId:n,crewId:t}}})}async updateRolesId(e,t){await this.update({guildId:e},{$set:Object.fromEntries(Object.entries(t).map(([n,r])=>[`roles.${n}`,r]))})}async updateChannelId(e,t){await this.update({guildId:e},{$set:Object.fromEntries(Object.entries(t).map(([n,r])=>[`channels.${n}`,r]))})}}const Yn=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:[]}}}),ue=s.models?.Settings||s.model("Settings",Yn),Vn=a=>ue.create({guildId:a}),Xn=async a=>{const e=await ue.findOne({guildId:a}).lean();return e||f(await Vn(a))},Ln=(a,e)=>ue.findOneAndUpdate(a,e,{upsert:!0,returnDocument:"after"}).lean();class Jn extends Gn{constructor(){super(3600*24*30)}normalizeKey(e){return e}getKey({guildId:e}){return e}fetchFromDb(e){return Xn(e)}updateInDb(e,t){return Ln(e,t)}}const Zn=new Jn;class D{toDBShopItem(){return{price:this.price,size:this.size,id:"entityId"in this.data?this.data.entityId:this.data.ornamentId,currency:this.currency}}async onBuy(e,t){this.currency==="berry"?(await U.updateUserBerry(e,-1*this.price*t,!1),await Ue.updateTotalSpentInShop(e,this.price*t)):await h.removeItem(e,this.currency,this.price*t)}isBackground(){return!1}isChest(){return!1}isTitle(){return!1}isBoostXp(){return!1}isRepair(){return!1}isStore(){return!1}isObject(){return!1}isBottle(){return!1}isEquipment(){return!1}}class De extends D{price;size;currency;data;constructor({price:e,item:t,size:n,currency:r}){super(),this.data=t,this.price=e,this.size=n,this.currency=r}async onBuy(e,t){await super.onBuy(e,t),await N.unlockBackground(e,this.data.ornamentId)}isBackground(){return!0}}class Oe extends D{price;size;currency;data;constructor({price:e,item:t,size:n,currency:r}){super(),this.data=t,this.price=e,this.size=n,this.currency=r}async onBuy(e,t){await super.onBuy(e,t),await h.addItem(e,this.data.entityId,t)}isBoostXp(){return!0}}class Te extends D{price;size;currency;data;constructor({price:e,item:t,size:n,currency:r}){super(),this.data=t,this.price=e,this.size=n,this.currency=r}async onBuy(e,t){await super.onBuy(e,t),await h.addItem(e,this.data.entityId,t)}isChest(){return!0}}class ve extends D{price;size;currency;data;constructor({price:e,item:t,size:n,currency:r}){super(),this.data=t,this.price=e,this.size=n,this.currency=r}async onBuy(e,t){await super.onBuy(e,t),await h.addItem(e,this.data.entityId,t)}isObject(){return!0}}class Be extends D{price;size;currency;data;constructor({price:e,item:t,size:n,currency:r}){super(),this.data=t,this.price=e,this.size=n,this.currency=r}async onBuy(e,t){await super.onBuy(e,t),await h.addEquipments(e,o.range({stop:t}).map(()=>p.seedEquipment({...this.data},Date.now()-Math.round(Math.random()*1e3))).map(n=>({entityId:n.entityId,seed:n.seed})))}isEquipment(){return!0}}class Ae extends D{price;size;currency;data;constructor({price:e,item:t,size:n,currency:r}){super(),this.data=t,this.price=e,this.size=n,this.currency=r}async onBuy(e,t){await super.onBuy(e,t),await h.addItem(e,this.data.entityId,t)}isBottle(){return!0}}class Me extends D{price;size;currency;data;constructor({price:e,item:t,size:n,currency:r}){super(),this.data=t,this.price=e,this.size=n,this.currency=r}async onBuy(e,t){await super.onBuy(e,t),await h.addItem(e,this.data.entityId,t)}isRepair(){return!0}}class ke extends D{price;size;currency;data;constructor({price:e,item:t,size:n,currency:r}){super(),this.data=t,this.price=e,this.size=n,this.currency=r}async onBuy(e,t){await super.onBuy(e,t),await h.addItem(e,this.data.entityId,t)}isStore(){return!0}}class qe extends D{price;size;currency;data;constructor({price:e,item:t,size:n,currency:r}){super(),this.data=t,this.price=e,this.size=n,this.currency=r}async onBuy(e,t){await super.onBuy(e,t),await N.unlockTitle(e,this.data.ornamentId)}isTitle(){return!0}}class er extends m{async getShopItem(e,t){const r=(await this.get(e)).items.find(w=>w.id===t);if(!r)return;const{price:i,size:u,currency:l}=r,c=await p.get(r.id)??await S.get(r.id);if(S.isOrnament(c)&&S.isBackground(c))return new De({price:i,item:c,size:u,currency:l});if(S.isOrnament(c)&&S.isShopTitle(c))return new qe({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isChestItem(c))return new Te({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isBoostItem(c))return new Oe({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isRepairItem(c))return new Me({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isStoreItem(c))return new ke({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isObjectItem(c))return new ve({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isEquipment(c))return new Be({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isBottleItem(c))return new Ae({price:i,size:u,item:c,currency:l})}async getShopItemList(e){const t=await this.get(e),n=[];for(const{id:r}of t.items){const i=await this.getShopItem(e,r);i&&n.push(i)}return n}getShopItemId(e){return p.isEntity(e.data)?e.data.entityId:e.data.ornamentId}async updateShopStats(e,t,n){await this.update({shopType:e},{$inc:{"stats.berrySpent":t.price*n,"stats.itemBought":n,"stats.chestBought":t.isChest()?n:0,"stats.percentBought":t.data.type==="repair"?(t.data.effects.find(r=>r.type==="CREW_REPAIR")?.params.amount??0)*n:0,"stats.boostTimeBought":t.data.type==="boost"&&t.data.ms?t.data.ms/(1440*60*1e3):0}})}async buyShopItem(e,t,n,r){const i=t.map(u=>(u.id===this.getShopItemId(n)&&u.size&&(u.size-=r),u));await this.update({shopType:e},{$set:{items:i}})}async publish(e){await this.update({shopType:e},{$set:{publishedAt:new Date}})}async setShopItems(e,t){await this.update({shopType:e},{$set:{items:[...t]}})}}const tr=new s.Schema({shopType:{type:String,required:!0,unique:!0},publishedAt:{type:Date,default:new Date},duration:{type:Number,default:null},closeAt:{type:Date,default:null},items:{type:[{_id:!1,type:{price:Number,size:{type:Number,default:null},id:String,currency:String}}],default:[]},stats:{berrySpent:{type:Number,default:0},itemBought:{type:Number,default:0},chestBought:{type:Number,default:0},boostTimeBought:{type:Number,default:0},percentBought:{type:Number,default:0}}},{minimize:!1}),ce=s.models?.Shop||s.model("Shop",tr),ar=a=>ce.create({shopType:a}),nr=async a=>{const e=await ce.findOne({shopType:a}).lean();return e||f(await ar(a))},rr=(a,e)=>ce.findOneAndUpdate(a,e,{upsert:!0,returnDocument:"after"}).lean();class sr extends er{constructor(){super(3600)}normalizeKey(e){return e}getKey({shopType:e}){return e}fetchFromDb(e){return nr(e)}updateInDb(e,t){return rr(e,t)}}const ir=new sr,ur=new s.Schema({warnedUserId:{type:String,required:!0,index:!0},authorId:String,date:{type:Date,default:Date.now()},reason:{type:String,default:null}}),te=s.models?.Warn||s.model("Warn",ur),cr=a=>te.countDocuments(a),dr=a=>te.create({...a}),lr=a=>te.findByIdAndDelete(a).lean();class or extends ${getUserWarns(e){return this.getMany({warnedUserId:e})}getUserWarnCount(e){return cr({warnedUserId:e})}async createWarn(e){await dr(e)}async deleteWarn(e){const t=await lr(e);return t&&this.invalidate(this.getKey(t)),t}}const pr=a=>te.find(a).lean();class yr extends or{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 pr(e)}updateInDb(){throw new Error("Method not implemented.")}}const fr=new yr,mr=a=>{s.connect(a)};class hr extends s.Types.ObjectId{}d.BackgroundShopItem=De,d.BoostXpShopItem=Oe,d.BottleShopItem=Ae,d.COOLDOWN_COMMANDS=Ze,d.ChestShopItem=Te,d.EquipmentShopItem=Be,d.ObjectId=hr,d.ObjectShopItem=ve,d.QUEST_MIDDLEWARE_EVENT_NAME=b,d.RepairShopItem=Me,d.StoreShopItem=ke,d.TitleShopItem=qe,d.banService=xn,d.connectToServices=mr,d.emitQuestMiddlewareEvent=g,d.entityService=p,d.invitationService=Wn,d.ornamentService=S,d.panoplyService=E,d.recipeService=An,d.registerQuestMiddlewareEvents=xe,d.reminderService=Ee,d.settingsService=Zn,d.shopService=ir,d.userCooldownService=Lt,d.userDailyReportService=Da,d.userEncyclopediaService=L,d.userGamesService=Ma,d.userInventoryService=h,d.userMetaService=U,d.userOrnamentService=N,d.userQuestService=se,d.userRankService=xa,d.userService=Ie,d.userSettingsService=ne,d.userShopService=Pa,d.userStatsCasinoService=Xa,d.userStatsEconomyService=Ue,d.userStatsEngagementService=ie,d.userStatsFlagsService=cn,d.userStatsFrequencyService=fn,d.userStatsInventoryService=bn,d.warnService=fr,Object.defineProperty(d,Symbol.toStringTag,{value:"Module"})}));
|
|
1
|
+
(function(c,s){typeof exports=="object"&&typeof module<"u"?s(exports,require("mongoose"),require("@opfr/definitions"),require("node-cache"),require("events"),require("@opfr/utils-lang")):typeof define=="function"&&define.amd?define(["exports","mongoose","@opfr/definitions","node-cache","events","@opfr/utils-lang"],s):(c=typeof globalThis<"u"?globalThis:c||self,s(c.services={},c.mongoose,c["@opfr/definitions"],c["node-cache"],c.events,c["@opfr/utils-lang"]))})(this,(function(c,s,p,Ue,Ee,d){"use strict";function De(a){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(a){for(const t in a)if(t!=="default"){const n=Object.getOwnPropertyDescriptor(a,t);Object.defineProperty(e,t,n.get?n:{enumerable:!0,get:()=>a[t]})}}return e.default=a,Object.freeze(e)}const ue=De(Ee),N="___ALL_ENTITIES___";class f{cache;constructor(e){this.cache=new Ue({stdTTL:e,checkperiod:e*.2,useClones:!1})}async get(e,t){const n=this.normalizeKey(e),r=this.cache.get(n);if(r)return r;const i=await this.fetchFromDb(e,t??{});return i&&this.cache.set(n,i),i}async update(e,t,n){const r=await this.updateInDb(e,t,n);if(r){const i=this.getKey(r);this.cache.del(N),this.cache.set(this.normalizeKey(i),r)}return r}invalidate(e){this.cache.del(N),e&&this.cache.del(this.normalizeKey(e))}clearAll(){this.cache.flushAll()}}class w extends f{async getAll(){const e=this.cache.get(N);if(e)return e;const t=await this.fetchManyFromDb({},{});return this.cache.set(N,t),t.forEach(n=>{this.cache.set(this.normalizeKey(this.getKey(n)),n)}),t}async getMany(e,t={}){const n=await this.fetchManyFromDb(e,t);return n.forEach(r=>{this.cache.set(this.normalizeKey(this.getKey(r)),r)}),n}}const ce=new ue.EventEmitter,h=(a,e,t)=>{ce.emit(a,e,t)},Te=a=>{for(const[e,t]of Object.entries(a))ce.on(e,(n,r)=>{t(n,r)})},S={USER:"middleware/quest/USER",USER_INVENTORY:"middleware/quest/USER_INVENTORY",USER_META:"middleware/quest/USER_META",USER_ORNAMENT:"middleware/quest/USER_ORNAMENT",USER_QUEST:"middleware/quest/USER_QUEST",USER_STATS_CASINO:"middleware/quest/USER_STATS_CASINO",USER_STATS_ECONOMY:"middleware/quest/USER_STATS_ECONOMY",USER_STATS_ENGAGEMENT:"middleware/quest/USER_STATS_ENGAGEMENT",USER_STATS_FLAGS:"middleware/quest/USER_STATS_FLAGS",USER_STATS_FREQUENCY:"middleware/quest/USER_STATS_FREQUENCY",USER_STATS_INVENTORY:"middleware/quest/USER_STATS_INVENTORY"},de=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,ref:"User",index:!0},questId:{type:String,required:!0,index:!0},status:{type:String,default:p.QuestStatus.IN_PROGRESS,index:1},lastCompletionDate:Date,streak:Number},{minimize:!1});de.post("findOneAndUpdate",function(a){a&&h(S.USER_QUEST,a.user._id,a)});const v=s.models?.UserQuest||s.model("UserQuest",de),Oe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},raid:{classic:{type:Date,default:new Date(0)},special:{type:Date,default:new Date(0)}},lockUserCommand:{type:Date,default:new Date(0)},commands:{work:{type:Date,default:new Date(0)},dice:{type:Date,default:new Date(0)},doubleOrQuit:{type:Date,default:new Date(0)},priceIsRight:{type:Date,default:new Date(0)},blackJack:{type:Date,default:new Date(0)},rps:{type:Date,default:new Date(0)}}}),F=s.models?.UserCooldown||s.model("UserCooldown",Oe),Ie=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},xpYesterday:{type:Number,default:0},berryYesterday:{type:Number,default:0},previousOrnament:{unlockedBadges:{type:[String],default:[]},unlockedTitles:{type:[String],default:[]},unlockedBackgrounds:{type:[String],default:[]}},previousCompletedQuest:{type:[String],default:[]},previousMessageSent:{type:Number,default:0}}),j=s.models?.UserDailyReport||s.model("UserDailyReport",Ie),ve=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},encyclopedia:{type:[String],default:[]}}),H=s.models?.UserEncyclopedia||s.model("UserEncyclopedia",ve),Me=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User",index:1},guess:{type:{tries:Number,amount:Number,numberToGuess:Number,lastGuess:Number},default:null}}),K=s.models?.UserGames||s.model("UserGames",Me),le=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},equippedItems:{type:Object,default:{}},equipmentSave:{type:[Object],default:[]},equipmentList:{type:[{entityId:String,seed:Number}],default:[]},itemList:{type:Map,of:Number,default:{}},recipes:{type:[String],default:[]}},{minimize:!1});le.post("findOneAndUpdate",function(a){a&&h(S.USER_INVENTORY,a.user._id,a)});const P=s.models?.UserInventory||s.model("UserInventory",le),Ae=new ue.EventEmitter,ke=(a,e)=>{Ae.emit(a,e)},M={multiplier:{type:Number,default:0},origin:String,expireAt:{type:Date,default:null},startAt:{type:Date,default:null}},oe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},premium:{type:Date,default:null},booster:{type:Boolean,default:!1},berry:{type:Number,default:1e3,index:-1},xp:{lastMessageWithXp:{type:Date,default:new Date},voice:{lastConnection:{type:Date,default:new Date},minutesInVoiceToday:{type:Number,default:0}},amount:{type:Number,default:0,index:-1},boost:{type:Date,default:null}},buffs:{cooldown:{casino:{type:[M],default:[]},work:{type:[M],default:[]}},berry:{work:{type:[M],default:[]},global:{type:[M],default:[]}},drop:{work:{type:[M],default:[]}},xp:{global:{type:[M],default:[]}}},hp:{type:Number,default:100},energyMax:{type:Number,default:10},energy:{type:Number,default:10},workUnluckyStreak:{type:Number,default:0},characteristics:{vitality:{type:Number,default:0},strength:{type:Number,default:0},agility:{type:Number,default:0},chance:{type:Number,default:0},intelligence:{type:Number,default:0},wisdom:{type:Number,default:0}},scrolls:{vitality:{type:Number,default:0},strength:{type:Number,default:0},agility:{type:Number,default:0},chance:{type:Number,default:0},intelligence:{type:Number,default:0},wisdom:{type:Number,default:0}}});oe.post("findOneAndUpdate",async function(a){a&&(h(S.USER_META,a.user._id,a),a.hp<=0&&ke("death",a.user._id))});const D=s.models?.UserMeta||s.model("UserMeta",oe),pe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},unlockedFactionBadges:{type:[String],default:[]},unlockedBadges:{type:[String],default:[]},unlockedTitles:{type:[String],default:[]},selectedTitle:{type:String,default:null},unlockedBackgrounds:{type:[String],default:["default"]},selectedBackground:{type:String,default:"default"},unlockedProfileAssets:{type:[String],default:[]},unlockedBags:{type:[String],default:["default"]},selectedBag:{type:String,default:"default"}});pe.post("findOneAndUpdate",function(a){a&&h(S.USER_ORNAMENT,a.user._id,a)});const Q=s.models?.UserOrnament||s.model("UserOrnament",pe),qe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},sort:{inventory:{type:String,default:"alpha"}},sendDailyReport:{type:Boolean,default:!1,index:!0},sendDailyQuest:{type:Boolean,default:!1},reminder:{raid:{classic:{type:Boolean,default:!1},special:{type:Boolean,default:!1}},commands:{work:{type:Boolean,default:!1},dice:{type:Boolean,default:!1},qod:{type:Boolean,default:!1},blackjack:{type:Boolean,default:!1},guess:{type:Boolean,default:!1},rps:{type:Boolean,default:!1}}}}),B=s.models?.UserSettings||s.model("UserSettings",qe),ye=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},totalBet:{type:Number,default:0},lastGames:{type:[{gameType:String,endState:Number}],default:[]},drawCount:{type:Number,default:0},bet666:{count:{type:Number,default:0},last:{type:Date,default:0}},dice:{doubleSixCount:{type:Number,default:0},drawWithDoubleSixCount:{type:Number,default:0}},blackJack:{blackJackCount:{type:Number,default:0}},rps:{lastRpsPlayed:{type:String,default:"paper"},count:{type:Number,default:-1}},doubleOrQuit:{sevenDoubleInARowCount:{type:Number,default:0}},priceIsRight:{guessInOneTryCount:{type:Number,default:0}}});ye.post("findOneAndUpdate",function(a){a&&h(S.USER_STATS_CASINO,a.user._id,a)});const A=s.models?.UserStatsCasino||s.model("UserStatsCasino",ye),fe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},workCount:{type:Number,default:0},totalSpentInShop:{type:Number,default:0}});fe.post("findOneAndUpdate",function(a){a&&h(S.USER_STATS_ECONOMY,a.user._id,a)});const z=s.models?.UserStatsEconomy||s.model("UserStatsEconomy",fe),me=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},messageSent:{type:Number,default:0},totalMinutesInVoice:{type:Number,default:0},randomMessageClaimed:{type:Number,default:0},writeDifferentChatIds:{type:[String],default:[]}});me.post("findOneAndUpdate",function(a){a&&h(S.USER_STATS_ENGAGEMENT,a.user._id,a)});const W=s.models?.UserStatsEngagement||s.model("UserStatsEngagement",me),he=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},tagEveryone:{type:Boolean,default:!1},botPingCount:{type:Number,default:0},reportedSomeone:{type:Boolean,default:!1},hasCelebrateBirthday:{type:Boolean,default:!1},gamblingFlags:{betMin:{type:Boolean,default:!1},bet10M:{type:Boolean,default:!1},lose10M:{type:Boolean,default:!1},winBet10M:{type:Boolean,default:!1},loseEverything:{type:Boolean,default:!1}}});he.post("findOneAndUpdate",function(a){a&&h(S.USER_STATS_FLAGS,a.user._id,a)});const G=s.models?.UserStatsFlags||s.model("UserStatsFlags",he),Se=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},edito:{readToday:{type:Number,default:0,index:!0},lastTimeRead:{type:Date,default:new Date,index:!0}}});Se.post("findOneAndUpdate",function(a){a&&h(S.USER_STATS_FREQUENCY,a.user._id,a)});const T=s.models?.UserStatsFrequency||s.model("UserStatsFrequency",Se),we=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},bottle:{totalUsed:{type:Number,default:0},usedToday:{type:Number,default:0},lastUsed:{type:Date,default:new Date}},chest:{totalOpened:{type:Number,default:0}},alcohols:{wines:{type:Number,default:0},rhums:{type:Number,default:0},beers:{type:Number,default:0},totalConsumed:{type:Number,default:0}},crafts:{cookedMeal:{type:Number,default:0},scrolls:{type:Number,default:0},totalCrafted:{type:Number,default:0}}});we.post("findOneAndUpdate",function(a){a&&h(S.USER_STATS_INVENTORY,a.user._id,a)});const k=s.models?.UserStatsInventory||s.model("UserStatsInventory",we),Z=new s.Schema({discordId:{type:String,required:!0,unique:!0},scam:{type:Boolean,default:!1},birthday:{type:Date,default:null,index:1},faction:{type:String,default:p.DEFAULT_FACTION,index:1},canChangeFaction:{type:Boolean,default:!1},canChooseFaction:{type:Boolean,default:!1}});Z.post("findOneAndUpdate",function(a){a&&h(S.USER,a._id,a)}),Z.post("deleteOne",async function(){const a=this.getQuery()._id;await F.deleteOne({user:a}),await j.deleteOne({user:a}),await H.deleteOne({user:a}),await K.deleteOne({user:a}),await P.deleteOne({user:a}),await D.deleteOne({user:a}),await Q.deleteOne({user:a}),await v.deleteMany({user:a}),await B.deleteOne({user:a}),await A.deleteOne({user:a}),await z.deleteOne({user:a}),await W.deleteOne({user:a}),await G.deleteOne({user:a}),await T.deleteOne({user:a}),await k.deleteOne({user:a})});const g=s.models?.User||s.model("User",Z);class Re extends w{getByObjectId(e){return this.update({_id:e},{})}getNextBirthdays(){const e=new Date,t=e.getFullYear();return g.aggregate([{$match:{birthday:{$ne:null}}},{$set:{birthdayThisYear:{$dateFromParts:{year:t,month:{$month:"$birthday"},day:{$dayOfMonth:"$birthday"}}}}},{$set:{nextBirthday:{$cond:[{$lt:["$birthdayThisYear",e]},{$dateFromParts:{year:{$add:[t,1]},month:{$month:"$birthday"},day:{$dayOfMonth:"$birthday"}}},"$birthdayThisYear"]}}},{$sort:{nextBirthday:1}},{$limit:10},{$project:{_id:0,discordId:1,birthday:1,nextBirthday:1}}])}getFactionRanking(e){return g.aggregate([{$match:{faction:e}},{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$sort:{"meta.xp.amount":-1}},{$limit:10},{$project:{_id:1,discordId:1,"meta.xp.amount":1}}])}getGlobalRanking(){return g.aggregate([{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$sort:{"meta.xp.amount":-1}},{$limit:10},{$project:{_id:1,discordId:1,"meta.xp.amount":1}}])}getBerryRanking(){return g.aggregate([{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$sort:{"meta.berry":-1}},{$limit:10},{$project:{_id:1,discordId:1,"meta.berry":1}}])}getQuestRanking(){return v.aggregate([{$match:{status:p.QuestStatus.COMPLETED}},{$group:{_id:"$user",questCount:{$sum:1}}},{$setWindowFields:{sortBy:{questCount:-1},output:{rank:{$rank:{}}}}},{$sort:{rank:1}},{$limit:10},{$lookup:{from:"users",localField:"_id",foreignField:"_id",as:"user"}},{$unwind:"$user"},{$project:{_id:0,discordId:"$user.discordId",questCount:1,rank:1}}])}getTodayAllBirthday(){const e=new Date;return g.aggregate([{$match:{birthday:{$ne:null}}},{$addFields:{birthMonth:{$month:"$birthday"},birthDay:{$dayOfMonth:"$birthday"}}},{$addFields:{currentMonth:{$month:e},currentDay:{$dayOfMonth:e}}},{$match:{$expr:{$and:[{$eq:["$birthMonth","$currentMonth"]},{$eq:["$birthDay","$currentDay"]}]}}}])}async canChooseFaction(e,t){typeof e=="string"?await this.update({discordId:e},{$set:{canChooseFaction:t}}):await this.update({_id:e},{$set:{canChooseFaction:t}})}async canChangeFaction(e,t){typeof e=="string"?await this.update({discordId:e},{$set:{canChangeFaction:t}}):await this.update({_id:e},{$set:{canChangeFaction:t}})}async setBirthday(e,t){await this.update({discordId:e},{$set:{birthday:t}})}async updateFaction(e,t){await this.update({discordId:e},{$set:{faction:t}})}async updateScam(e,t){await this.update({discordId:e},{$set:{scam:t}})}}const Be=(a,e)=>g.find(a,{},e).lean(),y=a=>a.toObject({flattenMaps:!0,flattenObjectIds:!1}),_e=a=>g.create({discordId:a});async function Ce(a,{upsert:e=!0,...t}){const n=await g.findOne({discordId:a},{},t).lean();return!n&&e?y(await _e(a)):n}const xe=(a,e)=>g.findOneAndUpdate(a,e,{upsert:!0,returnDocument:"after"}).lean();class Ne extends Re{constructor(){super(3600)}normalizeKey(e){return e}getKey({discordId:e}){return e}fetchFromDb(e,t){return Ce(e,t)}fetchManyFromDb(e,t){return Be(e,t)}updateInDb(e,t){return xe(e,t)}}const ge=new Ne,Fe=["work",...p.GAME_TYPES],je=new s.Schema({user:{type:s.Schema.Types.ObjectId,ref:"User",required:!0,index:!0},date:{type:Date,index:-1,required:!0},type:{type:String,required:!0}},{minimize:!1}),_=s.models?.Reminder||s.model("Reminder",je),He=async a=>{await _.deleteMany(a)},Ke=async(a,e)=>{await _.deleteOne({user:a,type:e})};class Pe extends w{getAllPassedReminder(){return this.getMany({date:{$lte:new Date}})}async addReminder(e,t,n){await this.update({user:e,type:t},{$set:{date:n}},{upsert:!0})}async updateReminderDate(e,t,n){await this.update({user:e,type:t},[{$set:{date:{$add:["$date",n]}}}])}async removeReminder(e,t){await Ke(e,t),this.invalidate({user:e,type:t})}async deleteSelectedReminders(e){const t=e.map(n=>n._id);await He({_id:{$in:t}}),e.forEach(n=>{this.invalidate({user:n.user,type:n.type})})}}function Qe(a,e){return _.find(a,{},e).lean()}async function ze(a){const e=await _.findOne(a).lean();return e||null}async function We(a,e,t){return _.findOneAndUpdate(a,e,{...t,returnDocument:"after"}).lean()}class Ge extends Pe{constructor(){super(300)}getKey(e){return{user:e.user,type:e.type}}normalizeKey({user:e,type:t}){return`${e.toString()}/${t}`}fetchFromDb(e){return ze(e)}fetchManyFromDb(e,t){return Qe(e,t)}updateInDb(e,t,n={upsert:!1}){return We(e,t,n)}}const be=new Ge,Ye=new s.Schema({panoplyId:{unique:!0,index:1,required:!0,type:String},name:{required:!0,type:String},equipments:{required:!0,type:[{type:s.Schema.Types.ObjectId,ref:"Entities"}]},fullBonusStr:{type:String},halfBonusStr:{type:String},fullBonus:s.Schema.Types.Mixed,halfBonus:s.Schema.Types.Mixed},{minimize:!1}),C=s.models?.Panoplies||s.model("Panoplies",Ye),Ve=(a,e)=>C.find(a,{},e).lean(),Xe=async(a,e)=>C.find(a,{},e).populate("equipments");async function Le(a){const e=await C.findOne({panoplyId:a}).lean();return e||null}const Je=async a=>C.findOne(a).populate("equipments");class Ze extends w{getAllPopulated(){return Xe({},{})}getPopulated(e){return Je({panoplyId:e})}hasPanoply(e,t){const n=d.filterNullAndUndefined(Object.values(e)),r=t.equipments.filter(i=>n.find(u=>u.entityId===i.entityId)).length;if(r===t.equipments.length)return t.fullBonus;if(r>=t.equipments.length/2)return t.halfBonus}async getPanoplyBonus(e){const t=[],n=await this.getAllPopulated();for(const r of n){const i=d.filterNullAndUndefined(Object.values(e)),u=r.equipments.filter(l=>i.find(({entityId:o})=>o===l.entityId));u.length===r.equipments.length?t.push([r,"full"]):u.length>=r.equipments.length/2?t.push([r,"half"]):u.length>=1&&t.push([r,null])}return t}}const et=async(a,e)=>C.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class tt extends Ze{constructor(){super(3600)}normalizeKey(e){return e}getKey({panoplyId:e}){return e}updateInDb(e,t){return et(e,t)}fetchFromDb(e){return Le(e)}fetchManyFromDb(e,t){return Ve(e,t)}}const O=new tt,at=new s.Schema({type:{type:String,enum:p.EFFECT_KEYS,required:!0},params:{type:s.Schema.Types.Mixed}},{_id:!1}),nt=new s.Schema({entityId:{unique:!0,required:!0,type:String}},{minimize:!1,discriminatorKey:"type"}),rt=new s.Schema({category:{required:!0,type:String},subtype:{type:String},rankId:String,effects:{type:[at],default:[]},usage:{_id:!1,type:{mode:String,craft:Boolean},default:void 0}}),st=new s.Schema({category:{required:!0,type:String},characteristics:{_id:!1,type:Object},panoply:String}),q=s.models?.Entities||s.model("Entities",nt),it=q.discriminator("item",rt);q.discriminator("equipment",st);const ut=async(a,e)=>q.find(a,{},e).lean(),ct=async(a,e)=>it.find(a,{},e).lean();class dt extends w{isEntity(e){return!!e&&"entityId"in e}isItem(e){return e.type==="item"}isEquipment(e){return e.type==="equipment"}async isEntityId(e,t=()=>!0){return(await this.getAll()).filter(t).map(({entityId:r})=>r).includes(e)}async idArrayToEntities(e){return(await this.getAll()).filter(t=>e.includes(t.entityId))}recordToEntities(e){return this.idArrayToEntities(Object.keys(e))}async recordToEntityTuple(e){const t=await this.getAll();return d.recordToArray(e).reduce((n,[r,i])=>{const u=t.find(({entityId:l})=>l===r);return u&&n.push([u,i]),n},[])}async getAllEntitiesLimit(){const e=await this.getAll();return d.arrayToRecord(e.map(t=>[t.entityId,t.shop?.limit??0]))}async getAllEntitiesBy(e){return(await this.getAll()).filter(e)}async getAllItemsBy(e){return(await ct({},{})).filter(e)}async fromDBToEquipableEquipment(e){const n=(await this.getAll()).filter(r=>this.isEquipment(r)).find(({entityId:r})=>r===e.entityId);if(!n)throw new Error(`cannot find any equipment: ${e.entityId}`);return this.seedEquipment(n,e.seed)}async getUserEquipmentsCharacteristics(e){let t={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};const n=await O.getAllPopulated();for(const r of p.EQUIPMENT_SLOT){const i=e[r];i&&(t=d.mergeObjects(t,(await this.fromDBToEquipableEquipment(i)).characteristics,(u,l)=>u+l))}for(const r of n){const i=O.hasPanoply(e,r);i&&!("target"in i)&&(t=d.mergeObjects(t,i,(u,l)=>u+l))}return t}filterUsableEntities(e){return e.filter(t=>this.isConsumableItem(t)&&t.usage?.mode)}hasUsableEntities(e){return!!e.find(t=>this.isConsumableItem(t)&&t.usage?.mode)}isChestItem(e){return this.isItem(e)&&e.category==="chest"}isConsumableItem(e){return this.isItem(e)&&e.category==="consumable"}isResourceItem(e){return this.isItem(e)&&e.category==="resource"}isSameEquipment(e,t){return e.entityId===t.entityId&&e.seed===t.seed}seedEquipment(e,t){const n=d.seededRandom(t),r=d.sortBy(d.recordToArray(e.characteristics),([i])=>i);return{...e,seed:t,characteristics:Object.fromEntries(r.map(([i,u])=>[i,Array.isArray(u)?d.randomBetween(u[0],u[1]+1,n):u]))}}isEquipped(e,t){return!!Object.values(e).find(n=>n&&this.isSameEquipment(n,t))}}const lt=async a=>await q.create({...a});async function ot(a){const e=await q.findOne({entityId:a}).lean();return e||null}const pt=(a,e)=>q.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class yt extends dt{constructor(){super(3600)}createInDb(e){return lt(e)}updateInDb(e,t){return pt(e,t)}fetchFromDb(e){return ot(e)}fetchManyFromDb(e,t){return ut(e,t)}normalizeKey(e){return e}getKey(e){return e.entityId}}const m=new yt;class ft extends f{hasAlreadyFoundEntity(e,t){return e.encyclopedia.includes(t)}async addEntities(e,t){await this.update(e,{$addToSet:{encyclopedia:{$each:t}}})}}const mt=async a=>await H.create({user:a});async function ht(a){const e=await H.findOne({user:a}).lean();return e||y(await mt(a))}const St=(a,e)=>H.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class wt extends ft{constructor(){super(300)}fetchFromDb(e){return ht(e)}getKey({user:e}){return e}normalizeKey(e){return e.toString()}updateInDb(e,t){return St(e,t)}}const Y=new wt;class gt extends f{async getUserEquipmentsCharacteristics(e){let t={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};for(const n of p.EQUIPMENT_SLOT){const r=e.equippedItems?.[n];if(!r)continue;const i=await m.fromDBToEquipableEquipment(r);t=d.mergeObjects(t,i.characteristics,(u,l)=>u+l)}return t}async hasInventoryRequirements(e,t){const n=await this.get(e);return d.recordToArray(t).reduce((r,[i,u])=>r&&(n.itemList[i]??0)>=(u??0),!0)}async hasEnoughEntity(e,t,n){return((await this.get(e)).itemList[n]??0)>=t}async getItemList(e){return(await this.get(e)).itemList}async calcMinStreakForWorkLoot(e){const t=await this.get(e),n=(await O.getPanoplyBonus(t.equippedItems)).find(([r,i])=>r.panoplyId==="marine"&&i!==null);return n&&n[1]==="full"?10:n&&n[1]==="half"?20:1/0}async hasRevolutionaryBuff(e){const t=await this.get(e);return(await O.getPanoplyBonus(t.equippedItems)).find(([r,i])=>r.panoplyId==="revolutionary"&&i!==null)?.[1]??null}async addItem(e,t,n){await this.update(e,{$inc:{[`itemList.${t}`]:n}}),await Y.addEntities(e,[t])}async addItems(e,t){await this.update(e,{$inc:Object.fromEntries(Object.entries(t).filter(([,n])=>(n??0)>0).map(([n,r])=>[`itemList.${n}`,r]))}),await Y.addEntities(e,d.recordToArray(t).filter(([,n])=>n>0).map(([n])=>n))}async removeItem(e,t,n){n!==0&&await this.update(e,[{$set:{[`itemList.${t}`]:{$max:[{$add:[`$itemList.${t}`,-n]},0]}}}])}async removeEquipment(e,t,n){await this.update(e,{$pull:{equipmentList:{entityId:t,seed:n}}})}async removeAllItem(e,t){await this.update(e,{$set:{[`itemList.${t}`]:0}})}async addEquipments(e,t){await this.update(e,{$push:{equipmentList:{$each:t}}}),await Y.addEntities(e,t.map(n=>n.entityId))}async saveEquipments(e){await this.update(e,[{$set:{equipmentSave:{$push:["$equipmentSave","$equippedItems"]}}}])}async changeEquippedEquipment(e,t){const n=await this.get(e);n?.equipmentSave[t]&&await this.equip(e,n.equipmentSave[t])}async equip(e,t){const n=await U.getMaxHp(e),r=Object.fromEntries(d.recordToArray(t).map(([i,u])=>[`equippedItems.${i}`,u]));await this.update(e,{$set:r}),await U.updateHp(e,n)}async unequip(e,t){const n=await U.getMaxHp(e);await this.update(e,{$set:{[`equippedItems.${t}`]:null}}),await U.updateHp(e,n)}async craftItem(e,t,n,r){for(const{entityId:l,size:o}of t.entities)await this.removeItem(e,l,o*n);const{entityId:i,size:u}=t.result;await m.isEntityId(i,m.isEquipment)?await this.addEquipments(e,[{entityId:i,seed:r}]):await m.isEntityId(i,m.isItem)&&await this.addItem(e,i,u*n)}async dismantleEntity(e,t,n,r,i){m.isEquipment(t)?await this.removeEquipment(e,t.entityId,i):m.isItem(t)&&await this.removeItem(e,t.entityId,r);for(const{entityId:u,quantity:l}of n)await m.isEntityId(u,m.isItem)&&await this.addItem(e,u,r*l);await this.removeItem(e,"tools",1)}async enchantItem(e,t,n,r,i){await this.removeItem(e,t,i*4),await this.removeItem(e,r,i),await this.addItem(e,n,i)}async unlockRecipe(e,t){await this.update(e,{$addToSet:{recipes:t}})}}const bt=a=>P.create({user:a});async function $t(a){const e=await P.findOne({user:a}).lean();return e||y(await bt(a))}const Ut=(a,e)=>P.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Et extends gt{constructor(){super(300)}fetchFromDb(e){return $t(e)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}updateInDb(e,t){return Ut(e,t)}}const $=new Et;class Dt extends w{async getTotalCharacteristics(e){const{characteristics:t,scrolls:n}=await this.get(e);return d.arrayToRecord(p.CHARACTERISTICS.map(r=>[r,p.getComputedCharacteristicValue(t[r])+n[r]]))}async isCooldownForXpPassed(e){const t=await this.get(e);return Date.now()-t.xp.lastMessageWithXp.getTime()>60*1e3}async getAllWithExpiredBuffs(){const e=new Date;return this.getMany({$or:[{"xp.boost":{$lt:e}},{"buffs.cooldown.casino":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.cooldown.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.berry.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.berry.global":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.drop.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.xp.global":{$elemMatch:{expireAt:{$lt:e}}}}]})}async calcXpBoost(e){const t=await this.get(e),{boost:n}=t.xp,r=n!==null&&Date.now()<n.getTime()?.2:0,i=Math.max(t.premium?.5:0,t.booster?.25:0);return r+i+t.buffs.xp.global.reduce((u,{expireAt:l,startAt:o,multiplier:E})=>o&&o>new Date||l&&d.hasExpire(l)?u:u+E,0)}calcMessageXp(e){const t=e.trim().length,n=2;return t<10?10*n:t>300?300*n:t*n}async getXpDeathPenalties(e){const t=await this.get(e),n=p.getCurrentLevel(t.xp.amount);return n<=10?5e3:n<=20?1e4:n<=30?2e4:n<=40?3e4:n<=50?5e4:n<=60?75e3:n<=70?15e4:n<=80?25e4:n<=90?4e5:n<=100?75e4:14e6}async calcXp(e,t,n){return t*=1+await this.calcXpBoost(e),Math.ceil(t*n)}async calcBerry(e,t,n){if(t<=0)return t;const r=n?1:await this.calcBuffMultiplier(e,"berry","global");return Math.ceil(t*(r||1))}async calcBuffMultiplier(e,t,n){return(await this.get(e)).buffs[t][n].reduce((u,{expireAt:l,startAt:o,multiplier:E})=>u+(new Date>=(o??new Date)&&(!l||!d.hasExpire(l))?E:0),1)}async getMaxHp(e){const t=await $.get(e),{vitality:n}=await this.getTotalCharacteristics(e),r=await $.getUserEquipmentsCharacteristics(t);return(n+r.vitality)*p.HP_PER_VITALITY+p.DEFAULT_MAX_HP}async getHpRatio(e){const t=await this.get(e),n=await this.getMaxHp(e);return Math.min(t.hp/n,1)}async hasCharacteristicRequirement(e,t){const n=await $.get(e),r=await $.getUserEquipmentsCharacteristics(n),i=d.mergeObjects(await this.getTotalCharacteristics(e),r,(u,l)=>u+l);if("sum"in t){let u=0;for(const l of t.characteristics)u+=i[l]??0;return u>=t.sum}else{for(const u of Object.keys(t))if(i[u]<(t[u]??0))return!1;return!0}}async hasMalusBuff(e){const t=await this.get(e);for(const n of Object.values(t.buffs))for(const r of Object.values(n))for(const{multiplier:i,startAt:u,expireAt:l}of r)if(i<0&&(!l||!d.hasExpire(l))&&(u??new Date)<=new Date)return!0;return!1}async addBerry(e,t){await this.update(e,[{$set:{berry:{$max:[{$add:["$berry",t]},0]}}}])}async addXp(e,t){await this.update(e,{$inc:{"xp.amount":t}})}async updatePremium(e,t){await this.update(e,{$set:{premium:t}})}async updateBooster(e,t){await this.update(e,{$set:{booster:t}})}async updateBoost(e,t){const{xp:{boost:n}}=await this.update(e,[{$set:{"xp.boost":{$cond:{if:{$or:[{$not:"$xp.boost"},{$lt:["$xp.boost",new Date]}]},then:{$add:[new Date,t]},else:{$add:["$xp.boost",t]}}}}}]);return n}async updateBuff(e,t){if(Array.isArray(t)){for(const r of t)await this.updateBuff(e,r);return}const n=p.transformToDBBuff(t);await this.update(e,[{$set:{[`buffs.${t.target}`]:{$map:{input:`$buffs.${t.target}`,as:"buff",in:{$cond:{if:{$eq:[{$substr:["$$buff.origin",0,{$indexOfBytes:["$$buff.origin","/"]}]},t.origin.split("/")[0]]},then:{multiplier:t.multiplier,origin:t.origin,expireAt:n.expireAt?{$cond:{if:{$lt:["$$buff.expireAt",new Date]},then:n.expireAt,else:{$add:["$$buff.expireAt",(t.endIn??0)*60*60*1e3]}}}:null,startAt:{$cond:{if:{$gte:["$$buff.startAt",new Date]},then:"$$buff.startAt",else:{$add:[new Date,(t.startIn??0)*60*60*1e3]}}}},else:"$$buff"}}}}}},{$set:{[`buffs.${t.target}`]:{$cond:{if:{$in:[t.origin.split("/")[0],{$map:{input:`$buffs.${t.target}`,as:"buff",in:{$substr:["$$buff.origin",0,{$indexOfBytes:["$$buff.origin","/"]}]}}}]},then:`$buffs.${t.target}`,else:{$concatArrays:[`$buffs.${t.target}`,[{...n}]]}}}}}])}async removeBuff(e,t){await this.update(e,{$pull:{[`buffs.${t.target}`]:{origin:t.origin}}})}async updatePanoplyBuff(e,t,n,r){const i=await m.fromDBToEquipableEquipment(t),u=d.filterNullAndUndefined(Object.values(n)),o=(await O.getAllPopulated()).find(I=>I.panoplyId===i.panoply);if(!o)return;const E=o.equipments.filter(I=>(u.find(ie=>I.entityId===ie.entityId)||!r&&i.entityId===I.entityId)&&(r?i.entityId!==I.entityId:!0)).length,x=E===o.equipments.length?o.fullBonus:E>=o.equipments.length/2?o.halfBonus:void 0;o.halfBonus&&"target"in o.halfBonus&&await this.removeBuff(e,o.halfBonus),o.fullBonus&&"target"in o.fullBonus&&await this.removeBuff(e,o.fullBonus),x&&"target"in x&&await this.updateBuff(e,x)}async gainHp(e,t){const n=await this.get(e),i=await this.getMaxHp(e)-n.hp;await this.update(e,{$set:{hp:n.hp+Math.floor(Math.min(t,i))}})}async loseHp(e,t){await this.update(e,[{$set:{hp:{$max:[{$add:["$hp",-t]},0]}}}])}async updateHp(e,t){const n=await this.getMaxHp(e);await this.update(e,[{$set:{hp:{$round:[{$multiply:[{$divide:["$hp",t]},n]},0]}}}])}async addCharacteristics(e,t){const n=await this.getMaxHp(e),r=Object.fromEntries(Object.entries(t).filter(([,i])=>i!==0).map(([i,u])=>[`characteristics.${i}`,u]));await this.update(e,{$inc:r}),await this.updateHp(e,n)}async addScrollCharacteristic(e,t){const n=await this.getMaxHp(e),r=Object.fromEntries(Object.entries(t).filter(([,i])=>i!==0).map(([i,u])=>[`scrolls.${i}`,u]));await this.update(e,{$inc:r}),await this.updateHp(e,n)}async resetCharacteristics(e){const t=await this.getMaxHp(e),n={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};await this.update(e,{$set:{characteristics:n},$inc:{berry:-1e8}}),await this.updateHp(e,t)}async updateLastMessageWithXpDate(e){await this.update(e,{$set:{"xp.lastMessageWithXp":new Date}})}async resetMinutesInVoiceToday(e){await this.update(e,{$set:{"xp.voice.minutesInVoiceToday":0}})}async addMinutesInVoiceToday(e,t){await this.update(e,{$inc:{"xp.voice.minutesInVoiceToday":t}})}async updateLastVoiceConnection(e,t){await this.update(e,{$set:{"xp.voice.lastConnection":t}})}async incrementWorkUnluckyStreak(e){await this.update(e,{$inc:{workUnluckyStreak:1}})}async resetWorkUnluckyStreak(e){await this.update(e,{$set:{workUnluckyStreak:0}})}async updateUserXp(e,t){const n=await this.calcXp(e,t,await this.getHpRatio(e));return await this.addXp(e,n),n}async updateUserBerry(e,t,n){const r=await this.calcBerry(e,t,n);return await this.addBerry(e,r),r}}const Tt=a=>D.find(a).lean(),Ot=async a=>await D.create({user:a});async function It(a){const e=await D.findOne({user:a}).lean();return e||y(await Ot(a))}const vt=(a,e)=>D.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).lean();class Mt extends Dt{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return It(e)}fetchManyFromDb(e){return Tt(e)}updateInDb(e,t){return vt(e,t)}}const U=new Mt;class At extends w{async updateSendDailyQuest(e,t){await this.update(e,{$set:{sendDailyQuest:t}})}async updateSendDailyReport(e,t){await this.update(e,{$set:{sendDailyReport:t}})}async updateInventorySort(e,t){await this.update(e,{$set:{"sort.inventory":t}})}async updateReminderSettings(e,t,n){await this.update(e,{$set:{[`reminder.${t}`]:n}})}getUsersWithDailyReportEnable(){return this.getMany({sendDailyReport:!0})}}const kt=a=>B.find(a).lean(),qt=async a=>await B.create({user:a});async function Rt(a){const e=await B.findOne({user:a}).lean();return e||y(await qt(a))}const Bt=(a,e)=>B.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).lean();class _t extends At{constructor(){super(3600)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return Rt(e)}fetchManyFromDb(e){return kt(e)}updateInDb(e,t){return Bt(e,t)}}const ee=new _t;class Ct extends f{async getCommandCooldown(e,t){return(await this.get(e)).commands[t]}async lockUserCommand(e){await this.update(e,{$set:{lockUserCommand:new Date(Date.now()+2*3600*1e3)}}),await U.gainHp(e,1)}async useCommand(e,t,n){const{reminder:r}=await ee.get(e);await this.update(e,{$set:{[`commands.${t}`]:new Date(Date.now()+n)}}),r.commands[t]&&await be.addReminder(e,`commands/${t}`,new Date(Date.now()+n))}}const xt=async a=>await F.create({user:a});async function Nt(a){const e=await F.findOne({user:a}).lean();return e||y(await xt(a))}const Ft=(a,e)=>F.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).lean();class jt extends Ct{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return Nt(e)}updateInDb(e,t){return Ft(e,t)}}const Ht=new jt;class Kt extends w{async isOrnamentIds(e,t=()=>!0){const r=(await this.getAll()).filter(t).map(({ornamentId:i})=>i);return e.every(i=>r.includes(i))}isOrnament(e){return!!e&&"ornamentId"in e}isTitle(e){return e.type==="title"}isBackground(e){return e.type==="background"}isQuestTitle(e){return this.isTitle(e)&&!("faction"in e)&&!("price"in e)}isFactionTitle(e){return this.isTitle(e)&&"faction"in e}isShopTitle(e){return this.isTitle(e)&&"price"in e}async getAllBackgrounds(){return(await this.getAll()).filter(e=>this.isBackground(e))}async getAllTitles(){return(await this.getAll()).filter(e=>this.isTitle(e))}async getAllFactionTitles(){return(await this.getAll()).filter(e=>this.isFactionTitle(e))}async getAllQuestTitles(){return(await this.getAll()).filter(e=>this.isQuestTitle(e))}async getAllShopTitles(){return(await this.getAll()).filter(e=>this.isShopTitle(e))}formatBackgroundId(e){const t=d.isString(e)?e:e.ornamentId;return t==="background_default"?"par défaut":`"${d.capitalizeAllWords(t.split("_").join(" "))}"`}async getSomeShopTitles(e){const t=await this.getAllShopTitles();return d.sortBy(d.pickNthByOdds(e,t,n=>n.ornamentId,n=>n.odd??0),n=>n.price)}async getSomeBackgrounds(e){const t=await this.getAllBackgrounds();return d.sortBy(d.pickNthByOdds(e,t,n=>n.ornamentId,n=>n.odd??0),n=>n.price??0)}pickEachRarityOrnament(e,t){if(t.length!==p.RANK_IDS_WITHOUT_BASIC.length)throw new RangeError("pickEachRarityOrnament - must give same number of odds than ranks");return d.filterNullAndUndefined(t.map((n,r)=>{const i=p.RANK_IDS_WITHOUT_BASIC[r],u=e[i];return Math.random()>n||!u||!u.length?null:d.pickFrom(u)}))}}const Pt=new s.Schema({ornamentId:{unique:!0,index:1,required:!0,type:String},type:{required:!0,type:String},rankId:{required:!0,type:String},name:{required:!0,type:String},price:Number,odd:Number,size:Number,faction:String,roleId:String,strength:Number},{minimize:!1}),te=s.models?.Ornaments||s.model("Ornaments",Pt),Qt=async(a,e)=>te.find(a,{},e).lean();async function zt(a){const e=await te.findOne({ornamentId:a}).lean();return e||null}const Wt=(a,e)=>te.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class Gt extends Kt{constructor(){super(3600)}updateInDb(e,t){return Wt(e,t)}fetchFromDb(e){return zt(e)}fetchManyFromDb(e,t){return Qt(e,t)}getKey(e){return e.ornamentId}normalizeKey(e){return e}}const b=new Gt;class Yt extends f{async unlockTitle(e,t){await b.isOrnamentIds([t],b.isTitle)&&await this.update(e,{$addToSet:{unlockedTitles:t}})}async unlockTitles(e,t){await b.isOrnamentIds(t,b.isTitle)&&await this.update(e,{$addToSet:{unlockedTitles:{$each:t}}})}async selectTitle(e,t){await this.update(e,{$set:{selectedTitle:t}})}async unlockBackground(e,t){await b.isOrnamentIds([t],b.isBackground)&&await this.update(e,{$addToSet:{unlockedBackgrounds:t}})}async unlockBackgrounds(e,t){await b.isOrnamentIds(t,b.isBackground)&&await this.update(e,{$addToSet:{unlockedBackgrounds:{$each:t}}})}async selectBackground(e,t){await this.update(e,{$set:{selectedBackground:t}})}async unlockBadge(e,t,n){t.isProgressive?await this.update(e,{$addToSet:{unlockedBadges:`${t.id}_${n}`}}):await this.update(e,{$addToSet:{unlockedBadges:t.id}})}async unlockFactionBadge(e,t){await this.update(e,{$addToSet:{unlockedFactionBadges:{$each:[`b_marine_${t}`,`b_revolutionary_${t}`,`b_pirate_${t}`]}}})}async unlockProfileAsset(e,t){await this.update(e,{$addToSet:{unlockedProfileAssets:t}})}async unlockBag(e,t){await this.update(e,{$addToSet:{unlockedBags:t}})}async selectBag(e,t){await this.update(e,{$set:{selectedBag:t}})}}const Vt=async a=>await Q.create({user:a});async function Xt(a){const e=await Q.findOne({user:a}).lean();return e||y(await Vt(a))}const Lt=async(a,e)=>Q.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Jt extends Yt{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Xt(e)}updateInDb(e,t){return Lt(e,t)}}const ae=new Jt;class Zt extends w{async getStatus(e,t){return(await this.get({user:e,questId:t})).status}async isCompleted(e,t){return await this.getStatus(e,t)==="COMPLETED"}async isStreaking(e,t){const{lastCompletionDate:n}=await this.get({user:e,questId:t});return!!n&&d.sameDay(d.yesterday(),n)}async getStreakMultiplier(e,t){const n=await this.get({user:e,questId:t});return await this.isStreaking(e,t)?1+Math.min(2,(n.streak??0)/10):1}async getCompletedCount(e){return(await this.getMany({user:e,status:p.QuestStatus.COMPLETED})).length}async completeQuest(e,t=!1){const n=d.yesterday();n.setHours(0,0,0,0);const r=new Date;return r.setHours(0,0,0,0),this.update(e,[{$set:{...t?{streak:{$cond:{if:{$and:[{$gte:["$lastCompletionDate",n]},{$lt:["$lastCompletionDate",r]}]},then:{$add:[{$ifNull:["$streak",0]},1]},else:1}}}:{},lastCompletionDate:new Date,status:p.QuestStatus.COMPLETED}}],{upsert:!1})}}function ea(a){return v.find(a).lean()}const ta=async a=>await v.create({...a});async function aa(a){const e=await v.findOne(a).lean();return e||y(await ta(a))}function na(a,e,t){return v.findOneAndUpdate(a,e,{upsert:!0,...t,returnDocument:"after"}).lean()}class ra extends Zt{constructor(){super(3600)}normalizeKey({user:e,questId:t}){return`${e.toString()}/${t}`}getKey({user:e,questId:t}){return{user:e,questId:t}}fetchFromDb(e){return aa(e)}fetchManyFromDb(e){return ea(e)}updateInDb(e,t,n){return na(e,t,n)}}const ne=new ra;class sa extends f{async randomMessageIncrement(e){await this.update(e,{$inc:{randomMessageClaimed:1}})}async addWrittenTextChannel(e,t){await this.update(e,{$addToSet:{writeDifferentChatIds:t}})}async incrementMessageSend(e){await this.update(e,{$inc:{messageSent:1}})}async addTotalMinutesInVoice(e,t){await this.update(e,{$inc:{totalMinutesInVoice:t}})}}const ia=async a=>await W.create({user:a});async function ua(a){const e=await W.findOne({user:a}).lean();return e||y(await ia(a))}const ca=(a,e)=>W.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class da extends sa{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return ua(e)}updateInDb(e,t){return ca(e,t)}}const re=new da;class la extends f{async updateDailyReport(e){const t=await U.get(e),n=await ae.get(e),r=await ne.getMany({user:e,status:p.QuestStatus.COMPLETED}),i=await re.get(e);await this.update(e,{$set:{xpYesterday:t.xp.amount,berryYesterday:t.berry,previousCompletedQuest:r.map(({questId:u})=>u),"previousOrnament.unlockedBadges":n.unlockedBadges,"previousOrnament.unlockedTitles":n.unlockedTitles,"previousOrnament.unlockedBackgrounds":n.unlockedBackgrounds,previousMessageSent:i.messageSent}})}async getDailyReport(e){const{previousOrnament:t,previousCompletedQuest:n,xpYesterday:r,berryYesterday:i,previousMessageSent:u}=await this.get(e),l=await U.get(e),o=await ne.getMany({user:e,status:p.QuestStatus.COMPLETED}),E=await ae.get(e),x=await re.get(e),{berry:I,xp:ie}=l,{voice:$e,amount:Vn}=ie,{unlockedBadges:Xn,unlockedBackgrounds:Ln,unlockedTitles:Jn}=E;return{berry:I-i,xp:Vn-r,message:x.messageSent-u,voice:d.sameDay($e.lastConnection,d.yesterday())?$e.minutesInVoiceToday:0,quest:d.exclude(o.map(({questId:Zn})=>Zn),n),badge:d.exclude(Xn,t.unlockedBadges),title:d.exclude(Jn,t.unlockedTitles),background:d.exclude(Ln,t.unlockedBackgrounds)}}async getAllDailyReportsToSend(){const e=await ee.getUsersWithDailyReportEnable(),t=await ge.getMany({_id:{$in:e.map(({user:n})=>n)},faction:{$ne:"citizen"}});return await Promise.all(t.map(async({_id:n,discordId:r})=>({report:await this.getDailyReport(n),user:n,discordId:r})))}}const oa=a=>j.create({user:a});async function pa(a){const e=await j.findOne({user:a}).lean();return e||y(await oa(a))}const ya=(a,e)=>j.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class fa extends la{constructor(){super(60)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return pa(e)}updateInDb(e,t){return ya(e,t)}}const ma=new fa;class ha extends f{async setGuessGame(e,t,n,r){await this.update(e,{$set:{guess:{amount:t,tries:n,numberToGuess:r,lastGuess:0}}})}async resetGuessGame(e){await this.update(e,{$set:{guess:null}})}async updateGuessGame(e){await this.update(e,{$inc:{"guess.tries":1},$set:{"guess.lastGuess":Date.now()}})}}const Sa=async a=>await K.create({user:a});async function wa(a){const e=await K.findOne({user:a}).lean();return e||y(await Sa(a))}const ga=(a,e)=>K.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class ba extends ha{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return wa(e)}updateInDb(e,t){return ga(e,t)}}const $a=new ba,Ua=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},xp:{type:Number,default:0},berry:{type:Number,default:0},faction:{type:Number,default:0}}),R=s.models?.UserRank||s.model("UserRank",Ua);class Ea extends f{async computeAllXpRanks(){const t=(await D.aggregate([{$setWindowFields:{sortBy:{"xp.amount":-1},output:{xpRank:{$rank:{}}}}},{$project:{user:1,xpRank:1}}])).map(({user:n,xpRank:r})=>({updateOne:{filter:{user:n},update:{$set:{xp:r}},upsert:!0}}));t.length>0&&await R.bulkWrite(t),this.clearAll()}async computeAllBerryRanks(){const t=(await D.aggregate([{$setWindowFields:{sortBy:{berry:-1},output:{berryRank:{$rank:{}}}}},{$project:{user:1,berryRank:1}}])).map(({user:n,berryRank:r})=>({updateOne:{filter:{user:n},update:{$set:{berry:r}},upsert:!0}}));t.length>0&&await R.bulkWrite(t),this.clearAll()}async computeAllFactionRanks(){const t=(await g.aggregate([{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$setWindowFields:{partitionBy:"$faction",sortBy:{"meta.xp.amount":-1},output:{factionRank:{$rank:{}}}}},{$project:{factionRank:1}}])).map(({_id:n,factionRank:r})=>({updateOne:{filter:{user:n},update:{$set:{faction:r}},upsert:!0}}));t.length>0&&await R.bulkWrite(t),this.clearAll()}async computeAllRanks(){await Promise.all([this.computeAllXpRanks(),this.computeAllBerryRanks(),this.computeAllFactionRanks()])}}const Da=async a=>await R.create({user:a});async function Ta(a){const e=await R.findOne({user:a}).lean();return e||y(await Da(a))}const Oa=(a,e)=>R.findOneAndUpdate({user:a},e,{returnDocument:"after",upsert:!0}).lean();class Ia extends Ea{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return Ta(e)}updateInDb(e,t){return Oa(e,t)}}const va=new Ia;class Ma extends f{async didSevenDoubleAtDoQ(e){await this.update(e,{$inc:{"doubleOrQuit.sevenDoubleInARowCount":1}})}async winWithBlackjack(e){await this.update(e,{$inc:{"blackJack.blackJackCount":1}})}async updateLastGames(e,t,n){await this.update(e,{$push:{lastGames:{$each:[{gameType:t,endState:n}],$position:0,$slice:20}}})}async drawIncrement(e){await this.update(e,{$inc:{drawCount:1}})}async bet666(e){const t=d.yesterday();t.setHours(0,0,0,0);const n=new Date;n.setHours(0,0,0,0),await A.updateOne({user:e,"bet666.last":{$gte:t,$lt:n}},{$inc:{"bet666.count":1},$set:{"bet666.last":new Date}}),await A.updateOne({user:e,"bet666.last":{$lt:t}},{$set:{"bet666.last":new Date,"bet666.count":1}}),this.invalidate(e)}async updateTotalBet(e,t){await this.update(e,{$inc:{totalBet:t}})}async updateRps(e,t){await this.update(e,[{$set:{"rps.count":{$cond:{if:{$eq:["$rps.lastRpsPlayed",t]},then:{$add:["$rps.count",1]},else:1}},"rps.lastRpsPlayed":t}}])}async hasGuessInOneTry(e){await this.update(e,{$inc:{"priceIsRight.guessInOneTryCount":1}})}async diceDoubleSix(e){await this.update(e,{$inc:{"dice.doubleSixCount":1}})}async diceDrawDoubleSix(e){await this.update(e,{$inc:{"dice.drawWithDoubleSixCount":1}})}}const Aa=async a=>await A.create({user:a});async function ka(a){const e=await A.findOne({user:a}).lean();return e||y(await Aa(a))}const qa=(a,e)=>A.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Ra extends Ma{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return ka(e)}updateInDb(e,t){return qa(e,t)}}const Ba=new Ra;class _a extends f{async workIncrement(e){await this.update(e,{$inc:{workCount:1}})}async updateTotalSpentInShop(e,t){await this.update(e,{$inc:{totalSpentInShop:t}})}}const Ca=a=>z.create({user:a});async function xa(a){const e=await z.findOne({user:a}).lean();return e||y(await Ca(a))}const Na=(a,e)=>z.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class Fa extends _a{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return xa(e)}updateInDb(e,t){return Na(e,t)}}const ja=new Fa;class Ha extends f{async hasReportedSomeone(e){await this.update(e,{$set:{reportedSomeone:!0}})}async botPingIncrement(e){await this.update(e,{$inc:{botPingCount:1}})}async hasCelebrateBirthday(e){await this.update(e,{$set:{hasCelebrateBirthday:!0}})}async hasTagEveryone(e){await this.update(e,{$set:{tagEveryone:!0}})}async hasBetMin(e){await this.update(e,{$set:{"gamblingFlags.betMin":!0}})}async hasLoseEverything(e){await this.update(e,{$set:{"gamblingFlags.loseEverything":!0}})}async hasBet10M(e){await this.update(e,{$set:{"gamblingFlags.bet10M":!0}})}async hasWinBet10M(e){await this.update(e,{$set:{"gamblingFlags.winBet10M":!0}})}async hasLose10M(e){await this.update(e,{$set:{"gamblingFlags.lose10M":!0}})}}const Ka=async a=>await G.create({user:a});async function Pa(a){const e=await G.findOne({user:a}).lean();return e||y(await Ka(a))}const Qa=(a,e)=>G.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class za extends Ha{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Pa(e)}updateInDb(e,t){return Qa(e,t)}}const Wa=new za;class Ga extends f{async readEdito(e){const t=new Date;t.setHours(0,0,0,0),await T.updateOne({user:e,"edito.lastTimeRead":{$gte:t}},{$inc:{"edito.readToday":1},$set:{"edito.lastTimeRead":new Date}}),await T.updateOne({user:e,"edito.lastTimeRead":{$lt:t}},{$set:{"edito.lastTimeRead":new Date,"edito.readToday":1}}),this.invalidate(e)}async getTotalEditoReadToday(){const e=new Date;return e.setHours(0,0,0,0),(await T.aggregate([{$match:{"edito.lastTimeRead":{$gte:e},"edito.readToday":{$gt:0}}},{$group:{_id:null,total:{$sum:"$edito.readToday"}}}]))[0]?.total??0}}const Ya=async a=>await T.create({user:a});async function Va(a){const e=await T.findOne({user:a}).lean();return e||y(await Ya(a))}const Xa=(a,e)=>T.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class La extends Ga{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Va(e)}updateInDb(e,t){return Xa(e,t)}}const Ja=new La;class Za extends f{async updateCraftStats(e,t,n){const r=await m.get(n);!r||!m.isItem(r)||await this.update(e,{$inc:{"crafts.totalCrafted":t}})}async incrementAlcoholDrink(e,t,n){["wine","beer","rhum"].includes(t)&&await this.update(e,{$inc:{"alcohols.wines":t==="wine"?n:0,"alcohols.beers":t==="beer"?n:0,"alcohols.rhums":t==="rhum"?n:0,"alcohols.totalConsumed":n}})}async incrementBottleUsedToday(e,t){const n=new Date;n.setHours(0,0,0,0),await k.updateOne({user:e,"bottle.lastUsed":{$gte:n}},{$inc:{"bottle.usedToday":t},$set:{"bottle.lastUsed":new Date}}),await k.updateOne({user:e,"bottle.lastUsed":{$lt:n}},{$set:{"bottle.lastUsed":new Date,"bottle.usedToday":t}}),this.invalidate(e)}async incrementBottleUsedTotal(e,t){await this.update(e,{$inc:{"bottle.totalUsed":t}})}async incrementChestOpenedTotal(e,t){await this.update(e,{$inc:{"chest.totalOpened":t}})}}const en=async a=>await k.create({user:a});async function tn(a){const e=await k.findOne({user:a}).lean();return e||y(await en(a))}const an=(a,e)=>k.findOneAndUpdate({user:a},e,{upsert:!0,returnDocument:"after"}).lean();class nn extends Za{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return tn(e)}updateInDb(e,t){return an(e,t)}}const rn=new nn;class sn extends w{async maxCraftQuantity(e,t){const n=await $.get(e);let r=1/0;for(const i of t)r=Math.min(r,Math.floor((n.itemList[i.entityId]??0)/i.size));return r}async hasEnoughItemsForRecipe(e,t,n){const r=await $.get(e);for(const i of t.entities)if((r.itemList[i.entityId]??0)<i.size*n)return!1;return!0}decodeCraftId(e){return e.split(";").map((t,n)=>({entityId:t==="null"?null:t,index:n}))}encodeCraftId(e){return e.map(({entityId:t})=>`${t}`).join(";")}async isValidRecipe(e){return!!(await this.getAll()).find(n=>n.craftId===e)}async getRecipeResult(e,t){const n=await $.get(e),r=(await O.getPanoplyBonus(n.equippedItems)).find(([i,u])=>i.panoplyId==="little_blacksmith"&&u!==null);return r?.[1]==="full"&&t==="chest_3"?"chest_blacksmith_3":r?.[1]==="half"&&t==="chest_2"?"chest_blacksmith_2":r?.[1]==="half"&&t==="chest_1"?"chest_blacksmith_1":t}}const un=new s.Schema({entityId:{type:String,required:!0},size:{type:Number,required:!0}},{_id:!1}),cn=new s.Schema({entityId:{type:String,required:!0},size:{type:Number,required:!0}},{_id:!1}),dn=new s.Schema({craftId:{type:String,unique:!0,required:!0},name:{type:String,required:!0},entities:{type:[un],required:!0},result:{type:cn,required:!0}},{minimize:!1}),V=s.models?.Recipes||s.model("Recipes",dn),ln=async a=>await V.create({...a}),on=async(a,e)=>V.find(a,{},e).lean();async function pn(a){const e=await V.findOne({craftId:a}).lean();return e||null}const yn=(a,e)=>V.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class fn extends sn{constructor(){super(3600)}createInDb(e){return ln(e)}updateInDb(e,t){return yn(e,t)}fetchFromDb(e){return pn(e)}fetchManyFromDb(e,t){return on(e,t)}normalizeKey(e){return e}getKey(e){return e.craftId}}const mn=new fn,hn=new s.Schema({bannedUserId:{type:String,index:!0,required:!0},authorId:{type:String,required:!0},unbannedTimestamp:{type:Date,index:1},reason:{type:String,required:!0},guildId:{type:String,required:!0}}),X=s.models?.Bans||s.model("Bans",hn),Sn=(a,e)=>X.deleteOne({bannedUserId:a,guildId:e});class wn extends w{async getUnbanUsers(){return this.getMany({unbannedTimestamp:{$lte:new Date,$ne:null}})}async banUserFromGuild({bannedUserId:e,guildId:t,...n}){await this.update({bannedUserId:e,guildId:t},{...n})}async isBannedFromGuild(e,t){const n=await this.get({bannedUserId:e,guildId:t});return!!(n&&(!n.unbannedTimestamp||n.unbannedTimestamp>new Date))}async deleteBan(e,t){await Sn(e,t),this.invalidate({bannedUserId:e,guildId:t})}}const gn=a=>X.find(a).lean(),bn=a=>X.findOne(a).lean(),$n=(a,e)=>X.findOneAndUpdate(a,e,{returnDocument:"after",upsert:!0}).lean();class Un extends wn{constructor(){super(3600*36)}normalizeKey(e){return`${e.guildId}/${e.bannedUserId}`}getKey({bannedUserId:e,guildId:t}){return{bannedUserId:e,guildId:t}}fetchFromDb(e){return bn(e)}fetchManyFromDb(e){return gn(e)}updateInDb(e,t){return $n(e,t)}}const En=new Un,Dn=new s.Schema({senderId:{type:s.Schema.Types.ObjectId,required:!0,ref:"User"},receiverId:{type:s.Schema.Types.ObjectId,required:!0,index:!0,ref:"User"},amount:Number,gameMode:String,meta:{rps:{type:String,default:void 0}}}),L=s.models?.Invitation||s.model("Invitation",Dn),Tn=a=>L.create({...a}),On=async a=>{await L.deleteMany({...a})};class In extends f{async sendInvitation({senderId:e,receiverId:t,gameMode:n,...r}){return await this.get({senderId:e,gameMode:n,receiverId:t})?null:await Tn({...r,senderId:e,gameMode:n,receiverId:t})}async deleteInvitation({senderId:e,receiverId:t,gameMode:n}){await On({senderId:e,gameMode:n,receiverId:t}),this.invalidate({senderId:e,gameMode:n,receiverId:t})}}const vn=a=>L.findOne({...a}).lean(),Mn=(a,e)=>L.findOneAndUpdate(a,e,{returnDocument:"after"}).lean();class An extends In{constructor(){super(3600)}normalizeKey(e){return`${e.gameMode}/${e.receiverId}/${e.senderId}`}getKey({receiverId:e,gameMode:t,senderId:n}){return{gameMode:t,receiverId:e,senderId:n}}fetchFromDb(e){return vn(e)}updateInDb(e,t){return Mn(e,t)}}const kn=new An;class qn extends f{async randomizeEditoPrice(e){const t=d.randomBetween(100,1001);return await this.update({guildId:e},{$set:{"edito.price":t}}),t}async setEditoMessageId(e,t){await this.update({guildId:e},{$set:{"edito.messageId":t}})}async setRankingMessage(e,t){await this.update({guildId:e},{$set:{"ranking.messageId":t}})}async addCrewChannelId(e,t,n){await this.update({guildId:e},{$push:{"crew.crewChannelIds":{channelId:n,crewId:t}}})}async updateRolesId(e,t){await this.update({guildId:e},{$set:Object.fromEntries(Object.entries(t).map(([n,r])=>[`roles.${n}`,r]))})}async updateChannelId(e,t){await this.update({guildId:e},{$set:Object.fromEntries(Object.entries(t).map(([n,r])=>[`channels.${n}`,r]))})}}const Rn=new s.Schema({guildId:{type:String,required:!0,unique:!0},ranking:{messageId:{type:String,default:null}},roles:{premium:{type:String,default:null},booster:{type:String,default:null},scam:{type:String,default:null},canChangeFaction:{type:String,default:null},canChooseFaction:{type:String,default:null},staff:{type:String,default:null},moderator:{type:String,default:null},marine:{type:String,default:null},pirate:{type:String,default:null},revolutionary:{type:String,default:null}},channels:{gambling:{type:String,default:null},work:{type:String,default:null},raid:{type:String,default:null},suggestion:{type:String,default:null},report:{type:String,default:null},reportModerator:{type:String,default:null},faction:{type:String,default:null},discussion:{type:String,default:null},questFallback:{type:String,default:null},reportBug:{type:String,default:null},shop:{type:String,default:null},edito:{type:String,default:null},crew:{type:String,default:null},ranking:{type:String,default:null}},edito:{price:{type:Number,default:100},messageId:{type:String,default:null}},crew:{crewChannelIds:{type:[{channelId:{type:String},crewId:{type:String}}],default:[]}}}),se=s.models?.Settings||s.model("Settings",Rn),Bn=a=>se.create({guildId:a}),_n=async a=>{const e=await se.findOne({guildId:a}).lean();return e||y(await Bn(a))},Cn=(a,e)=>se.findOneAndUpdate(a,e,{upsert:!0,returnDocument:"after"}).lean();class xn extends qn{constructor(){super(3600*24*30)}normalizeKey(e){return e}getKey({guildId:e}){return e}fetchFromDb(e){return _n(e)}updateInDb(e,t){return Cn(e,t)}}const Nn=new xn,Fn=new s.Schema({warnedUserId:{type:String,required:!0,index:!0},authorId:String,date:{type:Date,default:Date.now()},reason:{type:String,default:null}}),J=s.models?.Warn||s.model("Warn",Fn),jn=a=>J.countDocuments(a),Hn=a=>J.create({...a}),Kn=a=>J.findByIdAndDelete(a).lean();class Pn extends w{getUserWarns(e){return this.getMany({warnedUserId:e})}getUserWarnCount(e){return jn({warnedUserId:e})}async createWarn(e){await Hn(e)}async deleteWarn(e){const t=await Kn(e);return t&&this.invalidate(this.getKey(t)),t}}const Qn=a=>J.find(a).lean();class zn extends Pn{constructor(){super(300)}normalizeKey(e){return e}getKey({warnedUserId:e,date:t}){return`${e}/${t.getTime()}`}fetchFromDb(){throw new Error("Method not implemented.")}fetchManyFromDb(e){return Qn(e)}updateInDb(){throw new Error("Method not implemented.")}}const Wn=new zn,Gn=a=>{s.connect(a)};class Yn extends s.Types.ObjectId{}c.COOLDOWN_COMMANDS=Fe,c.ObjectId=Yn,c.QUEST_MIDDLEWARE_EVENT_NAME=S,c.banService=En,c.connectToServices=Gn,c.emitQuestMiddlewareEvent=h,c.entityService=m,c.invitationService=kn,c.ornamentService=b,c.panoplyService=O,c.recipeService=mn,c.registerQuestMiddlewareEvents=Te,c.reminderService=be,c.settingsService=Nn,c.userCooldownService=Ht,c.userDailyReportService=ma,c.userEncyclopediaService=Y,c.userGamesService=$a,c.userInventoryService=$,c.userMetaService=U,c.userOrnamentService=ae,c.userQuestService=ne,c.userRankService=va,c.userService=ge,c.userSettingsService=ee,c.userStatsCasinoService=Ba,c.userStatsEconomyService=ja,c.userStatsEngagementService=re,c.userStatsFlagsService=Wa,c.userStatsFrequencyService=Ja,c.userStatsInventoryService=rn,c.warnService=Wn,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})}));
|
|
@@ -1,5 +1,15 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type Model } from 'mongoose';
|
|
2
2
|
import type { EntityDocument } from '../types';
|
|
3
3
|
declare const entityModel: Model<EntityDocument>;
|
|
4
|
-
|
|
4
|
+
declare const itemModel: Model<EntityDocument & import("../types").ItemDocument, {}, {}, {}, import("mongoose").Document<unknown, {}, EntityDocument & import("../types").ItemDocument, {}, {}> & EntityDocument & import("../types").ItemDocument & Required<{
|
|
5
|
+
_id: import("mongoose").Types.ObjectId;
|
|
6
|
+
}> & {
|
|
7
|
+
__v: number;
|
|
8
|
+
}, any>;
|
|
9
|
+
declare const equipmentModel: Model<EntityDocument & import("../types").EquipmentDocument, {}, {}, {}, import("mongoose").Document<unknown, {}, EntityDocument & import("../types").EquipmentDocument, {}, {}> & EntityDocument & import("../types").EquipmentDocument & Required<{
|
|
10
|
+
_id: import("mongoose").Types.ObjectId;
|
|
11
|
+
}> & {
|
|
12
|
+
__v: number;
|
|
13
|
+
}, any>;
|
|
14
|
+
export { entityModel, itemModel, equipmentModel };
|
|
5
15
|
//# sourceMappingURL=model.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../src/services/entities/definition/model.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../src/services/entities/definition/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;AAGtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG/C,QAAA,MAAM,WAAW,EAAE,KAAK,CAAC,cAAc,CAC8B,CAAC;AAEtE,QAAA,MAAM,SAAS;;;;OAAgD,CAAC;AAChE,QAAA,MAAM,cAAc;;;;OAA0D,CAAC;AAE/E,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Schema } from 'mongoose';
|
|
2
|
-
import type { EntityDocument } from '../types';
|
|
2
|
+
import type { EntityDocument, EquipmentDocument, ItemDocument } from '../types';
|
|
3
3
|
declare const entitySchema: Schema<EntityDocument, import("mongoose").Model<EntityDocument, any, any, any, import("mongoose").Document<unknown, any, EntityDocument, any, {}> & EntityDocument & Required<{
|
|
4
4
|
_id: import("mongoose").Types.ObjectId;
|
|
5
5
|
}> & {
|
|
@@ -9,5 +9,23 @@ declare const entitySchema: Schema<EntityDocument, import("mongoose").Model<Enti
|
|
|
9
9
|
}> & {
|
|
10
10
|
__v: number;
|
|
11
11
|
}>;
|
|
12
|
-
|
|
12
|
+
declare const itemSchema: Schema<ItemDocument, import("mongoose").Model<ItemDocument, any, any, any, import("mongoose").Document<unknown, any, ItemDocument, any, {}> & ItemDocument & Required<{
|
|
13
|
+
_id: import("mongoose").Types.ObjectId;
|
|
14
|
+
}> & {
|
|
15
|
+
__v: number;
|
|
16
|
+
}, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, ItemDocument, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<ItemDocument>, {}, import("mongoose").ResolveSchemaOptions<import("mongoose").DefaultSchemaOptions>> & import("mongoose").FlatRecord<ItemDocument> & Required<{
|
|
17
|
+
_id: import("mongoose").Types.ObjectId;
|
|
18
|
+
}> & {
|
|
19
|
+
__v: number;
|
|
20
|
+
}>;
|
|
21
|
+
declare const equipmentSchema: Schema<EquipmentDocument, import("mongoose").Model<EquipmentDocument, any, any, any, import("mongoose").Document<unknown, any, EquipmentDocument, any, {}> & EquipmentDocument & Required<{
|
|
22
|
+
_id: import("mongoose").Types.ObjectId;
|
|
23
|
+
}> & {
|
|
24
|
+
__v: number;
|
|
25
|
+
}, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, EquipmentDocument, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<EquipmentDocument>, {}, import("mongoose").ResolveSchemaOptions<import("mongoose").DefaultSchemaOptions>> & import("mongoose").FlatRecord<EquipmentDocument> & Required<{
|
|
26
|
+
_id: import("mongoose").Types.ObjectId;
|
|
27
|
+
}> & {
|
|
28
|
+
__v: number;
|
|
29
|
+
}>;
|
|
30
|
+
export { entitySchema, itemSchema, equipmentSchema };
|
|
13
31
|
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/services/entities/definition/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIlC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/services/entities/definition/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIlC,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAchF,QAAA,MAAM,YAAY;;;;;;;;EAQjB,CAAC;AAEF,QAAA,MAAM,UAAU;;;;;;;;EAed,CAAC;AAEH,QAAA,MAAM,eAAe;;;;;;;;EAQnB,CAAC;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -1,42 +1,27 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CharacteristicsRecord, ChestItem, ConsumableItem, DBEquipment, Entity, EquipableEquipment, Equipment, EquippedItems, Item, ResourceItem } from '@opfr/definitions';
|
|
2
2
|
import { AbstractCachedServiceWithFetchMany } from '../AbstractCachedService';
|
|
3
3
|
import type { Lean } from '../types';
|
|
4
|
-
import type { EntityDocument } from './types';
|
|
4
|
+
import type { EntityDocument, ItemDocument } from './types';
|
|
5
5
|
export declare abstract class EntityHelper extends AbstractCachedServiceWithFetchMany<Entity, EntityDocument, string> {
|
|
6
6
|
isEntity(obj?: object | null): obj is Entity;
|
|
7
7
|
isItem<T extends Entity>(entity: T): entity is Item & T;
|
|
8
8
|
isEquipment<T extends Entity>(entity: T): entity is Equipment & T;
|
|
9
9
|
isEntityId(id: string, filter?: (element: Entity) => boolean): Promise<boolean>;
|
|
10
|
-
getSomeStoreItems(quantity: number): Promise<StoreItem[]>;
|
|
11
|
-
getSomeRepairItems(quantity: number): Promise<RepairItem[]>;
|
|
12
|
-
getSomeObjectItems(quantity: number): Promise<ObjectItem[]>;
|
|
13
10
|
idArrayToEntities(ids: string[]): Promise<Entity[]>;
|
|
14
11
|
recordToEntities(record: Partial<Record<string, unknown>>): Promise<Entity[]>;
|
|
15
12
|
recordToEntityTuple<E extends Entity = Entity, T extends number = number>(record: Partial<Record<string, T>>): Promise<[E, T][]>;
|
|
16
13
|
getAllEntitiesLimit(): Promise<Record<string, number>>;
|
|
17
14
|
getAllEntitiesBy<T extends Entity & Lean<EntityDocument>>(filter: (entity: Entity & Lean<EntityDocument>) => entity is T): Promise<T[]>;
|
|
15
|
+
getAllItemsBy<T extends Item & Lean<ItemDocument>>(filter: (item: Item & Lean<ItemDocument>) => item is T): Promise<T[]>;
|
|
18
16
|
fromDBToEquipableEquipment(equipment: DBEquipment): Promise<EquipableEquipment>;
|
|
19
17
|
getUserEquipmentsCharacteristics(equipped: EquippedItems): Promise<CharacteristicsRecord>;
|
|
20
|
-
filterCraftEntities<T extends Entity>(entities: T[]): T[];
|
|
21
|
-
filterDismantleEntities<T extends Entity>(entities: T[]): T[];
|
|
22
18
|
filterUsableEntities<T extends Entity>(entities: T[]): T[];
|
|
23
|
-
filterEnchantableEntities<T extends Entity>(entities: T[]): T[];
|
|
24
|
-
hasCraftEntities<T extends Entity>(entities: T[]): boolean;
|
|
25
|
-
hasDismantleEntities<T extends Entity>(entities: T[]): boolean;
|
|
26
|
-
hasEnchantableEntities<T extends Entity>(entities: T[]): boolean;
|
|
27
19
|
hasUsableEntities<T extends Entity>(entities: T[]): boolean;
|
|
28
20
|
isChestItem<T extends Entity>(item: T): item is ChestItem & T;
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
isRepairItem<T extends Entity>(item: T): item is RepairItem & T;
|
|
32
|
-
isStoreItem<T extends Entity>(item: T): item is T & StoreItem;
|
|
33
|
-
isObjectItem<T extends Entity>(item: T): item is ObjectItem & T;
|
|
34
|
-
isScrollItem<T extends Entity>(item: T): item is ScrollItem & T;
|
|
35
|
-
isCookedMeal(item: Entity | Lean<EntityDocument>): item is CookedMealItem;
|
|
36
|
-
isAlcoholItem<T extends Entity>(item: T): item is AlcoholItem & T;
|
|
21
|
+
isConsumableItem<T extends Entity>(item: T): item is ConsumableItem & T;
|
|
22
|
+
isResourceItem<T extends Entity>(item: T): item is ResourceItem & T;
|
|
37
23
|
isSameEquipment(eq1: DBEquipment | EquipableEquipment, eq2: DBEquipment | EquipableEquipment): boolean;
|
|
38
24
|
seedEquipment(equipment: Equipment, seed: number): EquipableEquipment;
|
|
39
25
|
isEquipped(equipped: EquippedItems, equipment: DBEquipment): boolean;
|
|
40
|
-
calcILvl(eq: EquipableEquipment): number;
|
|
41
26
|
}
|
|
42
27
|
//# sourceMappingURL=helper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../../src/services/entities/helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../../src/services/entities/helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,SAAS,EACT,cAAc,EACd,WAAW,EACX,MAAM,EACN,kBAAkB,EAClB,SAAS,EACT,aAAa,EACb,IAAI,EACJ,YAAY,EACb,MAAM,mBAAmB,CAAC;AAW3B,OAAO,EAAE,kCAAkC,EAAE,MAAM,0BAA0B,CAAC;AAE9E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAErC,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5D,8BAAsB,YAAa,SAAQ,kCAAkC,CAC3E,MAAM,EACN,cAAc,EACd,MAAM,CACP;IACQ,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,GAAG,IAAI,MAAM;IAI5C,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,IAAI,IAAI,GAAG,CAAC;IAGvD,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,IAAI,SAAS,GAAG,CAAC;IAI3D,UAAU,CACrB,EAAE,EAAE,MAAM,EACV,MAAM,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAoB;IAUtC,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKzD,gBAAgB,CACrB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACvC,OAAO,CAAC,MAAM,EAAE,CAAC;IAGP,mBAAmB,CAC9B,CAAC,SAAS,MAAM,GAAG,MAAM,EACzB,CAAC,SAAS,MAAM,GAAG,MAAM,EACzB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAW3C,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAQtD,gBAAgB,CAAC,CAAC,SAAS,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,EACnE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,MAAM,IAAI,CAAC,GAC7D,OAAO,CAAC,CAAC,EAAE,CAAC;IAIF,aAAa,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,EAC5D,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,IAAI,CAAC,GACrD,OAAO,CAAC,CAAC,EAAE,CAAC;IAIF,0BAA0B,CACrC,SAAS,EAAE,WAAW,GACrB,OAAO,CAAC,kBAAkB,CAAC;IAcjB,gCAAgC,CAAC,QAAQ,EAAE,aAAa;IAqC9D,oBAAoB,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAM1D,iBAAiB,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,OAAO;IAM3D,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,IAAI,SAAS,GAAG,CAAC;IAG7D,gBAAgB,CAAC,CAAC,SAAS,MAAM,EACtC,IAAI,EAAE,CAAC,GACN,IAAI,IAAI,cAAc,GAAG,CAAC;IAGtB,cAAc,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,IAAI,YAAY,GAAG,CAAC;IAInE,eAAe,CACpB,GAAG,EAAE,WAAW,GAAG,kBAAkB,EACrC,GAAG,EAAE,WAAW,GAAG,kBAAkB,GACpC,OAAO;IAIH,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB;IAqBrE,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,GAAG,OAAO;CAK5E"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { QueryOptions, RootFilterQuery } from 'mongoose';
|
|
2
2
|
import type { Lean } from '../../types';
|
|
3
|
-
import type { EntityDocument } from '../types';
|
|
3
|
+
import type { EntityDocument, ItemDocument } from '../types';
|
|
4
4
|
export declare const findEntities: (filter: RootFilterQuery<EntityDocument>, options: QueryOptions<EntityDocument>) => Promise<Lean<EntityDocument>[]>;
|
|
5
|
+
export declare const findItems: (filter: RootFilterQuery<ItemDocument>, options: QueryOptions<ItemDocument>) => Promise<Lean<ItemDocument>[]>;
|
|
5
6
|
//# sourceMappingURL=findMany.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findMany.d.ts","sourceRoot":"","sources":["../../../../src/services/entities/process/findMany.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE9D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"findMany.d.ts","sourceRoot":"","sources":["../../../../src/services/entities/process/findMany.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE9D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7D,eAAO,MAAM,YAAY,GACvB,QAAQ,eAAe,CAAC,cAAc,CAAC,EACvC,SAAS,YAAY,CAAC,cAAc,CAAC,KACpC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAEhC,CAAC;AAEF,eAAO,MAAM,SAAS,GACpB,QAAQ,eAAe,CAAC,YAAY,CAAC,EACrC,SAAS,YAAY,CAAC,YAAY,CAAC,KAClC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAE9B,CAAC"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { Lean } from '../../types';
|
|
2
|
-
import type { EntityDocument } from '../types';
|
|
2
|
+
import type { EntityDocument, EquipmentDocument, ItemDocument } from '../types';
|
|
3
3
|
export declare function findEntity(entityId: string): Promise<Lean<EntityDocument> | null>;
|
|
4
|
+
export declare function findItem(entityId: string): Promise<Lean<ItemDocument> | null>;
|
|
5
|
+
export declare function findEquipment(entityId: string): Promise<Lean<EquipmentDocument> | null>;
|
|
4
6
|
//# sourceMappingURL=findOne.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findOne.d.ts","sourceRoot":"","sources":["../../../../src/services/entities/process/findOne.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"findOne.d.ts","sourceRoot":"","sources":["../../../../src/services/entities/process/findOne.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEhF,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,CAOtC;AAED,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,CAOpC;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC,CAOzC"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { Document } from 'mongoose';
|
|
2
|
-
import type { Entity } from '@opfr/definitions';
|
|
2
|
+
import type { Entity, Equipment, Item } from '@opfr/definitions';
|
|
3
3
|
export interface EntityDocument extends Document, Entity {
|
|
4
4
|
}
|
|
5
|
+
export interface ItemDocument extends Document, Item {
|
|
6
|
+
}
|
|
7
|
+
export interface EquipmentDocument extends Document, Equipment {
|
|
8
|
+
}
|
|
5
9
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/entities/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/entities/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,WAAW,cAAe,SAAQ,QAAQ,EAAE,MAAM;CAAG;AAC3D,MAAM,WAAW,YAAa,SAAQ,QAAQ,EAAE,IAAI;CAAG;AACvD,MAAM,WAAW,iBAAkB,SAAQ,QAAQ,EAAE,SAAS;CAAG"}
|
package/dist/services/index.d.ts
CHANGED
|
@@ -9,7 +9,6 @@ export * from './user-ornament';
|
|
|
9
9
|
export * from './user-quest';
|
|
10
10
|
export * from './user-rank';
|
|
11
11
|
export * from './user-settings';
|
|
12
|
-
export * from './user-shop';
|
|
13
12
|
export * from './user-stats/casino';
|
|
14
13
|
export * from './user-stats/economy';
|
|
15
14
|
export * from './user-stats/engagement';
|
|
@@ -24,7 +23,6 @@ export * from './ban';
|
|
|
24
23
|
export * from './invitations';
|
|
25
24
|
export * from './reminder';
|
|
26
25
|
export * from './settings';
|
|
27
|
-
export * from './shop';
|
|
28
26
|
export * from './warn';
|
|
29
27
|
export * from './types';
|
|
30
28
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAEhC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AAEzB,cAAc,OAAO,CAAC;AACtB,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AAEvB,cAAc,SAAS,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/services/user/definition/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/services/user/definition/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAuBlC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,QAAA,MAAM,UAAU;;;;;;;;EASd,CAAC;AA2BH,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/services/user-inventory/definition/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAMlC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEtD,QAAA,MAAM,mBAAmB;;;;;;;;EAsBxB,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/services/user-inventory/definition/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAMlC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEtD,QAAA,MAAM,mBAAmB;;;;;;;;EAsBxB,CAAC;AAWF,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import type { Types } from 'mongoose';
|
|
2
|
-
import type {
|
|
2
|
+
import type { CharacteristicsRecord, DBEquipment, Entity, EquipmentSlot, EquippedItems } from '@opfr/definitions';
|
|
3
3
|
import { AbstractCachedService } from '../AbstractCachedService';
|
|
4
4
|
import type { Recipe } 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> {
|
|
8
|
-
getPanoplyEffectiveBonus(userInventory: Lean<UserInventoryDocument>, panoply: Panoply): Partial<CharacteristicsRecord> | Buff | undefined;
|
|
9
8
|
getUserEquipmentsCharacteristics(userInventory: Lean<UserInventoryDocument>): Promise<CharacteristicsRecord>;
|
|
10
9
|
hasInventoryRequirements(userId: Types.ObjectId, itemRequirements: Partial<Record<string, number>>): Promise<boolean>;
|
|
11
10
|
hasEnoughEntity(userId: Types.ObjectId, quantity: number, entityId: string): Promise<boolean>;
|
|
12
11
|
getItemList(userId: Types.ObjectId): Promise<Record<string, number>>;
|
|
13
|
-
calcBottleMultiplier(userId: Types.ObjectId, { bottle: { buffs } }: BottleItem): Promise<Buff[]>;
|
|
14
12
|
calcMinStreakForWorkLoot(userId: Types.ObjectId): Promise<number>;
|
|
15
13
|
hasRevolutionaryBuff(userId: Types.ObjectId): Promise<"full" | "half" | null>;
|
|
16
14
|
addItem(userId: Types.ObjectId, itemId: string, quantity: number): Promise<void>;
|
|
@@ -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,
|
|
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,MAAM,EACN,aAAa,EACb,aAAa,EACd,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,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;IAgB3C,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,eAAe,CAC1B,MAAM,EAAE,KAAK,CAAC,QAAQ,EACtB,MAAM,EAAE,MAAM,EACd,eAAe,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,EACzD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM;IAiBD,WAAW,CACtB,MAAM,EAAE,KAAK,CAAC,QAAQ,EACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,EACxB,IAAI,EAAE,MAAM;IAQD,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM;CAGnE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/services/user-meta/definition/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAOlC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AASjD,QAAA,MAAM,cAAc;;;;;;;;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/services/user-meta/definition/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAOlC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AASjD,QAAA,MAAM,cAAc;;;;;;;;EAiFlB,CAAC;AAeH,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -33,7 +33,7 @@ export declare abstract class UserMetaHelper extends AbstractCachedServiceWithFe
|
|
|
33
33
|
updateHp(user: Types.ObjectId, prevMaxHp: number): Promise<void>;
|
|
34
34
|
addCharacteristics(user: Types.ObjectId, characteristics: Partial<CharacteristicsRecord>): Promise<void>;
|
|
35
35
|
addScrollCharacteristic(user: Types.ObjectId, characteristics: Partial<CharacteristicsRecord>): Promise<void>;
|
|
36
|
-
resetCharacteristics(user: Types.ObjectId
|
|
36
|
+
resetCharacteristics(user: Types.ObjectId): Promise<void>;
|
|
37
37
|
updateLastMessageWithXpDate(userId: Types.ObjectId): Promise<void>;
|
|
38
38
|
resetMinutesInVoiceToday(userId: Types.ObjectId): Promise<void>;
|
|
39
39
|
addMinutesInVoiceToday(userId: Types.ObjectId, minutes: number): Promise<void>;
|