@opfr/services 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/index.es.js +36 -36
  2. package/dist/index.umd.js +1 -1
  3. package/dist/services/AbstractCachedService.d.ts +10 -3
  4. package/dist/services/AbstractCachedService.d.ts.map +1 -1
  5. package/dist/services/entities/process/findMany.d.ts +2 -2
  6. package/dist/services/entities/process/findMany.d.ts.map +1 -1
  7. package/dist/services/entities/service.d.ts +2 -2
  8. package/dist/services/entities/service.d.ts.map +1 -1
  9. package/dist/services/ornaments/process/findMany.d.ts +2 -2
  10. package/dist/services/ornaments/process/findMany.d.ts.map +1 -1
  11. package/dist/services/ornaments/service.d.ts +2 -2
  12. package/dist/services/ornaments/service.d.ts.map +1 -1
  13. package/dist/services/panoplies/process/findMany.d.ts +3 -3
  14. package/dist/services/panoplies/process/findMany.d.ts.map +1 -1
  15. package/dist/services/panoplies/service.d.ts +2 -2
  16. package/dist/services/panoplies/service.d.ts.map +1 -1
  17. package/dist/services/recipe/process/findMany.d.ts +2 -2
  18. package/dist/services/recipe/process/findMany.d.ts.map +1 -1
  19. package/dist/services/recipe/service.d.ts +2 -2
  20. package/dist/services/recipe/service.d.ts.map +1 -1
  21. package/dist/services/reminder/process/findMany.d.ts +2 -2
  22. package/dist/services/reminder/process/findMany.d.ts.map +1 -1
  23. package/dist/services/reminder/service.d.ts +2 -2
  24. package/dist/services/reminder/service.d.ts.map +1 -1
  25. package/dist/services/user/process/findMany.d.ts +2 -2
  26. package/dist/services/user/process/findMany.d.ts.map +1 -1
  27. package/dist/services/user/process/findOne.d.ts +2 -1
  28. package/dist/services/user/process/findOne.d.ts.map +1 -1
  29. package/dist/services/user/process/updateOne.d.ts.map +1 -1
  30. package/dist/services/user/service.d.ts +3 -2
  31. package/dist/services/user/service.d.ts.map +1 -1
  32. package/package.json +2 -2
  33. package/dist/services/bet/definition/model.d.ts +0 -5
  34. package/dist/services/bet/definition/model.d.ts.map +0 -1
  35. package/dist/services/bet/definition/schema.d.ts +0 -15
  36. package/dist/services/bet/definition/schema.d.ts.map +0 -1
  37. package/dist/services/bet/index.d.ts +0 -5
  38. package/dist/services/bet/index.d.ts.map +0 -1
  39. package/dist/services/bet/process/create.d.ts +0 -3
  40. package/dist/services/bet/process/create.d.ts.map +0 -1
  41. package/dist/services/bet/process/findOne.d.ts +0 -9
  42. package/dist/services/bet/process/findOne.d.ts.map +0 -1
  43. package/dist/services/bet/process/updateOne.d.ts +0 -4
  44. package/dist/services/bet/process/updateOne.d.ts.map +0 -1
  45. package/dist/services/bet/types.d.ts +0 -22
  46. package/dist/services/bet/types.d.ts.map +0 -1
package/dist/index.es.js CHANGED
@@ -13,12 +13,12 @@ class f {
13
13
  useClones: !1
14
14
  });
15
15
  }
16
- async get(e) {
17
- const t = this.normalizeKey(e), r = this.cache.get(t);
18
- if (r)
19
- return r;
20
- const a = await this.fetchFromDb(e);
21
- return a && this.cache.set(t, a), a;
16
+ async get(e, t) {
17
+ const r = this.normalizeKey(e), a = this.cache.get(r);
18
+ if (a)
19
+ return a;
20
+ const s = await this.fetchFromDb(e, t ?? {});
21
+ return s && this.cache.set(r, s), s;
22
22
  }
23
23
  async update(e, t, r) {
24
24
  const a = await this.updateInDb(e, t, r);
@@ -40,16 +40,16 @@ class b extends f {
40
40
  const e = this.cache.get(W);
41
41
  if (e)
42
42
  return e;
43
- const t = await this.fetchManyFromDb({});
43
+ const t = await this.fetchManyFromDb({}, {});
44
44
  return this.cache.set(W, t), t.forEach((r) => {
45
45
  this.cache.set(this.normalizeKey(this.getKey(r)), r);
46
46
  }), t;
47
47
  }
48
- async getMany(e) {
49
- const t = await this.fetchManyFromDb(e);
50
- return t.forEach((r) => {
51
- this.cache.set(this.normalizeKey(this.getKey(r)), r);
52
- }), t;
48
+ async getMany(e, t = {}) {
49
+ const r = await this.fetchManyFromDb(e, t);
50
+ return r.forEach((a) => {
51
+ this.cache.set(this.normalizeKey(this.getKey(a)), a);
52
+ }), r;
53
53
  }
54
54
  }
55
55
  const ke = new he.EventEmitter(), m = (n, e, t) => {
@@ -1324,17 +1324,17 @@ class mn extends b {
1324
1324
  await this.update({ discordId: e }, { $set: { faction: t } });
1325
1325
  }
1326
1326
  }
1327
- const hn = (n) => $.find(n), wn = (n) => $.create({
1327
+ const hn = (n, e) => $.find(n, {}, e).lean(), wn = (n) => $.create({
1328
1328
  discordId: n
1329
1329
  });
1330
- async function gn(n) {
1331
- const e = await $.findOne({ discordId: n }).lean();
1332
- return e || y(await wn(n));
1330
+ async function gn(n, { upsert: e = !0, ...t }) {
1331
+ const r = await $.findOne({ discordId: n }, {}, t).lean();
1332
+ return !r && e ? y(await wn(n)) : r;
1333
1333
  }
1334
1334
  const Sn = (n, e) => $.findOneAndUpdate(n, e, {
1335
1335
  upsert: !0,
1336
1336
  returnDocument: "after"
1337
- });
1337
+ }).lean();
1338
1338
  class bn extends mn {
1339
1339
  constructor() {
1340
1340
  super(3600);
@@ -1345,11 +1345,11 @@ class bn extends mn {
1345
1345
  getKey({ discordId: e }) {
1346
1346
  return e;
1347
1347
  }
1348
- fetchFromDb(e) {
1349
- return gn(e);
1348
+ fetchFromDb(e, t) {
1349
+ return gn(e, t);
1350
1350
  }
1351
- fetchManyFromDb(e) {
1352
- return hn(e);
1351
+ fetchManyFromDb(e, t) {
1352
+ return hn(e, t);
1353
1353
  }
1354
1354
  updateInDb(e, t) {
1355
1355
  return Sn(e, t);
@@ -1400,8 +1400,8 @@ class Dn extends b {
1400
1400
  });
1401
1401
  }
1402
1402
  }
1403
- function On(n, e = {}) {
1404
- return K.find(n, e).lean();
1403
+ function On(n, e) {
1404
+ return K.find(n, {}, e).lean();
1405
1405
  }
1406
1406
  async function Tn(n) {
1407
1407
  const e = await K.findOne(n).lean();
@@ -1523,7 +1523,7 @@ const An = new u(
1523
1523
  strength: Number
1524
1524
  },
1525
1525
  { minimize: !1 }
1526
- ), Ie = l?.Ornaments || p("Ornaments", An), Mn = async (n, e = {}) => Ie.find(n, e).lean();
1526
+ ), Ie = l?.Ornaments || p("Ornaments", An), Mn = async (n, e) => Ie.find(n, {}, e).lean();
1527
1527
  async function Bn(n) {
1528
1528
  const e = await Ie.findOne({ ornamentId: n }).lean();
1529
1529
  return e || null;
@@ -1541,8 +1541,8 @@ class qn extends vn {
1541
1541
  fetchFromDb(e) {
1542
1542
  return Bn(e);
1543
1543
  }
1544
- fetchManyFromDb(e) {
1545
- return Mn(e);
1544
+ fetchManyFromDb(e, t) {
1545
+ return Mn(e, t);
1546
1546
  }
1547
1547
  getKey(e) {
1548
1548
  return e.ornamentId;
@@ -1565,7 +1565,7 @@ const g = new qn(), kn = new u(
1565
1565
  halfBonus: u.Types.Mixed
1566
1566
  },
1567
1567
  { minimize: !1 }
1568
- ), P = l?.Panoplies || p("Panoplies", kn), _n = (n) => P.find(n).lean(), Nn = async (n) => P.find(n).populate("equipments");
1568
+ ), P = l?.Panoplies || p("Panoplies", kn), _n = (n, e) => P.find(n, {}, e).lean(), Nn = async (n, e) => P.find(n, {}, e).populate("equipments");
1569
1569
  async function Fn(n) {
1570
1570
  const e = await P.findOne({ panoplyId: n }).lean();
1571
1571
  return e || null;
@@ -1573,7 +1573,7 @@ async function Fn(n) {
1573
1573
  const jn = async (n) => P.findOne(n).populate("equipments");
1574
1574
  class zn extends b {
1575
1575
  getAllPopulated() {
1576
- return Nn({});
1576
+ return Nn({}, {});
1577
1577
  }
1578
1578
  getPopulated(e) {
1579
1579
  return jn({ panoplyId: e });
@@ -1617,8 +1617,8 @@ class Pn extends zn {
1617
1617
  fetchFromDb(e) {
1618
1618
  return Fn(e);
1619
1619
  }
1620
- fetchManyFromDb(e = {}) {
1621
- return _n(e);
1620
+ fetchManyFromDb(e, t) {
1621
+ return _n(e, t);
1622
1622
  }
1623
1623
  }
1624
1624
  const U = new Pn();
@@ -1896,7 +1896,7 @@ const Ln = new u(
1896
1896
  { minimize: !1 }
1897
1897
  ), de = l?.Entities || p("Entities", Qn), Wn = async (n) => await de.create({
1898
1898
  ...n
1899
- }), Gn = async (n, e = {}) => de.find(n, e).lean();
1899
+ }), Gn = async (n, e) => de.find(n, {}, e).lean();
1900
1900
  async function Yn(n) {
1901
1901
  const e = await de.findOne({ entityId: n }).lean();
1902
1902
  return e || null;
@@ -1917,8 +1917,8 @@ class Vn extends Hn {
1917
1917
  fetchFromDb(e) {
1918
1918
  return Yn(e);
1919
1919
  }
1920
- fetchManyFromDb(e) {
1921
- return Gn(e);
1920
+ fetchManyFromDb(e, t) {
1921
+ return Gn(e, t);
1922
1922
  }
1923
1923
  normalizeKey(e) {
1924
1924
  return e;
@@ -3962,7 +3962,7 @@ const es = new u(
3962
3962
  { minimize: !1 }
3963
3963
  ), le = l?.Recipes || p("Recipes", ns), rs = async (n) => await le.create({
3964
3964
  ...n
3965
- }), as = async (n, e = {}) => le.find(n, e).lean();
3965
+ }), as = async (n, e) => le.find(n, {}, e).lean();
3966
3966
  async function ss(n) {
3967
3967
  const e = await le.findOne({ craftId: n }).lean();
3968
3968
  return e || null;
@@ -3983,8 +3983,8 @@ class us extends Za {
3983
3983
  fetchFromDb(e) {
3984
3984
  return ss(e);
3985
3985
  }
3986
- fetchManyFromDb(e) {
3987
- return as(e);
3986
+ fetchManyFromDb(e, t) {
3987
+ return as(e, t);
3988
3988
  }
3989
3989
  normalizeKey(e) {
3990
3990
  return e;
package/dist/index.umd.js CHANGED
@@ -1 +1 @@
1
- (function(d,s){typeof exports=="object"&&typeof module<"u"?s(exports,require("mongoose"),require("@opfr/utils-lang"),require("node-cache"),require("@opfr/definitions"),require("events")):typeof define=="function"&&define.amd?define(["exports","mongoose","@opfr/utils-lang","node-cache","@opfr/definitions","events"],s):(d=typeof globalThis<"u"?globalThis:d||self,s(d.services={},d.mongoose,d["@opfr/utils-lang"],d["node-cache"],d["@opfr/definitions"],d.events))})(this,(function(d,s,o,Ve,f,Le){"use strict";function Je(r){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(r){for(const t in r)if(t!=="default"){const a=Object.getOwnPropertyDescriptor(r,t);Object.defineProperty(e,t,a.get?a:{enumerable:!0,get:()=>r[t]})}}return e.default=r,Object.freeze(e)}const oe=Je(Le),z="___ALL_ENTITIES___";class m{cache;constructor(e){this.cache=new Ve({stdTTL:e,checkperiod:e*.2,useClones:!1})}async get(e){const t=this.normalizeKey(e),a=this.cache.get(t);if(a)return a;const n=await this.fetchFromDb(e);return n&&this.cache.set(t,n),n}async update(e,t,a){const n=await this.updateInDb(e,t,a);if(n){const i=this.getKey(n);this.cache.del(z),this.cache.set(this.normalizeKey(i),n)}return n}invalidate(e){this.cache.del(z),e&&this.cache.del(this.normalizeKey(e))}clearAll(){this.cache.flushAll()}}class b extends m{async getAll(){const e=this.cache.get(z);if(e)return e;const t=await this.fetchManyFromDb({});return this.cache.set(z,t),t.forEach(a=>{this.cache.set(this.normalizeKey(this.getKey(a)),a)}),t}async getMany(e){const t=await this.fetchManyFromDb(e);return t.forEach(a=>{this.cache.set(this.normalizeKey(this.getKey(a)),a)}),t}}const Ee=new oe.EventEmitter,h=(r,e,t)=>{Ee.emit(r,e,t)},Ze=r=>{for(const[e,t]of Object.entries(r))Ee.on(e,(a,n)=>{t(a,n)})},w={CREW:"middleware/quest/CREW",CREW_META:"middleware/quest/CREW_META",CREW_ORNAMENTS:"middleware/quest/CREW_ORNAMENTS",CREW_QUEST:"middleware/quest/CREW_QUEST",CREW_STATS_ENGAGEMENT:"middleware/quest/CREW_STATS_ENGAGEMENT",CREW_STATS_FREQUENCY:"middleware/quest/CREW_STATS_FREQUENCY",USER:"middleware/quest/USER",USER_CREW:"middleware/quest/USER_CREW",USER_INVENTORY:"middleware/quest/USER_INVENTORY",USER_META:"middleware/quest/USER_META",USER_ORNAMENT:"middleware/quest/USER_ORNAMENT",USER_QUEST:"middleware/quest/USER_QUEST",USER_STATS_CASINO:"middleware/quest/USER_STATS_CASINO",USER_STATS_CREW:"middleware/quest/USER_STATS_CREW",USER_STATS_ECONOMY:"middleware/quest/USER_STATS_ECONOMY",USER_STATS_ENGAGEMENT:"middleware/quest/USER_STATS_ENGAGEMENT",USER_STATS_FLAGS:"middleware/quest/USER_STATS_FLAGS",USER_STATS_FREQUENCY:"middleware/quest/USER_STATS_FREQUENCY",USER_STATS_INVENTORY:"middleware/quest/USER_STATS_INVENTORY"},Ie=new oe.EventEmitter,P=(r,e,t)=>{Ie.emit(r,e,t)},et=r=>{for(const[e,t]of Object.entries(r))Ie.on(e,(a,n)=>{t(a,n)})},K={USER_INVENTORY:"middleware/raid/USER_INVENTORY",USER_QUEST:"middleware/raid/USER_QUEST",USER_RAID:"middleware/raid/USER_RAID"},Ue=new s.Schema({createdBy:s.Schema.Types.ObjectId,name:String,description:String,channelId:String,memberLimit:{type:Number,default:f.CREW_DEFAULT_MEMBER_LIMIT},disintegration:{type:Number,default:f.CREW_DEFAULT_DISINTEGRATION},faction:String},{timestamps:!0,minimize:!1});Ue.post("findOneAndUpdate",async function(r){h(w.CREW,r._id,r)});const Q=s.models?.Crew||s.model("Crew",Ue);class tt extends m{async getCrewRank(e){return(await Q.aggregate([{$lookup:{from:"crewmetas",localField:"_id",foreignField:"crew",as:"meta"}},{$unwind:"$meta"},{$setWindowFields:{sortBy:{"meta.xp":-1},output:{rank:{$rank:{}}}}},{$match:{_id:e}},{$project:{_id:1,rank:1}}]))[0]}getCrewRanking(){return Q.aggregate([{$lookup:{from:"crewmetas",localField:"_id",foreignField:"crew",as:"meta"}},{$unwind:"$meta"},{$sort:{"meta.xp":-1}},{$limit:10},{$project:{_id:1,"meta.xp":1}}])}async increaseLimit(e){await this.update(e,{$inc:{memberLimit:1}})}async repair(e,t){await this.update(e,[{$set:{disintegration:{$min:[{$add:["$disintegration",t]},100]}}}])}async applyDisintegration(e){const t=await this.get(e);if(!t)return;const{memberLimit:a}=t,[n,i]=[a-2,(a-3)*2+3];await this.update(e,[{$set:{disintegration:{$max:[{$add:["$disintegration",-1*o.randomBetween(n,i)]},0]}}}])}}const rt=async r=>{const e=await Q.findById(r).lean();return e||null},at=(r,e)=>Q.findOneAndUpdate({_id:r},e,{returnDocument:"after"}).lean();class nt extends tt{constructor(){super(3600)}normalizeKey(e){return e.toString()}getKey({_id:e}){return e}fetchFromDb(e){return rt(e)}updateInDb(e,t){return at(e,t)}}const Oe=new nt;class st extends m{async hasXpBuff(e){const t=await this.get(e);if(!o.hasExpire(t.buffs.xp.expireAt))return t.buffs.xp}async calcXp(e,t){const a=await Oe.get(e);return a?Math.ceil(t*(a.disintegration/f.CREW_DEFAULT_DISINTEGRATION)*((await this.hasXpBuff(e))?.boost??1)):0}async addXp(e,t){await this.update(e,{$inc:{xp:t}})}async addBerry(e,t){await this.update(e,{$inc:{berry:t}})}async removeBerry(e,t){await this.update(e,{$inc:{berry:-t}})}async addXpBuff(e,t){const a=new Date;await this.update(e,[{$set:{"buffs.xp":{$cond:{if:{lt:["$buffs.xp.expireAt",a]},then:{boost:1.1,expireAt:{$add:[a,t*60*60*1e3]}},else:{boost:1.1,expireAt:{$add:["$buffs.xp.expireAt",t*60*60*1e3]}}}}}}])}}const y=r=>r.toObject({flattenMaps:!0,flattenObjectIds:!1}),De=new s.Schema({crew:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"Crew"},xp:{type:Number,default:0,index:-1},berry:{type:Number,default:0,index:-1},buffs:{xp:{boost:{type:Number,default:1.1},expireAt:{type:Date,default:new Date(0)}}}});De.post("findOneAndUpdate",async function(r){h(w.CREW_META,r.crew._id,r)});const pe=s.models?.CrewMeta||s.model("CrewMeta",De),it=async r=>await pe.create({crew:r});async function ut(r){const e=await pe.findOne({crew:r}).lean();return e||y(await it(r))}const ct=(r,e)=>pe.findOneAndUpdate({crew:r},e,{returnDocument:"after",upsert:!0}).lean();class dt extends st{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({crew:e}){return e}fetchFromDb(e){return ut(e)}updateInDb(e,t){return ct(e,t)}}const ye=new dt;class lt extends m{async unlockBadge(e,t,a){t.isProgressive?await this.update(e,{$addToSet:{unlockedBadges:`${t.id}_${a}`}}):await this.update(e,{$addToSet:{unlockedBadges:t.id}})}}const Te=new s.Schema({crew:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"Crew"},unlockedBadges:{type:[String],default:[]}});Te.post("findOneAndUpdate",async function(r){h(w.CREW_ORNAMENTS,r.crew._id,r)});const fe=s.models?.CrewOrnaments||s.model("CrewOrnaments",Te),ot=r=>fe.create({crew:r});async function pt(r){const e=await fe.findOne({crew:r}).lean();return e||y(await ot(r))}const yt=(r,e)=>fe.findOneAndUpdate({crew:r},e,{upsert:!0,returnDocument:"after"}).lean();class ft extends lt{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({crew:e}){return e}fetchFromDb(e){return pt(e)}updateInDb(e,t){return yt(e,t)}}const mt=new ft;class ht extends b{async getStatus(e,t){return(await this.get({crew:e,questId:t})).status}async isCompleted(e,t){return await this.getStatus(e,t)==="COMPLETED"}async isStreaking(e,t){const{lastCompletionDate:a}=await this.get({crew:e,questId:t});return!!a&&o.sameDay(o.yesterday(),a)}async completeQuest(e){return this.update(e,[{$set:{lastCompletionDate:new Date,status:f.QuestStatus.COMPLETED}}],{upsert:!1})}}const Re=new s.Schema({crew:{type:s.Schema.Types.ObjectId,required:!0,ref:"Crew",index:!0},questId:{type:String,required:!0,index:!0},status:{type:String,default:f.QuestStatus.IN_PROGRESS,index:!0},lastCompletionDate:Date},{minimize:!1});Re.post("findOneAndUpdate",function(r){h(w.CREW_QUEST,r.crew._id,r)});const H=s.models?.CrewQuest||s.model("CrewQuest",Re);function wt(r){return H.find(r).lean()}const St=async r=>await H.create({...r});async function gt(r){const e=await H.findOne(r).lean();return e||y(await St(r))}function bt(r,e,t){return H.findOneAndUpdate(r,e,{upsert:!0,...t,returnDocument:"after"}).lean()}class $t extends ht{constructor(){super(300)}normalizeKey({crew:e,questId:t}){return`${e.toString()}/${t}`}getKey({crew:e,questId:t}){return{crew:e,questId:t}}fetchFromDb(e){return gt(e)}fetchManyFromDb(e){return wt(e)}updateInDb(e,t,a){return bt(e,t,a)}}const Et=new $t;class It extends m{async setActualVoiceMembers(e,t){await this.update(e,{$set:{"currentVoiceState.amount":t,"currentVoiceState.connectedAt":new Date}})}async setMaxVoiceMembers(e,t){await this.update(e,{$set:{maxVoiceMembersReached:t}})}}const ve=new s.Schema({crew:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"Crew"},maxVoiceMembersReached:{type:Number,default:0},currentVoiceState:{amount:{type:Number,default:0},connectedAt:{type:Date,default:new Date(0)}}});ve.post("findOneAndUpdate",function(r){h(w.CREW_STATS_ENGAGEMENT,r.crew._id,r)});const me=s.models?.CrewStatsEngagement||s.model("CrewStatsEngagement",ve),Ut=r=>me.create({crew:r});async function Ot(r){const e=await me.findOne({crew:r}).lean();return e||y(await Ut(r))}const Dt=(r,e)=>me.findOneAndUpdate({crew:r},e,{upsert:!0,returnDocument:"after"}).lean();class Tt extends It{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({crew:e}){return e}fetchFromDb(e){return Ot(e)}updateInDb(e,t){return Dt(e,t)}}const Rt=new Tt;class vt extends m{}const Ce=new s.Schema({crew:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"Crew"},streak80Percent:{type:Number,default:0}});Ce.post("findOneAndUpdate",function(r){h(w.CREW_STATS_FREQUENCY,r.crew._id,r)});const he=s.models?.CrewStatsFrequency||s.model("CrewStatsFrequency",Ce),Ct=r=>he.create({crew:r});async function At(r){const e=await he.findOne({crew:r}).lean();return e||y(await Ct(r))}const Mt=(r,e)=>he.findOneAndUpdate({crew:r},e,{upsert:!0,returnDocument:"after"}).lean();class Bt extends vt{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({crew:e}){return e}fetchFromDb(e){return At(e)}updateInDb(e,t){return Mt(e,t)}}const _t=new Bt,Ae=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,ref:"User",index:!0},questId:{type:String,required:!0,index:!0},status:{type:String,default:f.QuestStatus.IN_PROGRESS,index:1},lastCompletionDate:Date,streak:Number},{minimize:!1});Ae.post("findOneAndUpdate",function(r){P(K.USER_QUEST,r.user._id,r),h(w.USER_QUEST,r.user._id,r)});const R=s.models?.UserQuest||s.model("UserQuest",Ae),qt=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)}}}),W=s.models?.UserCooldown||s.model("UserCooldown",qt),Me=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},crew:{type:s.Schema.Types.ObjectId,ref:"Crew",required:!0,index:!0},permission:{type:String,default:"member",required:!0},percent:{type:Number,default:f.CREW_DEFAULT_XP_PERCENT}},{minimize:!1});Me.post("findOneAndUpdate",function(r){h(w.USER_CREW,r.user._id,r)});const v=s.models?.UserCrew||s.model("UserCrew",Me),kt=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}}),G=s.models?.UserDailyReport||s.model("UserDailyReport",kt),Nt=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},encyclopedia:{type:[String],default:[]}}),Y=s.models?.UserEncyclopedia||s.model("UserEncyclopedia",Nt),xt=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}}),X=s.models?.UserGames||s.model("UserGames",xt),Be=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});Be.post("findOneAndUpdate",function(r){P(K.USER_INVENTORY,r.user._id,r),h(w.USER_INVENTORY,r.user._id,r)});const V=s.models?.UserInventory||s.model("UserInventory",Be),Ft=new oe.EventEmitter,jt=(r,e)=>{Ft.emit(r,e)},C={multiplier:{type:Number,default:0},origin:String,expireAt:{type:Date,default:null},startAt:{type:Date,default:null}},_e=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},premium:{type:Date,default:null},booster:{type:Boolean,default:!1},scam:{type:Boolean,default:!1},berry:{type:Number,default:1e3,index:-1},xp:{lastMessageWithXp:{type:Date,default:new Date},voice:{lastConnection:{type:Date,default:new Date},minutesInVoiceToday:{type:Number,default:0}},amount:{type:Number,default:0,index:-1},boost:{type:Date,default:null}},buffs:{cooldown:{casino:{type:[C],default:[]},work:{type:[C],default:[]}},berry:{work:{type:[C],default:[]},global:{type:[C],default:[]}},drop:{work:{type:[C],default:[]}},xp:{global:{type:[C],default:[]}}},hp:{type:Number,default:100},workUnluckyStreak:{type:Number,default:0},characteristics:{vitality:{type:Number,default:0},strength:{type:Number,default:0},agility:{type:Number,default:0},chance:{type:Number,default:0},intelligence:{type:Number,default:0},wisdom:{type:Number,default:0}},resetCharacteristics:{free:{type:Boolean,default:!0},nextAvailable:{type:Date,default:null}},scrolls:{vitality:{type:Number,default:0},strength:{type:Number,default:0},agility:{type:Number,default:0},chance:{type:Number,default:0},intelligence:{type:Number,default:0},wisdom:{type:Number,default:0}}});_e.post("findOneAndUpdate",async function(r){h(w.USER_META,r.user._id,r),r.hp<=0&&jt("death",r.user._id)});const D=s.models?.UserMeta||s.model("UserMeta",_e),qe=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"}});qe.post("findOneAndUpdate",function(r){h(w.USER_ORNAMENT,r.user._id,r)});const L=s.models?.UserOrnament||s.model("UserOrnament",qe),ke=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},currentRaid:{type:{raidId:String,seed:String,progression:{type:[String],default:[]},buffItem:String,rewards:{type:s.Schema.Types.Mixed,default:{}}},default:void 0},obtainedConditions:{type:s.Schema.Types.Mixed,default:{},_id:!1},obtainedRewards:{type:s.Schema.Types.Mixed,default:{},_id:!1},unlocked:{type:s.Schema.Types.Mixed,default:{},_id:!1}},{minimize:!1});ke.post("findOneAndUpdate",function(r){P(K.USER_RAID,r.user._id,r)});const J=s.models?.UserRaid||s.model("UserRaid",ke),zt=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}}}}),q=s.models?.UserSettings||s.model("UserSettings",zt),Pt=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}),Z=s.models?.UserShop||s.model("UserShop",Pt),Ne=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}}});Ne.post("findOneAndUpdate",function(r){h(w.USER_STATS_CASINO,r.user._id,r)});const A=s.models?.UserStatsCasino||s.model("UserStatsCasino",Ne),xe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},xpGivenToCrew:{type:Number,default:0},berryGivenToCrew:{type:Number,default:0},timeCrewBeyond10PercentXp:{type:Number,default:0},timeCrewAbove90PercentXp:{type:Number,default:0}});xe.post("findOneAndUpdate",function(r){h(w.USER_STATS_CREW,r.user._id,r)});const ee=s.models?.UserStatsCrew||s.model("UserStatsCrew",xe),Fe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},workCount:{type:Number,default:0},raidFinishedCount:{type:Number,default:0},totalSpentInShop:{type:Number,default:0}});Fe.post("findOneAndUpdate",function(r){h(w.USER_STATS_ECONOMY,r.user._id,r)});const te=s.models?.UserStatsEconomy||s.model("UserStatsEconomy",Fe),je=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:[]}});je.post("findOneAndUpdate",function(r){h(w.USER_STATS_ENGAGEMENT,r.user._id,r)});const re=s.models?.UserStatsEngagement||s.model("UserStatsEngagement",je),ze=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}}});ze.post("findOneAndUpdate",function(r){h(w.USER_STATS_FLAGS,r.user._id,r)});const ae=s.models?.UserStatsFlags||s.model("UserStatsFlags",ze),Pe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},edito:{readToday:{type:Number,default:0},lastTimeRead:{type:Date,default:new Date}}});Pe.post("findOneAndUpdate",function(r){h(w.USER_STATS_FREQUENCY,r.user._id,r)});const M=s.models?.UserStatsFrequency||s.model("UserStatsFrequency",Pe),Ke=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}}});Ke.post("findOneAndUpdate",function(r){h(w.USER_STATS_INVENTORY,r.user._id,r)});const B=s.models?.UserStatsInventory||s.model("UserStatsInventory",Ke),we=new s.Schema({discordId:{type:String,required:!0,unique:!0},birthday:{type:Date,default:null,index:1},faction:{type:String,default:f.DEFAULT_FACTION,index:1},canChangeFaction:{type:Boolean,default:!1},canChooseFaction:{type:Boolean,default:!1}});we.post("findOneAndUpdate",function(r){h(w.USER,r._id,r)}),we.post("deleteOne",async function(){const r=this.getQuery()._id;await W.deleteOne({user:r}),await v.deleteOne({user:r}),await G.deleteOne({user:r}),await Y.deleteOne({user:r}),await X.deleteOne({user:r}),await V.deleteOne({user:r}),await D.deleteOne({user:r}),await L.deleteOne({user:r}),await R.deleteMany({user:r}),await J.deleteOne({user:r}),await q.deleteOne({user:r}),await Z.deleteOne({user:r}),await A.deleteOne({user:r}),await ee.deleteOne({user:r}),await te.deleteOne({user:r}),await re.deleteOne({user:r}),await ae.deleteOne({user:r}),await M.deleteOne({user:r}),await B.deleteOne({user:r})});const E=s.models?.User||s.model("User",we);class Kt extends b{getByObjectId(e){return this.update({_id:e},{})}getNextBirthdays(){const e=new Date,t=e.getFullYear();return E.aggregate([{$match:{birthday:{$ne:null}}},{$set:{birthdayThisYear:{$dateFromParts:{year:t,month:{$month:"$birthday"},day:{$dayOfMonth:"$birthday"}}}}},{$set:{nextBirthday:{$cond:[{$lt:["$birthdayThisYear",e]},{$dateFromParts:{year:{$add:[t,1]},month:{$month:"$birthday"},day:{$dayOfMonth:"$birthday"}}},"$birthdayThisYear"]}}},{$sort:{nextBirthday:1}},{$limit:10},{$project:{_id:0,discordId:1,birthday:1,nextBirthday:1}}])}getFactionRanking(e){return E.aggregate([{$match:{faction:e}},{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$sort:{"meta.xp.amount":-1}},{$limit:10},{$project:{_id:1,discordId:1,"meta.xp.amount":1}}])}getGlobalRanking(){return E.aggregate([{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$sort:{"meta.xp.amount":-1}},{$limit:10},{$project:{_id:1,discordId:1,"meta.xp.amount":1}}])}getBerryRanking(){return E.aggregate([{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$sort:{"meta.berry":-1}},{$limit:10},{$project:{_id:1,discordId:1,"meta.berry":1}}])}getQuestRanking(){return R.aggregate([{$match:{status:f.QuestStatus.COMPLETED}},{$group:{_id:"$user",questCount:{$sum:1}}},{$setWindowFields:{sortBy:{questCount:-1},output:{rank:{$rank:{}}}}},{$project:{_id:0,discordId:"$_id",questCount:1,rank:1}},{$sort:{rank:1}}])}getTodayAllBirthday(){const e=new Date;return E.aggregate([{$match:{birthday:{$ne:null}}},{$addFields:{birthMonth:{$month:"$birthday"},birthDay:{$dayOfMonth:"$birthday"}}},{$addFields:{currentMonth:{$month:e},currentDay:{$dayOfMonth:e}}},{$match:{$expr:{$and:[{$eq:["$birthMonth","$currentMonth"]},{$eq:["$birthDay","$currentDay"]}]}}}])}async canChooseFaction(e,t){typeof e=="string"?await this.update({discordId:e},{$set:{canChooseFaction:t}}):await this.update({_id:e},{$set:{canChooseFaction:t}})}async canChangeFaction(e,t){typeof e=="string"?await this.update({discordId:e},{$set:{canChangeFaction:t}}):await this.update({_id:e},{$set:{canChangeFaction:t}})}async setBirthday(e,t){await this.update({discordId:e},{$set:{birthday:t}})}async updateFaction(e,t){await this.update({discordId:e},{$set:{faction:t}})}}const Qt=r=>E.find(r),Ht=r=>E.create({discordId:r});async function Wt(r){const e=await E.findOne({discordId:r}).lean();return e||y(await Ht(r))}const Gt=(r,e)=>E.findOneAndUpdate(r,e,{upsert:!0,returnDocument:"after"});class Yt extends Kt{constructor(){super(3600)}normalizeKey(e){return e}getKey({discordId:e}){return e}fetchFromDb(e){return Wt(e)}fetchManyFromDb(e){return Qt(e)}updateInDb(e,t){return Gt(e,t)}}const Qe=new Yt,Xt=["work",...f.GAME_TYPES],Vt=new s.Schema({user:{type:s.Schema.Types.ObjectId,ref:"User",required:!0,index:!0},date:{type:Date,index:-1,required:!0},type:{type:String,required:!0}},{minimize:!1}),k=s.models?.Reminder||s.model("Reminder",Vt),Lt=async r=>{await k.deleteMany(r)},Jt=async(r,e)=>{await k.deleteOne({user:r,type:e})};class Zt extends b{getAllPassedReminder(){return this.getMany({date:{$lte:new Date}})}async addReminder(e,t,a){await this.update({user:e,type:t},{$set:{date:a}},{upsert:!0})}async updateReminderDate(e,t,a){await this.update({user:e,type:t},[{$set:{date:{$add:["$date",a]}}}])}async removeReminder(e,t){await Jt(e,t),this.invalidate({user:e,type:t})}async deleteSelectedReminders(e){const t=await this.getMany({_id:{$in:e}});await Lt({_id:{$in:e}}),t.forEach(a=>{this.invalidate({user:a.user,type:a.type})})}}function er(r,e={}){return k.find(r,e).lean()}async function tr(r){const e=await k.findOne(r).lean();return e||null}async function rr(r,e,t){return k.findOneAndUpdate(r,e,{...t,returnDocument:"after"}).lean()}class ar extends Zt{constructor(){super(300)}getKey(e){return{user:e.user,type:e.type}}normalizeKey({user:e,type:t}){return`${e.toString()}/${t}`}fetchFromDb(e){return tr(e)}fetchManyFromDb(e,t){return er(e,t)}updateInDb(e,t,a={upsert:!1}){return rr(e,t,a)}}const N=new ar;class nr extends b{async isOrnamentIds(e,t=()=>!0){const n=(await this.getAll()).filter(t).map(({ornamentId:i})=>i);return e.every(i=>n.includes(i))}isOrnament(e){return!!e&&"ornamentId"in e}isTitle(e){return e.type==="title"}isBackground(e){return e.type==="background"}isQuestTitle(e){return this.isTitle(e)&&!("faction"in e)&&!("price"in e)}isFactionTitle(e){return this.isTitle(e)&&"faction"in e}isShopTitle(e){return this.isTitle(e)&&"price"in e}async getAllBackgrounds(){return(await this.getAll()).filter(this.isBackground)}async getAllTitles(){return(await this.getAll()).filter(this.isTitle)}async getAllFactionTitles(){return(await this.getAll()).filter(this.isFactionTitle)}async getAllQuestTitles(){return(await this.getAll()).filter(this.isQuestTitle)}async getAllShopTitles(){return(await this.getAll()).filter(this.isShopTitle)}formatBackgroundId(e){return e.ornamentId==="background_default"?"par défaut":`"${o.capitalizeAllWords(e.ornamentId.split("_").join(" "))}"`}pickOrnament(e){const t=Math.random();let a=0;if(Object.keys(e).map(i=>parseFloat(i)).reduce((i,u)=>i+u,0)!==1)throw RangeError("pickOrnament - Sum of all odds (keys) must be equal to 1");for(const[i,u]of Object.entries(e)){const l=parseFloat(i);if(t>=a+l){a+=l;continue}if(u.length!==0)return u[o.randomBetween(0,u.length)]}throw Error("pickOrnament - All ods array were empty")}pickEachRarityOrnament(e,t){if(t.length!==f.RANK_IDS_WITHOUT_BASIC.length)throw new RangeError("pickEachRarityOrnament - must give same number of odds than ranks");return o.filterNullAndUndefined(t.map((a,n)=>{const i=f.RANK_IDS_WITHOUT_BASIC[n],u=e[i];return Math.random()>a||!u||!u.length?null:o.pickFrom(u)}))}}const sr=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}),Se=s.models?.Ornaments||s.model("Ornaments",sr),ir=async(r,e={})=>Se.find(r,e).lean();async function ur(r){const e=await Se.findOne({ornamentId:r}).lean();return e||null}const cr=(r,e)=>Se.findOneAndUpdate(r,e,{returnDocument:"after"}).lean();class dr extends nr{constructor(){super(3600)}updateInDb(e,t){return cr(e,t)}fetchFromDb(e){return ur(e)}fetchManyFromDb(e){return ir(e)}getKey(e){return e.ornamentId}normalizeKey(e){return e}}const g=new dr,lr=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}),x=s.models?.Panoplies||s.model("Panoplies",lr),or=r=>x.find(r).lean(),pr=async r=>x.find(r).populate("equipments");async function yr(r){const e=await x.findOne({panoplyId:r}).lean();return e||null}const fr=async r=>x.findOne(r).populate("equipments");class mr extends b{getAllPopulated(){return pr({})}getPopulated(e){return fr({panoplyId:e})}hasPanoply(e,t){const a=o.filterNullAndUndefined(Object.values(e)),n=t.equipments.filter(i=>a.find(u=>u.entityId===i.entityId)).length;if(n===t.equipments.length)return t.fullBonus;if(n>=t.equipments.length/2)return t.halfBonus}async getPanoplyBonus(e){const t=[],a=await this.getAllPopulated();for(const n of a){const i=o.filterNullAndUndefined(Object.values(e)),u=n.equipments.filter(l=>i.find(({entityId:c})=>c===l.entityId));u.length===n.equipments.length?t.push([n,"full"]):u.length>=n.equipments.length/2?t.push([n,"half"]):u.length>=1&&t.push([n,null])}return t}}const hr=async(r,e)=>x.findOneAndUpdate(r,e,{returnDocument:"after"}).lean();class wr extends mr{constructor(){super(3600)}normalizeKey(e){return e}getKey({panoplyId:e}){return e}updateInDb(e,t){return hr(e,t)}fetchFromDb(e){return yr(e)}fetchManyFromDb(e={}){return or(e)}}const I=new wr;class Sr extends b{isEntity(e){return!!e&&"entityId"in e}isItem(e){return e.category!=="equipment"}isEquipment(e){return e.category==="equipment"}async isEntityId(e,t=()=>!0){return(await this.getAll()).filter(t).map(({entityId:n})=>n).includes(e)}async getSomeStoreItems(e){const t=(await this.getAll()).filter(this.isStoreItem);return this.getSomeItems(e,t)}async getSomeRepairItems(e){const t=(await this.getAll()).filter(this.isRepairItem);return o.shuffle(t).slice(0,e)}async getSomeObjectItems(e){const t=(await this.getAll()).filter(this.isObjectItem);return o.shuffle(t.filter(a=>!!a.shop?.price)).slice(0,e)}async idArrayToEntities(e){return(await this.getAll()).filter(t=>e.includes(t.entityId))}recordToEntities(e){return this.idArrayToEntities(Object.keys(e))}async recordToEntityTuple(e){const t=await this.getAll();return o.recordToArray(e).reduce((a,[n,i])=>{const u=t.find(({entityId:l})=>l===n);return u&&a.push([u,i]),a},[])}async getAllEntitiesLimit(){const e=await this.getAll();return o.arrayToRecord(e.map(t=>[t.entityId,t.shop?.limit??0]))}async getAllEntitiesBy(e){return(await this.getAll()).filter(e)}async fromDBToEquipableEquipment(e){const a=(await this.getAll()).filter(this.isEquipment).find(({entityId:n})=>n===e.entityId);if(!a)throw new Error(`cannot find any equipment: ${e.entityId}`);return this.seedEquipment(a,e.seed)}async getUserEquipmentsCharacteristics(e){let t={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};const a=await I.getAllPopulated();for(const n of f.EQUIPMENT_SLOT){const i=e[n];i&&(t=o.mergeObjects(t,(await this.fromDBToEquipableEquipment(i)).characteristics,(u,l)=>u+l))}for(const n of a){const i=I.hasPanoply(e,n);i&&!("target"in i)&&(t=o.mergeObjects(t,i,(u,l)=>u+l))}return t}getSomeItems(e,t){const a=[];for(;a.length<e;){const n=o.exclude(t,a,i=>i.entityId);a.push(g.pickOrnament(o.groupBy(n,i=>i.shop?.odd??0)))}return o.sortBy(a,n=>n.shop?.price??0)}filterCraftEntities(e){return e.filter(t=>t.usage?.craft)}filterDismantleEntities(e){return e.filter(t=>t.usage?.dismantle)}filterUsableEntities(e){return e.filter(t=>t.usage?.mode)}filterEnchantableEntities(e){return e.filter(t=>t.usage?.enchant)}hasCraftEntities(e){return!!e.find(t=>t.usage?.craft)}hasDismantleEntities(e){return!!e.find(t=>t.usage?.dismantle)}hasEnchantableEntities(e){return!!e.find(t=>t.usage?.enchant)}hasUsableEntities(e){return!!e.find(t=>t.usage?.mode)}isChestItem(e){return e.type==="chest"}isBottleItem(e){return e.type==="bottle"}isBoostItem(e){return e.type==="boost"}isRepairItem(e){return e.type==="repair"}isStoreItem(e){return e.type==="store"}isObjectItem(e){return e.type==="object"}isScrollItem(e){return e.type==="scroll"}isCookedMeal(e){return e.type==="cookedMeal"}isAlcoholItem(e){return e.type==="alcohol"}isSameEquipment(e,t){return e.entityId===t.entityId&&e.seed===t.seed}seedEquipment(e,t){const a=o.seededRandom(t),n=o.sortBy(o.recordToArray(e.characteristics),([i])=>i);return{...e,seed:t,characteristics:Object.fromEntries(n.map(([i,u])=>[i,Array.isArray(u)?o.randomBetween(u[0],u[1]+1,a):u]))}}isEquipped(e,t){return!!Object.values(e).find(a=>a&&this.isSameEquipment(a,t))}calcILvl(e){return Object.values(e.characteristics).reduce((a,n)=>a+n,0)+e.level}}const gr=new s.Schema({type:{type:String,enum:f.EFFECT_KEYS,required:!0},params:{type:s.Schema.Types.Mixed}},{_id:!1}),br=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:[gr],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}),ne=s.models?.Entities||s.model("Entities",br),$r=async r=>await ne.create({...r}),Er=async(r,e={})=>ne.find(r,e).lean();async function Ir(r){const e=await ne.findOne({entityId:r}).lean();return e||null}const Ur=(r,e)=>ne.findOneAndUpdate(r,e,{returnDocument:"after"}).lean();class Or extends Sr{constructor(){super(3600)}createInDb(e){return $r(e)}updateInDb(e,t){return Ur(e,t)}fetchFromDb(e){return Ir(e)}fetchManyFromDb(e){return Er(e)}normalizeKey(e){return e}getKey(e){return e.entityId}}const p=new Or,Dr=(r,e,t)=>v.create({user:r,crew:e,permission:t}),Tr=async r=>{await v.deleteOne({user:r})};class Rr extends b{async updatePercent(e,t){await this.update(e,{$set:{percent:t}})}async updatePermission(e,t){await this.update(e,{$set:{permission:t}})}async addUserToCrew(e,t,a){await Dr(e,t,a),this.invalidate(t)}async removeUserFromCrew(e,t){await Tr(e),this.invalidate(e),this.invalidate(t)}async getAllUserIdsFromCrew(e){const t=e.toString(),a=this.cache.get(t);if(a)return a.map(({user:i})=>i);const n=await this.getMany({crew:e});return this.cache.set(t,n),n.map(({user:i})=>i)}}const vr=r=>v.find(r).lean(),Cr=r=>v.findOne({user:r}).lean(),Ar=(r,e)=>v.findOneAndUpdate({user:r},e,{returnDocument:"after"}).lean();class Mr extends Rr{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Cr(e)}fetchManyFromDb(e){return vr(e)}updateInDb(e,t){return Ar(e,t)}}const He=new Mr;class Br extends m{hasAlreadyFoundEntity(e,t){return e.encyclopedia.includes(t)}async addEntities(e,t){await this.update(e,{$addToSet:{encyclopedia:{$each:t}}})}}const _r=async r=>await Y.create({user:r});async function qr(r){const e=await Y.findOne({user:r}).lean();return e||y(await _r(r))}const kr=(r,e)=>Y.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class Nr extends Br{constructor(){super(300)}fetchFromDb(e){return qr(e)}getKey({user:e}){return e}normalizeKey(e){return e.toString()}updateInDb(e,t){return kr(e,t)}}const se=new Nr;class xr extends m{getPanoplyEffectiveBonus(e,t){const a=o.filterNullAndUndefined(Object.values(e.equippedItems)),n=t.equipments.filter(i=>a.find(u=>u.entityId===i.entityId)).length;if(n===t.equipments.length)return t.fullBonus;if(n>=t.equipments.length/2)return t.halfBonus}async getUserEquipmentsCharacteristics(e){let t={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};const a=await I.getAllPopulated();for(const n of f.EQUIPMENT_SLOT){const i=e.equippedItems?.[n];if(!i)continue;const u=await p.fromDBToEquipableEquipment(i);t=o.mergeObjects(t,u.characteristics,(l,c)=>l+c)}for(const n of a){const i=this.getPanoplyEffectiveBonus(e,n);i&&!("target"in i)&&(t=o.mergeObjects(t,i,(u,l)=>u+l))}return t}async hasInventoryRequirements(e,t){const a=await this.get(e);return o.recordToArray(t).reduce((n,[i,u])=>n&&(a.itemList[i]??0)>=(u??0),!0)}async hasEnoughEntity(e,t,a){return((await this.get(e)).itemList[a]??0)>=t}async getItemList(e){return(await this.get(e)).itemList}async calcBottleMultiplier(e,{bottle:{buffs:t}}){const a=await this.get(e),i=(await I.getPanoplyBonus(a.equippedItems)).find(([u,l])=>u.panoplyId==="herbalist"&&l!==null);return i&&i[1]==="full"?t.map(u=>({...u,multiplier:u.multiplier*1.25})):i&&i[1]==="half"?t.map(u=>({...u,multiplier:u.multiplier*1.1})):t}async calcMinStreakForWorkLoot(e){const t=await this.get(e),a=(await I.getPanoplyBonus(t.equippedItems)).find(([n,i])=>n.panoplyId==="marine"&&i!==null);return a&&a[1]==="full"?10:a&&a[1]==="half"?20:1/0}async hasRevolutionaryBuff(e){const t=await this.get(e);return(await I.getPanoplyBonus(t.equippedItems)).find(([n,i])=>n.panoplyId==="revolutionary"&&i!==null)?.[1]??null}async addItem(e,t,a){await this.update(e,{$inc:{[`itemList.${t}`]:a}}),await se.addEntities(e,[t])}async addItems(e,t){await this.update(e,{$inc:Object.fromEntries(Object.entries(t).filter(([,a])=>(a??0)>0).map(([a,n])=>[`itemList.${a}`,n]))}),await se.addEntities(e,o.recordToArray(t).filter(([,a])=>a>0).map(([a])=>a))}async removeItem(e,t,a){a!==0&&await this.update(e,[{$set:{[`itemList.${t}`]:{$max:[{$add:[`$itemList.${t}`,-a]},0]}}}])}async removeEquipment(e,t,a){await this.update(e,{$pull:{equipmentList:{entityId:t,seed:a}}})}async removeAllItem(e,t){await this.update(e,{$set:{[`itemList.${t}`]:0}})}async addEquipments(e,t){await this.update(e,{$push:{equipmentList:{$each:t}}}),await se.addEntities(e,t.map(a=>a.entityId))}async saveEquipments(e){await this.update(e,[{$set:{equipmentSave:{$push:["$equipmentSave","$equippedItems"]}}}])}async changeEquippedEquipment(e,t){const a=await this.get(e);a?.equipmentSave[t]&&await this.equip(e,a.equipmentSave[t])}async equip(e,t){const a=await U.getMaxHp(e),n=Object.fromEntries(o.recordToArray(t).map(([i,u])=>[`equippedItems.${i}`,u]));await this.update(e,{$set:n}),await U.updateHp(e,a)}async unequip(e,t){const a=await U.getMaxHp(e);await this.update(e,{$set:{[`equippedItems.${t}`]:null}}),await U.updateHp(e,a)}async craftItem(e,t,a,n){for(const{entityId:l,size:c}of t.entities)await this.removeItem(e,l,c*a);const{entityId:i,size:u}=t.result;await p.isEntityId(i,p.isEquipment)?await this.addEquipments(e,[{entityId:i,seed:n}]):await p.isEntityId(i,p.isItem)&&await this.addItem(e,i,u*a)}async dismantleEntity(e,t,a,n,i){p.isEquipment(t)?await this.removeEquipment(e,t.entityId,i):p.isItem(t)&&await this.removeItem(e,t.entityId,n);for(const{entityId:u,quantity:l}of a)await p.isEntityId(u,p.isItem)&&await this.addItem(e,u,n*l);await this.removeItem(e,"tools",1)}async enchantItem(e,t,a,n,i){await this.removeItem(e,t,i*4),await this.removeItem(e,n,i),await this.addItem(e,a,i)}async unlockRecipe(e,t){await this.update(e,{$addToSet:{recipes:t}})}}const Fr=r=>V.create({user:r});async function jr(r){const e=await V.findOne({user:r}).lean();return e||y(await Fr(r))}const zr=(r,e)=>V.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class Pr extends xr{constructor(){super(300)}fetchFromDb(e){return jr(e)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}updateInDb(e,t){return zr(e,t)}}const S=new Pr;class Kr extends b{async getTotalCharacteristics(e){const{characteristics:t,scrolls:a}=await this.get(e);return o.arrayToRecord(f.CHARACTERISTICS.map(n=>[n,f.getComputedCharacteristicValue(t[n])+a[n]]))}async isCooldownForXpPassed(e){const t=await this.get(e);return Date.now()-t.xp.lastMessageWithXp.getTime()>60*1e3}async getAllWithExpiredBuffs(){const e=new Date;return this.getMany({$or:[{"xp.boost":{$lt:e}},{"buffs.cooldown.casino":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.cooldown.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.berry.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.berry.global":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.drop.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.xp.global":{$elemMatch:{expireAt:{$lt:e}}}}]})}async calcXpBoost(e){const t=await this.get(e),{boost:a}=t.xp,n=a!==null&&Date.now()<a.getTime()?.2:0,i=Math.max(t.premium?.5:0,t.booster?.25:0);return n+i+t.buffs.xp.global.reduce((u,{expireAt:l,startAt:c,multiplier:$})=>c&&c>new Date||l&&o.hasExpire(l)?u:u+$,0)}calcMessageXp(e){const t=e.trim().length,a=2;return t<10?10*a:t>300?300*a:t*a}async getXpDeathPenalties(e){const t=await this.get(e),a=f.getCurrentLevel(t.xp.amount);return a<=10?5e3:a<=20?1e4:a<=30?2e4:a<=40?3e4:a<=50?5e4:a<=60?75e3:a<=70?15e4:a<=80?25e4:a<=90?4e5:a<=100?75e4:14e6}async calcXp(e,t,a){return t*=1+await this.calcXpBoost(e),Math.ceil(t*a)}async calcBerry(e,t,a){if(t<=0)return t;const n=a?1:await this.calcBuffMultiplier(e,"berry","global");return Math.ceil(t*(n||1))}async calcBuffMultiplier(e,t,a){return(await this.get(e)).buffs[t][a].reduce((u,{expireAt:l,startAt:c,multiplier:$})=>u+(new Date>=(c??new Date)&&(!l||!o.hasExpire(l))?$:0),1)}async getMaxHp(e){const t=await S.get(e),{vitality:a}=await this.getTotalCharacteristics(e),n=await S.getUserEquipmentsCharacteristics(t);return(a+n.vitality)*f.HP_PER_VITALITY+f.DEFAULT_MAX_HP}async getHpRatio(e){const t=await this.get(e),a=await this.getMaxHp(e);return Math.min(t.hp/a,1)}async hasCharacteristicRequirement(e,t){const a=await S.get(e),n=await S.getUserEquipmentsCharacteristics(a),i=o.mergeObjects(await this.getTotalCharacteristics(e),n,(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 a of Object.values(t.buffs))for(const n of Object.values(a))for(const{multiplier:i,startAt:u,expireAt:l}of n)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:a}}=await this.update(e,[{$set:{"xp.boost":{$cond:{if:{$or:[{$not:"$xp.boost"},{$lt:["$xp.boost",new Date]}]},then:{$add:[new Date,t]},else:{$add:["$xp.boost",t]}}}}}]);return a}async updateBuff(e,t){if(Array.isArray(t)){for(const n of t)await this.updateBuff(e,n);return}const a=f.transformToDBBuff(t);await this.update(e,[{$set:{[`buffs.${t.target}`]:{$map:{input:`$buffs.${t.target}`,as:"buff",in:{$cond:{if:{$eq:[{$substr:["$$buff.origin",0,{$indexOfBytes:["$$buff.origin","/"]}]},t.origin.split("/")[0]]},then:{multiplier:t.multiplier,origin:t.origin,expireAt:a.expireAt?{$cond:{if:{$lt:["$$buff.expireAt",new Date]},then:a.expireAt,else:{$add:["$$buff.expireAt",(t.endIn??0)*60*60*1e3]}}}:null,startAt:{$cond:{if:{$gte:["$$buff.startAt",new Date]},then:"$$buff.startAt",else:{$add:[new Date,(t.startIn??0)*60*60*1e3]}}}},else:"$$buff"}}}}}},{$set:{[`buffs.${t.target}`]:{$cond:{if:{$in:[t.origin.split("/")[0],{$map:{input:`$buffs.${t.target}`,as:"buff",in:{$substr:["$$buff.origin",0,{$indexOfBytes:["$$buff.origin","/"]}]}}}]},then:`$buffs.${t.target}`,else:{$concatArrays:[`$buffs.${t.target}`,[{...a}]]}}}}}])}async removeBuff(e,t){await this.update(e,{$pull:{[`buffs.${t.target}`]:{origin:t.origin}}})}async updatePanoplyBuff(e,t,a,n){const i=await p.fromDBToEquipableEquipment(t),u=o.filterNullAndUndefined(Object.values(a)),c=(await I.getAllPopulated()).find(T=>T.panoplyId===i.panoply);if(!c)return;const $=c.equipments.filter(T=>(u.find(le=>T.entityId===le.entityId)||!n&&i.entityId===T.entityId)&&(n?i.entityId!==T.entityId:!0)).length,j=$===c.equipments.length?c.fullBonus:$>=c.equipments.length/2?c.halfBonus:void 0;c.halfBonus&&"target"in c.halfBonus&&await this.removeBuff(e,c.halfBonus),c.fullBonus&&"target"in c.fullBonus&&await this.removeBuff(e,c.fullBonus),j&&"target"in j&&await this.updateBuff(e,j)}async gainHp(e,t){const a=await this.get(e),i=await this.getMaxHp(e)-a.hp;await this.update(e,{$set:{hp:a.hp+Math.floor(Math.min(t,i))}})}async loseHp(e,t){await this.update(e,[{$set:{hp:{$max:[{$add:["$hp",-t]},0]}}}])}async updateHp(e,t){const a=await this.getMaxHp(e);await this.update(e,[{$set:{hp:{$round:[{$multiply:[{$divide:["$hp",t]},a]},0]}}}])}async addCharacteristics(e,t){const a=await this.getMaxHp(e),n=Object.fromEntries(Object.entries(t).filter(([,i])=>i!==0).map(([i,u])=>[`characteristics.${i}`,u]));await this.update(e,{$inc:n}),await this.updateHp(e,a)}async addScrollCharacteristic(e,t){const a=await this.getMaxHp(e),n=Object.fromEntries(Object.entries(t).filter(([,i])=>i!==0).map(([i,u])=>[`scrolls.${i}`,u]));await this.update(e,{$inc:n}),await this.updateHp(e,a)}async resetCharacteristics(e,t){const a=await this.getMaxHp(e),n={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};t?await this.update(e,{$set:{characteristics:n,"resetCharacteristics.free":!1}}):await this.update(e,{$set:{characteristics:n,"resetCharacteristics.nextAvailable":new Date(Date.now()+720*60*60*1e3)},$inc:{berry:-1e8}}),await this.updateHp(e,a)}async resetMinutesInVoiceToday(e){await this.update(e,{$set:{"xp.voice.minutesInVoiceToday":0}})}async addMinutesInVoiceToday(e,t){await this.update(e,{$inc:{"xp.voice.minutesInVoiceToday":t}})}async updateLastVoiceConnection(e,t){await this.update(e,{$set:{"xp.voice.lastConnection":t}})}async incrementWorkUnluckyStreak(e){await this.update(e,{$inc:{workUnluckyStreak:1}})}async resetWorkUnluckyStreak(e){await this.update(e,{$set:{workUnluckyStreak:0}})}async updateScam(e,t){await this.update(e,{$set:{scam:t}})}async updateUserXp(e,t){const a=await He.get(e),n=a?.percent??0,i=await this.calcXp(e,t,(1-n)*await this.getHpRatio(e));let u=0;return await this.addXp(e,i),a&&(u=await ye.calcXp(a.crew,t*n),await ye.addXp(a.crew,u)),{userXp:i,crewXp:u}}async updateUserBerry(e,t,a){const n=await this.calcBerry(e,t,a);return await this.addBerry(e,n),n}}const Qr=r=>D.find(r).lean(),Hr=async r=>await D.create({user:r});async function Wr(r){const e=await D.findOne({user:r}).lean();return e||y(await Hr(r))}const Gr=(r,e)=>D.findOneAndUpdate({user:r},e,{returnDocument:"after",upsert:!0}).lean();class Yr extends Kr{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Wr(e)}fetchManyFromDb(e){return Qr(e)}updateInDb(e,t){return Gr(e,t)}}const U=new Yr;class Xr extends b{async updateSendDailyQuest(e,t){await this.update(e,{$set:{sendDailyQuest:t}})}async updateSendDailyReport(e,t){await this.update(e,{$set:{sendDailyReport:t}})}async updateInventorySort(e,t){await this.update(e,{$set:{"sort.inventory":t}})}async updateReminderSettings(e,t,a){await this.update(e,{$set:{[`reminder.${t}`]:a}})}getUsersWithDailyReportEnable(){return this.getMany({sendDailyReport:!0})}}const Vr=r=>q.find(r).lean(),Lr=async r=>await q.create({user:r});async function Jr(r){const e=await q.findOne({user:r}).lean();return e||y(await Lr(r))}const Zr=(r,e)=>q.findOneAndUpdate({user:r},e,{returnDocument:"after",upsert:!0}).lean();class ea extends Xr{constructor(){super(3600)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return Jr(e)}fetchManyFromDb(e){return Vr(e)}updateInDb(e,t){return Zr(e,t)}}const ge=new ea;class ta extends m{async getCommandCooldown(e,t){return(await this.get(e)).commands[t]}async getRaidCooldown(e,t){return(await this.get(e)).raid[t]}async reduceRaidCooldown(e,t){await this.update(e,[{$set:{"raid.special":{$subtract:[{$ifNull:["$raid.special",new Date]},t*3600*1e3]},"raid.classic":{$subtract:[{$ifNull:["$raid.classic",new Date]},t*3600*1e3]}}}]),await N.updateReminderDate(e,"raid/special",-1*t*3600*1e3),await N.updateReminderDate(e,"raid/classic",-1*t*3600*1e3)}async startRaidCooldown(e,t,a){const{reminder:n}=await ge.get(e);await this.update(e,{$set:{[`raid.${t}`]:new Date(Date.now()+a)}}),n.raid[t]&&await N.addReminder(e,`raid/${t}`,new Date(Date.now()+a))}async lockUserCommand(e){await this.update(e,{$set:{lockUserCommand:new Date(Date.now()+2*3600*1e3)}}),await U.gainHp(e,1)}async useCommand(e,t,a){const{reminder:n}=await ge.get(e);await this.update(e,{$set:{[`commands.${t}`]:new Date(Date.now()+a)}}),n.commands[t]&&await N.addReminder(e,`commands/${t}`,new Date(Date.now()+a))}}const ra=async r=>await W.create({user:r});async function aa(r){const e=await W.findOne({user:r}).lean();return e||y(await ra(r))}const na=(r,e)=>W.findOneAndUpdate({user:r},e,{returnDocument:"after",upsert:!0}).lean();class sa extends ta{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return aa(e)}updateInDb(e,t){return na(e,t)}}const We=new sa;class ia extends m{async unlockTitle(e,t){await g.isOrnamentIds([t],g.isTitle)&&await this.update(e,{$addToSet:{unlockedTitles:t}})}async unlockTitles(e,t){await g.isOrnamentIds(t,g.isTitle)&&await this.update(e,{$addToSet:{unlockedTitles:{$each:t}}})}async selectTitle(e,t){await this.update(e,{$set:{selectedTitle:t}})}async unlockBackground(e,t){await g.isOrnamentIds([t],g.isBackground)&&await this.update(e,{$addToSet:{unlockedBackgrounds:t}})}async unlockBackgrounds(e,t){await g.isOrnamentIds(t,g.isBackground)&&await this.update(e,{$addToSet:{unlockedBackgrounds:{$each:t}}})}async selectBackground(e,t){await this.update(e,{$set:{selectedBackground:t}})}async unlockBadge(e,t,a){t.isProgressive?await this.update(e,{$addToSet:{unlockedBadges:`${t.id}_${a}`}}):await this.update(e,{$addToSet:{unlockedBadges:t.id}})}async unlockFactionBadge(e,t){await this.update(e,{$addToSet:{unlockedFactionBadges:{$each:[`b_marine_${t}`,`b_revolutionary_${t}`,`b_pirate_${t}`]}}})}async unlockProfileAsset(e,t){await this.update(e,{$addToSet:{unlockedProfileAssets:t}})}async unlockBag(e,t){await this.update(e,{$addToSet:{unlockedBags:t}})}async selectBag(e,t){await this.update(e,{$set:{selectedBag:t}})}}const ua=async r=>await L.create({user:r});async function ca(r){const e=await L.findOne({user:r}).lean();return e||y(await ua(r))}const da=async(r,e)=>L.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class la extends ia{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return ca(e)}updateInDb(e,t){return da(e,t)}}const F=new la;class oa extends b{async getStatus(e,t){return(await this.get({user:e,questId:t})).status}async isCompleted(e,t){return await this.getStatus(e,t)==="COMPLETED"}async isStreaking(e,t){const{lastCompletionDate:a}=await this.get({user:e,questId:t});return!!a&&o.sameDay(o.yesterday(),a)}async getStreakMultiplier(e,t){const a=await this.get({user:e,questId:t});return await this.isStreaking(e,t)?1+Math.min(2,(a.streak??0)/10):1}async getCompletedCount(e){return(await this.getMany({user:e,status:f.QuestStatus.COMPLETED})).length}async completeQuest(e,t=!1){const a=o.yesterday();a.setHours(0,0,0,0);const n=new Date;return n.setHours(0,0,0,0),this.update(e,[{$set:{...t?{streak:{$cond:{if:{$and:[{$gte:["$lastCompletionDate",a]},{$lt:["$lastCompletionDate",n]}]},then:{$add:[{$ifNull:["$streak",0]},1]},else:1}}}:{},lastCompletionDate:new Date,status:f.QuestStatus.COMPLETED}}],{upsert:!1})}}function pa(r){return R.find(r).lean()}const ya=async r=>await R.create({...r});async function fa(r){const e=await R.findOne(r).lean();return e||y(await ya(r))}function ma(r,e,t){return R.findOneAndUpdate(r,e,{upsert:!0,...t,returnDocument:"after"}).lean()}class ha extends oa{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 fa(e)}fetchManyFromDb(e){return pa(e)}updateInDb(e,t,a){return ma(e,t,a)}}const be=new ha;class wa extends m{async updateDailyReport(e){const t=await U.get(e),a=await F.get(e),n=await be.getMany({user:e,status:f.QuestStatus.COMPLETED});await this.update(e,{$set:{xpYesterday:t.xp.amount,berryYesterday:t.berry,previousCompletedQuest:n.map(({questId:i})=>i),"previousOrnament.unlockedBadges":a.unlockedBadges,"previousOrnament.unlockedTitles":a.unlockedTitles,"previousOrnament.unlockedBackgrounds":a.unlockedBackgrounds}})}async getDailyReport(e){const t=await this.get(e),{previousOrnament:a,previousCompletedQuest:n,xpYesterday:i,berryYesterday:u}=t;if(i<=0)return;const l=await U.get(e),c=await be.getMany({user:e,status:f.QuestStatus.COMPLETED}),$=await F.get(e),{berry:j,xp:T}=l,{voice:le,amount:xs}=T,{unlockedBadges:Fs,unlockedBackgrounds:js,unlockedTitles:zs}=$;return{berry:j-u,xp:xs-i,voice:o.sameDay(le.lastConnection,o.yesterday())?le.minutesInVoiceToday:0,quest:o.exclude(c.map(({questId:Ps})=>Ps),n),badge:o.exclude(Fs,a.unlockedBadges),title:o.exclude(zs,a.unlockedTitles),background:o.exclude(js,a.unlockedBackgrounds)}}async getAllDailyReportsToSend(){const e=await Qe.getMany({"settings.sendDailyReport":!0,faction:{$ne:"citizen"}});return await Promise.all(e.map(async({_id:t,discordId:a})=>({...await this.getDailyReport(t),user:t,discordId:a})))}}const Sa=r=>G.create({user:r});async function ga(r){const e=await G.findOne({user:r}).lean();return e||y(await Sa(r))}const ba=(r,e)=>G.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class $a extends wa{constructor(){super(60)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return ga(e)}updateInDb(e,t){return ba(e,t)}}const Ea=new $a;class Ia extends m{async setGuessGame(e,t,a,n){await this.update(e,{$set:{guess:{amount:t,tries:a,numberToGuess:n,lastGuess:0}}})}async resetGuessGame(e){await this.update(e,{$set:{guess:null}})}async updateGuessGame(e){await this.update(e,{$inc:{"guess.tries":1},$set:{"guess.lastGuess":Date.now()}})}}const Ua=async r=>await X.create({user:r});async function Oa(r){const e=await X.findOne({user:r}).lean();return e||y(await Ua(r))}const Da=(r,e)=>X.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class Ta extends Ia{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Oa(e)}updateInDb(e,t){return Da(e,t)}}const Ra=new Ta;class va extends m{async hasUnlockedRaid(e,t){return(await this.get(e)).unlocked?.[t]}async alreadyObtainedRaidReward(e,t,a){const n=await this.get(e);return t in n.obtainedRewards?n.obtainedRewards[t].includes(a):!1}async getObtainedRaidReward(e,t){return(await this.get(e)).obtainedRewards[t]??[]}async fulfillCondition(e,t,a,n){const i=await this.get(e);return n==="include"?a.every(u=>(i.obtainedConditions[t]??[]).includes(u)):a.every(u=>!(i.obtainedConditions[t]??[]).includes(u))}async unlockRaid(e,t){await this.update(e,{$set:{[`unlocked.${t}`]:!0}})}async startRaid(e,t,a,n,i){const u=Date.now();return await this.update(e,{$set:{currentRaid:{raidId:t,buffItem:a,seed:u,progression:[],rewards:{}}}}),await We.startRaidCooldown(e,n,i),u}async resetRaid(e){await this.update(e,{$unset:{currentRaid:""}})}async resetRaidProgression(e){await this.update(e,{$set:{"currentRaid.progression":[]}})}async progressRaid(e,t){await this.update(e,{$push:{"currentRaid.progression":t}})}async claimReward(e,t,a){await this.update(e,{$addToSet:{[`obtainedRewards.${t}`]:a}})}async addRewardsToRaid(e,t){await this.update(e,{$inc:Object.fromEntries(o.recordToArray(t).filter(([a])=>a!=="title"&&a!=="condition").map(([a,n])=>[`currentRaid.rewards.${a}`,n])),...t.title?{$set:{"currentRaid.rewards.title":t.title}}:{}})}async updateCondition(e,t,a){await this.update(e,{$addToSet:{[`obtainedConditions.${t}`]:a}})}}const Ca=r=>J.create({user:r}),Aa=async r=>{const e=await J.findOne({user:r}).lean();return e||y(await Ca(r))},Ma=(r,e)=>J.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"});class Ba extends va{constructor(){super(3600)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Aa(e)}updateInDb(e,t){return Ma(e,t)}}const _a=new Ba,qa=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},xp:{type:Number,default:0},berry:{type:Number,default:0},faction:{type:Number,default:0}}),_=s.models?.UserRank||s.model("UserRank",qa);class ka extends m{async computeAllXpRanks(){const t=(await D.aggregate([{$setWindowFields:{sortBy:{"xp.amount":-1},output:{xpRank:{$rank:{}}}}},{$project:{user:1,xpRank:1}}])).map(({user:a,xpRank:n})=>({updateOne:{filter:{user:a},update:{$set:{xp:n}},upsert:!0}}));t.length>0&&await _.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:a,berryRank:n})=>({updateOne:{filter:{user:a},update:{$set:{berry:n}},upsert:!0}}));t.length>0&&await _.bulkWrite(t),this.clearAll()}async computeAllFactionRanks(){const t=(await E.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:a,factionRank:n})=>({updateOne:{filter:{user:a},update:{$set:{faction:n}},upsert:!0}}));t.length>0&&await _.bulkWrite(t),this.clearAll()}async computeAllRanks(){await Promise.all([this.computeAllXpRanks(),this.computeAllBerryRanks(),this.computeAllFactionRanks()])}}const Na=async r=>await _.create({user:r});async function xa(r){const e=await _.findOne({user:r}).lean();return e||y(await Na(r))}const Fa=(r,e)=>_.findOneAndUpdate({user:r},e,{returnDocument:"after",upsert:!0}).lean();class ja extends ka{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return xa(e)}updateInDb(e,t){return Fa(e,t)}}const za=new ja;class Pa extends m{async isBuyLimitReached(e,t,a){const n=await p.getAllEntitiesLimit();if(await p.isEntityId(t,p.isEquipment))return!1;const i=await this.get(e),u=i.limit?.[t];let l=n[t];const c=await S.hasRevolutionaryBuff(e);return i.lastShopId!==a?!1:(c==="half"&&t==="chest_2"&&(l+=2),c==="full"&&t==="chest_3"&&(l+=1),!!(l&&u&&u>=l))}async getShopItemRest(e,t,a,n=f.SHOP_DEFAULT_AVAILABLE_ENTITY_AMOUNT){const i=await p.getAllEntitiesLimit();if(await p.isEntityId(t,p.isEquipment))return n;let u=i[t];const l=await this.get(e),c=l.limit?.[t],$=await S.hasRevolutionaryBuff(e);return $==="half"&&t==="chest_2"&&(u+=2),$==="full"&&t==="chest_3"&&(u+=1),u?l.lastShopId!==a?u:c?u-c:Math.min(u,n):n}async increaseBuyLimit(e,t,a,n){await this.update(e,[{$set:{limit:{$cond:{if:{$eq:["$lastShopId",t]},then:{$setField:{field:a,input:{$ifNull:["$limit",{}]},value:{$add:[{$ifNull:[`$limit.${a}`,0]},n]}}},else:{[a]:n}}},lastShopId:t}}])}}const Ka=async r=>await Z.create({user:r}),Qa=async r=>{const e=await Z.findOne({user:r}).lean();return e||y(await Ka(r))},Ha=(r,e)=>Z.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class Wa extends Pa{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Qa(e)}updateInDb(e,t){return Ha(e,t)}}const Ga=new Wa;class Ya extends m{async didSevenDoubleAtDoQ(e){await this.update(e,{$inc:{"doubleOrQuit.sevenDoubleInARowCount":1}})}async winWithBlackjack(e){await this.update(e,{$inc:{"blackJack.blackJackCount":1}})}async updateLastGames(e,t,a){await this.update(e,{$push:{lastGames:{$each:[{gameType:t,endState:a}],$position:0,$slice:20}}})}async drawIncrement(e){await this.update(e,{$inc:{drawCount:1}})}async bet666(e){const t=o.yesterday();t.setHours(0,0,0,0);const a=new Date;a.setHours(0,0,0,0),await A.updateOne({user:e,"bet666.last":{$gte:t,$lt:a}},{$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 Xa=async r=>await A.create({user:r});async function Va(r){const e=await A.findOne({user:r}).lean();return e||y(await Xa(r))}const La=(r,e)=>A.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class Ja extends Ya{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Va(e)}updateInDb(e,t){return La(e,t)}}const Za=new Ja;class en extends m{async increaseXpGiven(e,t){await this.update(e,{$inc:{xpGivenToCrew:t}})}async increaseBerryGiven(e,t){await this.update(e,{$inc:{berryGivenToCrew:t}})}async updateCrew10Percent(e,t){t?await this.update(e,{$set:{timeCrewBeyond10PercentXp:0}}):await this.update(e,{$inc:{timeCrewBeyond10PercentXp:1}})}async updateCrew90Percent(e,t){t?await this.update(e,{$set:{timeCrewAbove90PercentXp:0}}):await this.update(e,{$inc:{timeCrewAbove90PercentXp:1}})}}const tn=async r=>await ee.create({user:r});async function rn(r){const e=await ee.findOne({user:r}).lean();return e||y(await tn(r))}const an=(r,e)=>ee.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class nn extends en{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return rn(e)}updateInDb(e,t){return an(e,t)}}const sn=new nn;class un extends m{async workIncrement(e){await this.update(e,{$inc:{workCount:1}})}async updateTotalSpentInShop(e,t){await this.update(e,{$inc:{totalSpentInShop:t}})}}const cn=r=>te.create({user:r});async function dn(r){const e=await te.findOne({user:r}).lean();return e||y(await cn(r))}const ln=(r,e)=>te.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class on extends un{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return dn(e)}updateInDb(e,t){return ln(e,t)}}const Ge=new on;class pn 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 yn=async r=>await re.create({user:r});async function fn(r){const e=await re.findOne({user:r}).lean();return e||y(await yn(r))}const mn=(r,e)=>re.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class hn extends pn{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return fn(e)}updateInDb(e,t){return mn(e,t)}}const wn=new hn;class Sn 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 gn=async r=>await ae.create({user:r});async function bn(r){const e=await ae.findOne({user:r}).lean();return e||y(await gn(r))}const $n=(r,e)=>ae.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class En extends Sn{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return bn(e)}updateInDb(e,t){return $n(e,t)}}const In=new En;class Un extends m{async readEdito(e){const t=new Date;t.setHours(0,0,0,0),await M.updateOne({user:e,"edito.lastTimeRead":{$gte:t}},{$inc:{"edito.readToday":1},$set:{"edito.lastTimeRead":new Date}}),await M.updateOne({user:e,"edito.lastTimeRead":{$lt:t}},{$set:{"edito.lastTimeRead":new Date,"edito.readToday":1}}),this.invalidate(e)}}const On=async r=>await M.create({user:r});async function Dn(r){const e=await M.findOne({user:r}).lean();return e||y(await On(r))}const Tn=(r,e)=>M.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class Rn extends Un{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Dn(e)}updateInDb(e,t){return Tn(e,t)}}const vn=new Rn;class Cn extends m{async updateCraftStats(e,t,a){const n=await p.get(a);!n||!p.isItem(n)||await this.update(e,{$inc:{"crafts.cookedMeal":p.isCookedMeal(n)?t:0,"crafts.scrolls":p.isScrollItem(n)?t:0,"crafts.totalCrafted":t}})}async incrementAlcoholDrink(e,t,a){["wine","beer","rhum"].includes(t)&&await this.update(e,{$inc:{"alcohols.wines":t==="wine"?a:0,"alcohols.beers":t==="beer"?a:0,"alcohols.rhums":t==="rhum"?a:0,"alcohols.totalConsumed":a}})}async incrementBottleUsedToday(e,t){const a=new Date;a.setHours(0,0,0,0),await B.updateOne({user:e,"bottle.lastUsed":{$gte:a}},{$inc:{"bottle.usedToday":t},$set:{"bottle.lastUsed":new Date}}),await B.updateOne({user:e,"bottle.lastUsed":{$lt:a}},{$set:{"bottle.lastUsed":new Date,"bottle.usedToday":t}}),this.invalidate(e)}async incrementBottleUsedTotal(e,t){await this.update(e,{$inc:{"bottle.totalUsed":t}})}async incrementChestOpenedTotal(e,t){await this.update(e,{$inc:{"chest.totalOpened":t}})}}const An=async r=>await B.create({user:r});async function Mn(r){const e=await B.findOne({user:r}).lean();return e||y(await An(r))}const Bn=(r,e)=>B.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class _n extends Cn{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Mn(e)}updateInDb(e,t){return Bn(e,t)}}const qn=new _n;class kn extends b{async maxCraftQuantity(e,t){const a=await S.get(e);let n=1/0;for(const i of t)n=Math.min(n,Math.floor((a.itemList[i.entityId]??0)/i.size));return n}async hasEnoughItemsForRecipe(e,t,a){const n=await S.get(e);for(const i of t.entities)if((n.itemList[i.entityId]??0)<i.size*a)return!1;return!0}decodeCraftId(e){return e.split(";").map((t,a)=>({entityId:t==="null"?null:t,index:a}))}encodeCraftId(e){return e.map(({entityId:t})=>`${t}`).join(";")}async isValidRecipe(e){return!!(await this.getAll()).find(a=>a.craftId===e)}async getRecipeResult(e,t){const a=await S.get(e),n=(await I.getPanoplyBonus(a.equippedItems)).find(([i,u])=>i.panoplyId==="little_blacksmith"&&u!==null);return n?.[1]==="full"&&t==="chest_3"?"chest_blacksmith_3":n?.[1]==="half"&&t==="chest_2"?"chest_blacksmith_2":n?.[1]==="half"&&t==="chest_1"?"chest_blacksmith_1":t}}const Nn=new s.Schema({entityId:{type:String,required:!0},size:{type:Number,required:!0}},{_id:!1}),xn=new s.Schema({entityId:{type:String,required:!0},size:{type:Number,required:!0}},{_id:!1}),Fn=new s.Schema({craftId:{type:String,unique:!0,required:!0},name:{type:String,required:!0},entities:{type:[Nn],required:!0},result:{type:xn,required:!0}},{minimize:!1}),ie=s.models?.Recipes||s.model("Recipes",Fn),jn=async r=>await ie.create({...r}),zn=async(r,e={})=>ie.find(r,e).lean();async function Pn(r){const e=await ie.findOne({craftId:r}).lean();return e||null}const Kn=(r,e)=>ie.findOneAndUpdate(r,e,{returnDocument:"after"}).lean();class Qn extends kn{constructor(){super(3600)}createInDb(e){return jn(e)}updateInDb(e,t){return Kn(e,t)}fetchFromDb(e){return Pn(e)}fetchManyFromDb(e){return zn(e)}normalizeKey(e){return e}getKey(e){return e.craftId}}const Hn=new Qn,Wn=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}}),ue=s.models?.Bans||s.model("Bans",Wn),Gn=(r,e)=>ue.deleteOne({bannedUserId:r,guildId:e});class Yn extends b{async getUnbanUsers(){return this.getMany({unbannedTimestamp:{$lte:new Date,$ne:null}})}async banUserFromGuild({bannedUserId:e,guildId:t,...a}){await this.update({bannedUserId:e,guildId:t},{...a})}async isBannedFromGuild(e,t){const a=await this.get({bannedUserId:e,guildId:t});return!!(a&&(!a.unbannedTimestamp||a.unbannedTimestamp>new Date))}async deleteBan(e,t){await Gn(e,t),this.invalidate({bannedUserId:e,guildId:t})}}const Xn=r=>ue.find(r).lean(),Vn=r=>ue.findOne(r).lean(),Ln=(r,e)=>ue.findOneAndUpdate(r,e,{returnDocument:"after",upsert:!0}).lean();class Jn extends Yn{constructor(){super(3600*36)}normalizeKey(e){return`${e.guildId}/${e.bannedUserId}`}getKey({bannedUserId:e,guildId:t}){return{bannedUserId:e,guildId:t}}fetchFromDb(e){return Vn(e)}fetchManyFromDb(e){return Xn(e)}updateInDb(e,t){return Ln(e,t)}}const Zn=new Jn,es=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}}}),ce=s.models?.Invitation||s.model("Invitation",es),ts=r=>ce.create({...r}),rs=async r=>{await ce.deleteMany({...r})};class as extends m{async sendInvitation({senderId:e,receiverId:t,gameMode:a,...n}){return await this.get({senderId:e,gameMode:a,receiverId:t})?null:await ts({...n,senderId:e,gameMode:a,receiverId:t})}async deleteInvitation({senderId:e,receiverId:t,gameMode:a}){await rs({senderId:e,gameMode:a,receiverId:t}),this.invalidate({senderId:e,gameMode:a,receiverId:t})}}const ns=r=>ce.findOne({...r}).lean(),ss=(r,e)=>ce.findOneAndUpdate(r,e,{returnDocument:"after"}).lean();class is extends as{constructor(){super(3600)}normalizeKey(e){return`${e.gameMode}/${e.receiverId}/${e.senderId}`}getKey({receiverId:e,gameMode:t,senderId:a}){return{gameMode:t,receiverId:e,senderId:a}}fetchFromDb(e){return ns(e)}updateInDb(e,t){return ss(e,t)}}const us=new is;class cs extends m{async setEditoChannel(e,t){await this.update({guildId:e},{$set:{"edito.channelId":t}})}async randomizeEditoPrice(e){const t=o.randomBetween(100,1001);return await this.update({guildId:e},{$set:{"edito.price":t}}),t}async setEditoMessageId(e,t){await this.update({guildId:e},{$set:{"edito.messageId":t}})}async setRankingChannel(e,t){await this.update({guildId:e},{$set:{"ranking.channelId":t}})}async setRankingMessage(e,t){await this.update({guildId:e},{$set:{"ranking.messageId":t}})}async setCrewInfoChannelId(e,t){await this.update({guildId:e},{$set:{"crew.infoChannelId":t}})}async addCrewChannelId(e,t,a){await this.update({guildId:e},{$push:{"crew.crewChannelIds":{channelId:a,crewId:t}}})}async updateRolesId(e,t){await this.update({guildId:e},{$set:Object.fromEntries(Object.entries(t).map(([a,n])=>[`roles.${a}`,n]))})}async updateChannelId(e,t){await this.update({guildId:e},{$set:Object.fromEntries(Object.entries(t).map(([a,n])=>[`channels.${a}`,n]))})}}const ds=new s.Schema({guildId:{type:String,required:!0,unique:!0},ranking:{channelId:{type:String,default:null},messageId:{type:String,default:null}},roles:{premium:{type:String,default:null},booster:{type:String,default:null},scam:{type:String,default:null},factions:{canChange:{type:String,default:null},canChoose:{type:String,default:null}}},channels:{gambling:{type:String,default:null},work:{type:String,default:null},raid:{type:String,default:null},suggestion:{type:String,default:null},report:{type:String,default:null},reportModerator:{type:String,default:null},faction:{type:String,default:null},discussion:{type:String,default:null},questFallback:{type:String,default:null},reportBug:{type:String,default:null},shop:{type:String,default:null}},edito:{channelId:{type:String,default:null},price:{type:Number,default:100},messageId:{type:String,default:null}},crew:{infoChannelId:{type:String,default:null},crewChannelIds:{type:[{channelId:{type:String},crewId:{type:String}}],default:[]}},shopChannelId:{type:String,default:null}}),$e=s.models?.Settings||s.model("Settings",ds),ls=r=>$e.create({guildId:r}),os=async r=>{const e=await $e.findOne({guildId:r}).lean();return e||y(await ls(r))},ps=(r,e)=>$e.findOneAndUpdate(r,e,{upsert:!0,returnDocument:"after"}).lean();class ys extends cs{constructor(){super(3600*24*30)}normalizeKey(e){return e}getKey({guildId:e}){return e}fetchFromDb(e){return os(e)}updateInDb(e,t){return ps(e,t)}}const fs=new ys,ms=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}),de=s.models?.Shop||s.model("Shop",ms),hs=r=>de.create({shopType:r}),Ye=async r=>{const e=await de.findOne({shopType:r}).lean();return e||y(await hs(r))};class O{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 Ge.updateTotalSpentInShop(e,this.price*t)):await S.removeItem(e,this.currency,this.price*t)}isBackground(){return!1}isChest(){return!1}isTitle(){return!1}isBoostXp(){return!1}isRepair(){return!1}isStore(){return!1}isObject(){return!1}isBottle(){return!1}isEquipment(){return!1}}class ws extends O{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await F.unlockBackground(e,this.data.ornamentId)}isBackground(){return!0}}class Ss extends O{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addItem(e,this.data.entityId,t)}isBoostXp(){return!0}}class gs extends O{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addItem(e,this.data.entityId,t)}isChest(){return!0}}class bs extends O{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addItem(e,this.data.entityId,t)}isObject(){return!0}}class $s extends O{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addEquipments(e,o.range({stop:t}).map(()=>p.seedEquipment({...this.data},Date.now()-Math.round(Math.random()*1e3))).map(a=>({entityId:a.entityId,seed:a.seed})))}isEquipment(){return!0}}class Es extends O{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addItem(e,this.data.entityId,t)}isBottle(){return!0}}class Is extends O{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addItem(e,this.data.entityId,t)}isRepair(){return!0}}class Us extends O{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addItem(e,this.data.entityId,t)}isStore(){return!0}}class Os extends O{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await F.unlockTitle(e,this.data.ornamentId)}isTitle(){return!0}}class Ds extends m{async getShopItem(e,t){const n=(await this.get(e)).items.find($=>$.id===t);if(!n)return;const{price:i,size:u,currency:l}=n,c=await p.get(n.id)??await g.get(n.id);if(g.isOrnament(c)&&g.isBackground(c))return new ws({price:i,item:c,size:u,currency:l});if(g.isOrnament(c)&&g.isTitle(c))return new Os({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isChestItem(c))return new gs({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isBoostItem(c))return new Ss({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isRepairItem(c))return new Is({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isStoreItem(c))return new Us({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isObjectItem(c))return new bs({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isEquipment(c))return new $s({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isBottleItem(c))return new Es({price:i,size:u,item:c,currency:l})}async getShopItemList(e){const t=await this.get(e),a=[];for(const{id:n}of t.items){const i=await this.getShopItem(e,n);i&&a.push(i)}return a}getShopItemId(e){return p.isEntity(e.data)?e.data.entityId:e.data.ornamentId}async updateShopStats(e,t,a){await this.update({shopType:e},{$inc:{"stats.berrySpent":t.price*a,"stats.itemBought":a,"stats.chestBought":t.isChest()?a:0,"stats.percentBought":t.isRepair()?(t.data.effects.find(n=>n.type==="CREW_REPAIR")?.params.amount??0)*a:0,"stats.boostTimeBought":t.isBoostXp()?t.data.ms/(1440*60*1e3):0}})}async buyShopItem(e,t,a,n){const i=t.map(u=>(u.id===this.getShopItemId(a)&&u.size&&(u.size-=n),u));await this.update({shopType:e},{$set:{items:i}})}async publish(e){await this.update({shopType:e},{$set:{publishedAt:new Date}})}async setShopItems(e,t){await this.update({shopType:e},{$set:{items:[...t]}})}}const Ts=(r,e)=>de.findOneAndUpdate(r,e,{upsert:!0,returnDocument:"after"}).lean();class Rs extends Ds{constructor(){super(3600)}normalizeKey(e){return e}getKey({shopType:e}){return e}fetchFromDb(e){return Ye(e)}updateInDb(e,t){return Ts(e,t)}}const vs=new Rs,Cs=new s.Schema({warnedUserId:{type:String,required:!0,index:!0},authorId:String,date:{type:Date,default:Date.now()},reason:{type:String,default:null}}),Xe=s.models?.Warn||s.model("Warn",Cs),As=r=>Xe.countDocuments(r);class Ms extends b{getUserWarns(e){return this.getMany({warnedUserId:e})}getUserWarnCount(e){return As({warnedUserId:e})}}const Bs=r=>Xe.find(r).lean();class _s extends Ms{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 Bs(e)}updateInDb(){throw new Error("Method not implemented.")}}const qs=new _s,ks=r=>{s.connect(r)};class Ns extends s.Types.ObjectId{}d.COOLDOWN_COMMANDS=Xt,d.ObjectId=Ns,d.QUEST_MIDDLEWARE_EVENT_NAME=w,d.RAID_MIDDLEWARE_EVENT_NAME=K,d.banService=Zn,d.connectToServices=ks,d.crewMetaService=ye,d.crewOrnamentsService=mt,d.crewQuestService=Et,d.crewService=Oe,d.crewStatsEngagementService=Rt,d.crewStatsFrequencyService=_t,d.emitQuestMiddlewareEvent=h,d.emitRaidMiddlewareEvent=P,d.entityService=p,d.findShop=Ye,d.invitationService=us,d.ornamentService=g,d.panoplyService=I,d.recipeService=Hn,d.registerQuestMiddlewareEvents=Ze,d.registerRaidMiddlewareEvents=et,d.reminderService=N,d.settingsService=fs,d.shopModel=de,d.shopService=vs,d.userCooldownService=We,d.userCrewService=He,d.userDailyReportService=Ea,d.userEncyclopediaService=se,d.userGamesService=Ra,d.userInventoryService=S,d.userMetaService=U,d.userOrnamentService=F,d.userQuestService=be,d.userRaidService=_a,d.userRankService=za,d.userService=Qe,d.userSettingsService=ge,d.userShopService=Ga,d.userStatsCasinoService=Za,d.userStatsCrewService=sn,d.userStatsEconomyService=Ge,d.userStatsEngagementService=wn,d.userStatsFlagsService=In,d.userStatsFrequencyService=vn,d.userStatsInventoryService=qn,d.warnService=qs,Object.defineProperty(d,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(d,s){typeof exports=="object"&&typeof module<"u"?s(exports,require("mongoose"),require("@opfr/utils-lang"),require("node-cache"),require("@opfr/definitions"),require("events")):typeof define=="function"&&define.amd?define(["exports","mongoose","@opfr/utils-lang","node-cache","@opfr/definitions","events"],s):(d=typeof globalThis<"u"?globalThis:d||self,s(d.services={},d.mongoose,d["@opfr/utils-lang"],d["node-cache"],d["@opfr/definitions"],d.events))})(this,(function(d,s,o,Ve,f,Le){"use strict";function Je(r){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(r){for(const t in r)if(t!=="default"){const a=Object.getOwnPropertyDescriptor(r,t);Object.defineProperty(e,t,a.get?a:{enumerable:!0,get:()=>r[t]})}}return e.default=r,Object.freeze(e)}const oe=Je(Le),z="___ALL_ENTITIES___";class m{cache;constructor(e){this.cache=new Ve({stdTTL:e,checkperiod:e*.2,useClones:!1})}async get(e,t){const a=this.normalizeKey(e),n=this.cache.get(a);if(n)return n;const i=await this.fetchFromDb(e,t??{});return i&&this.cache.set(a,i),i}async update(e,t,a){const n=await this.updateInDb(e,t,a);if(n){const i=this.getKey(n);this.cache.del(z),this.cache.set(this.normalizeKey(i),n)}return n}invalidate(e){this.cache.del(z),e&&this.cache.del(this.normalizeKey(e))}clearAll(){this.cache.flushAll()}}class b extends m{async getAll(){const e=this.cache.get(z);if(e)return e;const t=await this.fetchManyFromDb({},{});return this.cache.set(z,t),t.forEach(a=>{this.cache.set(this.normalizeKey(this.getKey(a)),a)}),t}async getMany(e,t={}){const a=await this.fetchManyFromDb(e,t);return a.forEach(n=>{this.cache.set(this.normalizeKey(this.getKey(n)),n)}),a}}const Ee=new oe.EventEmitter,h=(r,e,t)=>{Ee.emit(r,e,t)},Ze=r=>{for(const[e,t]of Object.entries(r))Ee.on(e,(a,n)=>{t(a,n)})},w={CREW:"middleware/quest/CREW",CREW_META:"middleware/quest/CREW_META",CREW_ORNAMENTS:"middleware/quest/CREW_ORNAMENTS",CREW_QUEST:"middleware/quest/CREW_QUEST",CREW_STATS_ENGAGEMENT:"middleware/quest/CREW_STATS_ENGAGEMENT",CREW_STATS_FREQUENCY:"middleware/quest/CREW_STATS_FREQUENCY",USER:"middleware/quest/USER",USER_CREW:"middleware/quest/USER_CREW",USER_INVENTORY:"middleware/quest/USER_INVENTORY",USER_META:"middleware/quest/USER_META",USER_ORNAMENT:"middleware/quest/USER_ORNAMENT",USER_QUEST:"middleware/quest/USER_QUEST",USER_STATS_CASINO:"middleware/quest/USER_STATS_CASINO",USER_STATS_CREW:"middleware/quest/USER_STATS_CREW",USER_STATS_ECONOMY:"middleware/quest/USER_STATS_ECONOMY",USER_STATS_ENGAGEMENT:"middleware/quest/USER_STATS_ENGAGEMENT",USER_STATS_FLAGS:"middleware/quest/USER_STATS_FLAGS",USER_STATS_FREQUENCY:"middleware/quest/USER_STATS_FREQUENCY",USER_STATS_INVENTORY:"middleware/quest/USER_STATS_INVENTORY"},Ie=new oe.EventEmitter,P=(r,e,t)=>{Ie.emit(r,e,t)},et=r=>{for(const[e,t]of Object.entries(r))Ie.on(e,(a,n)=>{t(a,n)})},K={USER_INVENTORY:"middleware/raid/USER_INVENTORY",USER_QUEST:"middleware/raid/USER_QUEST",USER_RAID:"middleware/raid/USER_RAID"},Ue=new s.Schema({createdBy:s.Schema.Types.ObjectId,name:String,description:String,channelId:String,memberLimit:{type:Number,default:f.CREW_DEFAULT_MEMBER_LIMIT},disintegration:{type:Number,default:f.CREW_DEFAULT_DISINTEGRATION},faction:String},{timestamps:!0,minimize:!1});Ue.post("findOneAndUpdate",async function(r){h(w.CREW,r._id,r)});const Q=s.models?.Crew||s.model("Crew",Ue);class tt extends m{async getCrewRank(e){return(await Q.aggregate([{$lookup:{from:"crewmetas",localField:"_id",foreignField:"crew",as:"meta"}},{$unwind:"$meta"},{$setWindowFields:{sortBy:{"meta.xp":-1},output:{rank:{$rank:{}}}}},{$match:{_id:e}},{$project:{_id:1,rank:1}}]))[0]}getCrewRanking(){return Q.aggregate([{$lookup:{from:"crewmetas",localField:"_id",foreignField:"crew",as:"meta"}},{$unwind:"$meta"},{$sort:{"meta.xp":-1}},{$limit:10},{$project:{_id:1,"meta.xp":1}}])}async increaseLimit(e){await this.update(e,{$inc:{memberLimit:1}})}async repair(e,t){await this.update(e,[{$set:{disintegration:{$min:[{$add:["$disintegration",t]},100]}}}])}async applyDisintegration(e){const t=await this.get(e);if(!t)return;const{memberLimit:a}=t,[n,i]=[a-2,(a-3)*2+3];await this.update(e,[{$set:{disintegration:{$max:[{$add:["$disintegration",-1*o.randomBetween(n,i)]},0]}}}])}}const rt=async r=>{const e=await Q.findById(r).lean();return e||null},at=(r,e)=>Q.findOneAndUpdate({_id:r},e,{returnDocument:"after"}).lean();class nt extends tt{constructor(){super(3600)}normalizeKey(e){return e.toString()}getKey({_id:e}){return e}fetchFromDb(e){return rt(e)}updateInDb(e,t){return at(e,t)}}const Oe=new nt;class st extends m{async hasXpBuff(e){const t=await this.get(e);if(!o.hasExpire(t.buffs.xp.expireAt))return t.buffs.xp}async calcXp(e,t){const a=await Oe.get(e);return a?Math.ceil(t*(a.disintegration/f.CREW_DEFAULT_DISINTEGRATION)*((await this.hasXpBuff(e))?.boost??1)):0}async addXp(e,t){await this.update(e,{$inc:{xp:t}})}async addBerry(e,t){await this.update(e,{$inc:{berry:t}})}async removeBerry(e,t){await this.update(e,{$inc:{berry:-t}})}async addXpBuff(e,t){const a=new Date;await this.update(e,[{$set:{"buffs.xp":{$cond:{if:{lt:["$buffs.xp.expireAt",a]},then:{boost:1.1,expireAt:{$add:[a,t*60*60*1e3]}},else:{boost:1.1,expireAt:{$add:["$buffs.xp.expireAt",t*60*60*1e3]}}}}}}])}}const y=r=>r.toObject({flattenMaps:!0,flattenObjectIds:!1}),De=new s.Schema({crew:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"Crew"},xp:{type:Number,default:0,index:-1},berry:{type:Number,default:0,index:-1},buffs:{xp:{boost:{type:Number,default:1.1},expireAt:{type:Date,default:new Date(0)}}}});De.post("findOneAndUpdate",async function(r){h(w.CREW_META,r.crew._id,r)});const pe=s.models?.CrewMeta||s.model("CrewMeta",De),it=async r=>await pe.create({crew:r});async function ut(r){const e=await pe.findOne({crew:r}).lean();return e||y(await it(r))}const ct=(r,e)=>pe.findOneAndUpdate({crew:r},e,{returnDocument:"after",upsert:!0}).lean();class dt extends st{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({crew:e}){return e}fetchFromDb(e){return ut(e)}updateInDb(e,t){return ct(e,t)}}const ye=new dt;class lt extends m{async unlockBadge(e,t,a){t.isProgressive?await this.update(e,{$addToSet:{unlockedBadges:`${t.id}_${a}`}}):await this.update(e,{$addToSet:{unlockedBadges:t.id}})}}const Te=new s.Schema({crew:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"Crew"},unlockedBadges:{type:[String],default:[]}});Te.post("findOneAndUpdate",async function(r){h(w.CREW_ORNAMENTS,r.crew._id,r)});const fe=s.models?.CrewOrnaments||s.model("CrewOrnaments",Te),ot=r=>fe.create({crew:r});async function pt(r){const e=await fe.findOne({crew:r}).lean();return e||y(await ot(r))}const yt=(r,e)=>fe.findOneAndUpdate({crew:r},e,{upsert:!0,returnDocument:"after"}).lean();class ft extends lt{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({crew:e}){return e}fetchFromDb(e){return pt(e)}updateInDb(e,t){return yt(e,t)}}const mt=new ft;class ht extends b{async getStatus(e,t){return(await this.get({crew:e,questId:t})).status}async isCompleted(e,t){return await this.getStatus(e,t)==="COMPLETED"}async isStreaking(e,t){const{lastCompletionDate:a}=await this.get({crew:e,questId:t});return!!a&&o.sameDay(o.yesterday(),a)}async completeQuest(e){return this.update(e,[{$set:{lastCompletionDate:new Date,status:f.QuestStatus.COMPLETED}}],{upsert:!1})}}const Re=new s.Schema({crew:{type:s.Schema.Types.ObjectId,required:!0,ref:"Crew",index:!0},questId:{type:String,required:!0,index:!0},status:{type:String,default:f.QuestStatus.IN_PROGRESS,index:!0},lastCompletionDate:Date},{minimize:!1});Re.post("findOneAndUpdate",function(r){h(w.CREW_QUEST,r.crew._id,r)});const H=s.models?.CrewQuest||s.model("CrewQuest",Re);function wt(r){return H.find(r).lean()}const St=async r=>await H.create({...r});async function gt(r){const e=await H.findOne(r).lean();return e||y(await St(r))}function bt(r,e,t){return H.findOneAndUpdate(r,e,{upsert:!0,...t,returnDocument:"after"}).lean()}class $t extends ht{constructor(){super(300)}normalizeKey({crew:e,questId:t}){return`${e.toString()}/${t}`}getKey({crew:e,questId:t}){return{crew:e,questId:t}}fetchFromDb(e){return gt(e)}fetchManyFromDb(e){return wt(e)}updateInDb(e,t,a){return bt(e,t,a)}}const Et=new $t;class It extends m{async setActualVoiceMembers(e,t){await this.update(e,{$set:{"currentVoiceState.amount":t,"currentVoiceState.connectedAt":new Date}})}async setMaxVoiceMembers(e,t){await this.update(e,{$set:{maxVoiceMembersReached:t}})}}const ve=new s.Schema({crew:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"Crew"},maxVoiceMembersReached:{type:Number,default:0},currentVoiceState:{amount:{type:Number,default:0},connectedAt:{type:Date,default:new Date(0)}}});ve.post("findOneAndUpdate",function(r){h(w.CREW_STATS_ENGAGEMENT,r.crew._id,r)});const me=s.models?.CrewStatsEngagement||s.model("CrewStatsEngagement",ve),Ut=r=>me.create({crew:r});async function Ot(r){const e=await me.findOne({crew:r}).lean();return e||y(await Ut(r))}const Dt=(r,e)=>me.findOneAndUpdate({crew:r},e,{upsert:!0,returnDocument:"after"}).lean();class Tt extends It{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({crew:e}){return e}fetchFromDb(e){return Ot(e)}updateInDb(e,t){return Dt(e,t)}}const Rt=new Tt;class vt extends m{}const Ce=new s.Schema({crew:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"Crew"},streak80Percent:{type:Number,default:0}});Ce.post("findOneAndUpdate",function(r){h(w.CREW_STATS_FREQUENCY,r.crew._id,r)});const he=s.models?.CrewStatsFrequency||s.model("CrewStatsFrequency",Ce),Ct=r=>he.create({crew:r});async function At(r){const e=await he.findOne({crew:r}).lean();return e||y(await Ct(r))}const Mt=(r,e)=>he.findOneAndUpdate({crew:r},e,{upsert:!0,returnDocument:"after"}).lean();class Bt extends vt{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({crew:e}){return e}fetchFromDb(e){return At(e)}updateInDb(e,t){return Mt(e,t)}}const _t=new Bt,Ae=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,ref:"User",index:!0},questId:{type:String,required:!0,index:!0},status:{type:String,default:f.QuestStatus.IN_PROGRESS,index:1},lastCompletionDate:Date,streak:Number},{minimize:!1});Ae.post("findOneAndUpdate",function(r){P(K.USER_QUEST,r.user._id,r),h(w.USER_QUEST,r.user._id,r)});const R=s.models?.UserQuest||s.model("UserQuest",Ae),qt=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)}}}),W=s.models?.UserCooldown||s.model("UserCooldown",qt),Me=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},crew:{type:s.Schema.Types.ObjectId,ref:"Crew",required:!0,index:!0},permission:{type:String,default:"member",required:!0},percent:{type:Number,default:f.CREW_DEFAULT_XP_PERCENT}},{minimize:!1});Me.post("findOneAndUpdate",function(r){h(w.USER_CREW,r.user._id,r)});const v=s.models?.UserCrew||s.model("UserCrew",Me),kt=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}}),G=s.models?.UserDailyReport||s.model("UserDailyReport",kt),Nt=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},encyclopedia:{type:[String],default:[]}}),Y=s.models?.UserEncyclopedia||s.model("UserEncyclopedia",Nt),xt=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}}),X=s.models?.UserGames||s.model("UserGames",xt),Be=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});Be.post("findOneAndUpdate",function(r){P(K.USER_INVENTORY,r.user._id,r),h(w.USER_INVENTORY,r.user._id,r)});const V=s.models?.UserInventory||s.model("UserInventory",Be),Ft=new oe.EventEmitter,jt=(r,e)=>{Ft.emit(r,e)},C={multiplier:{type:Number,default:0},origin:String,expireAt:{type:Date,default:null},startAt:{type:Date,default:null}},_e=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},premium:{type:Date,default:null},booster:{type:Boolean,default:!1},scam:{type:Boolean,default:!1},berry:{type:Number,default:1e3,index:-1},xp:{lastMessageWithXp:{type:Date,default:new Date},voice:{lastConnection:{type:Date,default:new Date},minutesInVoiceToday:{type:Number,default:0}},amount:{type:Number,default:0,index:-1},boost:{type:Date,default:null}},buffs:{cooldown:{casino:{type:[C],default:[]},work:{type:[C],default:[]}},berry:{work:{type:[C],default:[]},global:{type:[C],default:[]}},drop:{work:{type:[C],default:[]}},xp:{global:{type:[C],default:[]}}},hp:{type:Number,default:100},workUnluckyStreak:{type:Number,default:0},characteristics:{vitality:{type:Number,default:0},strength:{type:Number,default:0},agility:{type:Number,default:0},chance:{type:Number,default:0},intelligence:{type:Number,default:0},wisdom:{type:Number,default:0}},resetCharacteristics:{free:{type:Boolean,default:!0},nextAvailable:{type:Date,default:null}},scrolls:{vitality:{type:Number,default:0},strength:{type:Number,default:0},agility:{type:Number,default:0},chance:{type:Number,default:0},intelligence:{type:Number,default:0},wisdom:{type:Number,default:0}}});_e.post("findOneAndUpdate",async function(r){h(w.USER_META,r.user._id,r),r.hp<=0&&jt("death",r.user._id)});const D=s.models?.UserMeta||s.model("UserMeta",_e),qe=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"}});qe.post("findOneAndUpdate",function(r){h(w.USER_ORNAMENT,r.user._id,r)});const L=s.models?.UserOrnament||s.model("UserOrnament",qe),ke=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},currentRaid:{type:{raidId:String,seed:String,progression:{type:[String],default:[]},buffItem:String,rewards:{type:s.Schema.Types.Mixed,default:{}}},default:void 0},obtainedConditions:{type:s.Schema.Types.Mixed,default:{},_id:!1},obtainedRewards:{type:s.Schema.Types.Mixed,default:{},_id:!1},unlocked:{type:s.Schema.Types.Mixed,default:{},_id:!1}},{minimize:!1});ke.post("findOneAndUpdate",function(r){P(K.USER_RAID,r.user._id,r)});const J=s.models?.UserRaid||s.model("UserRaid",ke),zt=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}}}}),q=s.models?.UserSettings||s.model("UserSettings",zt),Pt=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}),Z=s.models?.UserShop||s.model("UserShop",Pt),Ne=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}}});Ne.post("findOneAndUpdate",function(r){h(w.USER_STATS_CASINO,r.user._id,r)});const A=s.models?.UserStatsCasino||s.model("UserStatsCasino",Ne),xe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},xpGivenToCrew:{type:Number,default:0},berryGivenToCrew:{type:Number,default:0},timeCrewBeyond10PercentXp:{type:Number,default:0},timeCrewAbove90PercentXp:{type:Number,default:0}});xe.post("findOneAndUpdate",function(r){h(w.USER_STATS_CREW,r.user._id,r)});const ee=s.models?.UserStatsCrew||s.model("UserStatsCrew",xe),Fe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},workCount:{type:Number,default:0},raidFinishedCount:{type:Number,default:0},totalSpentInShop:{type:Number,default:0}});Fe.post("findOneAndUpdate",function(r){h(w.USER_STATS_ECONOMY,r.user._id,r)});const te=s.models?.UserStatsEconomy||s.model("UserStatsEconomy",Fe),je=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:[]}});je.post("findOneAndUpdate",function(r){h(w.USER_STATS_ENGAGEMENT,r.user._id,r)});const re=s.models?.UserStatsEngagement||s.model("UserStatsEngagement",je),ze=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}}});ze.post("findOneAndUpdate",function(r){h(w.USER_STATS_FLAGS,r.user._id,r)});const ae=s.models?.UserStatsFlags||s.model("UserStatsFlags",ze),Pe=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},edito:{readToday:{type:Number,default:0},lastTimeRead:{type:Date,default:new Date}}});Pe.post("findOneAndUpdate",function(r){h(w.USER_STATS_FREQUENCY,r.user._id,r)});const M=s.models?.UserStatsFrequency||s.model("UserStatsFrequency",Pe),Ke=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}}});Ke.post("findOneAndUpdate",function(r){h(w.USER_STATS_INVENTORY,r.user._id,r)});const B=s.models?.UserStatsInventory||s.model("UserStatsInventory",Ke),we=new s.Schema({discordId:{type:String,required:!0,unique:!0},birthday:{type:Date,default:null,index:1},faction:{type:String,default:f.DEFAULT_FACTION,index:1},canChangeFaction:{type:Boolean,default:!1},canChooseFaction:{type:Boolean,default:!1}});we.post("findOneAndUpdate",function(r){h(w.USER,r._id,r)}),we.post("deleteOne",async function(){const r=this.getQuery()._id;await W.deleteOne({user:r}),await v.deleteOne({user:r}),await G.deleteOne({user:r}),await Y.deleteOne({user:r}),await X.deleteOne({user:r}),await V.deleteOne({user:r}),await D.deleteOne({user:r}),await L.deleteOne({user:r}),await R.deleteMany({user:r}),await J.deleteOne({user:r}),await q.deleteOne({user:r}),await Z.deleteOne({user:r}),await A.deleteOne({user:r}),await ee.deleteOne({user:r}),await te.deleteOne({user:r}),await re.deleteOne({user:r}),await ae.deleteOne({user:r}),await M.deleteOne({user:r}),await B.deleteOne({user:r})});const E=s.models?.User||s.model("User",we);class Kt extends b{getByObjectId(e){return this.update({_id:e},{})}getNextBirthdays(){const e=new Date,t=e.getFullYear();return E.aggregate([{$match:{birthday:{$ne:null}}},{$set:{birthdayThisYear:{$dateFromParts:{year:t,month:{$month:"$birthday"},day:{$dayOfMonth:"$birthday"}}}}},{$set:{nextBirthday:{$cond:[{$lt:["$birthdayThisYear",e]},{$dateFromParts:{year:{$add:[t,1]},month:{$month:"$birthday"},day:{$dayOfMonth:"$birthday"}}},"$birthdayThisYear"]}}},{$sort:{nextBirthday:1}},{$limit:10},{$project:{_id:0,discordId:1,birthday:1,nextBirthday:1}}])}getFactionRanking(e){return E.aggregate([{$match:{faction:e}},{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$sort:{"meta.xp.amount":-1}},{$limit:10},{$project:{_id:1,discordId:1,"meta.xp.amount":1}}])}getGlobalRanking(){return E.aggregate([{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$sort:{"meta.xp.amount":-1}},{$limit:10},{$project:{_id:1,discordId:1,"meta.xp.amount":1}}])}getBerryRanking(){return E.aggregate([{$lookup:{from:"usermetas",localField:"_id",foreignField:"user",as:"meta"}},{$unwind:"$meta"},{$sort:{"meta.berry":-1}},{$limit:10},{$project:{_id:1,discordId:1,"meta.berry":1}}])}getQuestRanking(){return R.aggregate([{$match:{status:f.QuestStatus.COMPLETED}},{$group:{_id:"$user",questCount:{$sum:1}}},{$setWindowFields:{sortBy:{questCount:-1},output:{rank:{$rank:{}}}}},{$project:{_id:0,discordId:"$_id",questCount:1,rank:1}},{$sort:{rank:1}}])}getTodayAllBirthday(){const e=new Date;return E.aggregate([{$match:{birthday:{$ne:null}}},{$addFields:{birthMonth:{$month:"$birthday"},birthDay:{$dayOfMonth:"$birthday"}}},{$addFields:{currentMonth:{$month:e},currentDay:{$dayOfMonth:e}}},{$match:{$expr:{$and:[{$eq:["$birthMonth","$currentMonth"]},{$eq:["$birthDay","$currentDay"]}]}}}])}async canChooseFaction(e,t){typeof e=="string"?await this.update({discordId:e},{$set:{canChooseFaction:t}}):await this.update({_id:e},{$set:{canChooseFaction:t}})}async canChangeFaction(e,t){typeof e=="string"?await this.update({discordId:e},{$set:{canChangeFaction:t}}):await this.update({_id:e},{$set:{canChangeFaction:t}})}async setBirthday(e,t){await this.update({discordId:e},{$set:{birthday:t}})}async updateFaction(e,t){await this.update({discordId:e},{$set:{faction:t}})}}const Qt=(r,e)=>E.find(r,{},e).lean(),Ht=r=>E.create({discordId:r});async function Wt(r,{upsert:e=!0,...t}){const a=await E.findOne({discordId:r},{},t).lean();return!a&&e?y(await Ht(r)):a}const Gt=(r,e)=>E.findOneAndUpdate(r,e,{upsert:!0,returnDocument:"after"}).lean();class Yt extends Kt{constructor(){super(3600)}normalizeKey(e){return e}getKey({discordId:e}){return e}fetchFromDb(e,t){return Wt(e,t)}fetchManyFromDb(e,t){return Qt(e,t)}updateInDb(e,t){return Gt(e,t)}}const Qe=new Yt,Xt=["work",...f.GAME_TYPES],Vt=new s.Schema({user:{type:s.Schema.Types.ObjectId,ref:"User",required:!0,index:!0},date:{type:Date,index:-1,required:!0},type:{type:String,required:!0}},{minimize:!1}),k=s.models?.Reminder||s.model("Reminder",Vt),Lt=async r=>{await k.deleteMany(r)},Jt=async(r,e)=>{await k.deleteOne({user:r,type:e})};class Zt extends b{getAllPassedReminder(){return this.getMany({date:{$lte:new Date}})}async addReminder(e,t,a){await this.update({user:e,type:t},{$set:{date:a}},{upsert:!0})}async updateReminderDate(e,t,a){await this.update({user:e,type:t},[{$set:{date:{$add:["$date",a]}}}])}async removeReminder(e,t){await Jt(e,t),this.invalidate({user:e,type:t})}async deleteSelectedReminders(e){const t=await this.getMany({_id:{$in:e}});await Lt({_id:{$in:e}}),t.forEach(a=>{this.invalidate({user:a.user,type:a.type})})}}function er(r,e){return k.find(r,{},e).lean()}async function tr(r){const e=await k.findOne(r).lean();return e||null}async function rr(r,e,t){return k.findOneAndUpdate(r,e,{...t,returnDocument:"after"}).lean()}class ar extends Zt{constructor(){super(300)}getKey(e){return{user:e.user,type:e.type}}normalizeKey({user:e,type:t}){return`${e.toString()}/${t}`}fetchFromDb(e){return tr(e)}fetchManyFromDb(e,t){return er(e,t)}updateInDb(e,t,a={upsert:!1}){return rr(e,t,a)}}const N=new ar;class nr extends b{async isOrnamentIds(e,t=()=>!0){const n=(await this.getAll()).filter(t).map(({ornamentId:i})=>i);return e.every(i=>n.includes(i))}isOrnament(e){return!!e&&"ornamentId"in e}isTitle(e){return e.type==="title"}isBackground(e){return e.type==="background"}isQuestTitle(e){return this.isTitle(e)&&!("faction"in e)&&!("price"in e)}isFactionTitle(e){return this.isTitle(e)&&"faction"in e}isShopTitle(e){return this.isTitle(e)&&"price"in e}async getAllBackgrounds(){return(await this.getAll()).filter(this.isBackground)}async getAllTitles(){return(await this.getAll()).filter(this.isTitle)}async getAllFactionTitles(){return(await this.getAll()).filter(this.isFactionTitle)}async getAllQuestTitles(){return(await this.getAll()).filter(this.isQuestTitle)}async getAllShopTitles(){return(await this.getAll()).filter(this.isShopTitle)}formatBackgroundId(e){return e.ornamentId==="background_default"?"par défaut":`"${o.capitalizeAllWords(e.ornamentId.split("_").join(" "))}"`}pickOrnament(e){const t=Math.random();let a=0;if(Object.keys(e).map(i=>parseFloat(i)).reduce((i,u)=>i+u,0)!==1)throw RangeError("pickOrnament - Sum of all odds (keys) must be equal to 1");for(const[i,u]of Object.entries(e)){const l=parseFloat(i);if(t>=a+l){a+=l;continue}if(u.length!==0)return u[o.randomBetween(0,u.length)]}throw Error("pickOrnament - All ods array were empty")}pickEachRarityOrnament(e,t){if(t.length!==f.RANK_IDS_WITHOUT_BASIC.length)throw new RangeError("pickEachRarityOrnament - must give same number of odds than ranks");return o.filterNullAndUndefined(t.map((a,n)=>{const i=f.RANK_IDS_WITHOUT_BASIC[n],u=e[i];return Math.random()>a||!u||!u.length?null:o.pickFrom(u)}))}}const sr=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}),Se=s.models?.Ornaments||s.model("Ornaments",sr),ir=async(r,e)=>Se.find(r,{},e).lean();async function ur(r){const e=await Se.findOne({ornamentId:r}).lean();return e||null}const cr=(r,e)=>Se.findOneAndUpdate(r,e,{returnDocument:"after"}).lean();class dr extends nr{constructor(){super(3600)}updateInDb(e,t){return cr(e,t)}fetchFromDb(e){return ur(e)}fetchManyFromDb(e,t){return ir(e,t)}getKey(e){return e.ornamentId}normalizeKey(e){return e}}const g=new dr,lr=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}),x=s.models?.Panoplies||s.model("Panoplies",lr),or=(r,e)=>x.find(r,{},e).lean(),pr=async(r,e)=>x.find(r,{},e).populate("equipments");async function yr(r){const e=await x.findOne({panoplyId:r}).lean();return e||null}const fr=async r=>x.findOne(r).populate("equipments");class mr extends b{getAllPopulated(){return pr({},{})}getPopulated(e){return fr({panoplyId:e})}hasPanoply(e,t){const a=o.filterNullAndUndefined(Object.values(e)),n=t.equipments.filter(i=>a.find(u=>u.entityId===i.entityId)).length;if(n===t.equipments.length)return t.fullBonus;if(n>=t.equipments.length/2)return t.halfBonus}async getPanoplyBonus(e){const t=[],a=await this.getAllPopulated();for(const n of a){const i=o.filterNullAndUndefined(Object.values(e)),u=n.equipments.filter(l=>i.find(({entityId:c})=>c===l.entityId));u.length===n.equipments.length?t.push([n,"full"]):u.length>=n.equipments.length/2?t.push([n,"half"]):u.length>=1&&t.push([n,null])}return t}}const hr=async(r,e)=>x.findOneAndUpdate(r,e,{returnDocument:"after"}).lean();class wr extends mr{constructor(){super(3600)}normalizeKey(e){return e}getKey({panoplyId:e}){return e}updateInDb(e,t){return hr(e,t)}fetchFromDb(e){return yr(e)}fetchManyFromDb(e,t){return or(e,t)}}const I=new wr;class Sr extends b{isEntity(e){return!!e&&"entityId"in e}isItem(e){return e.category!=="equipment"}isEquipment(e){return e.category==="equipment"}async isEntityId(e,t=()=>!0){return(await this.getAll()).filter(t).map(({entityId:n})=>n).includes(e)}async getSomeStoreItems(e){const t=(await this.getAll()).filter(this.isStoreItem);return this.getSomeItems(e,t)}async getSomeRepairItems(e){const t=(await this.getAll()).filter(this.isRepairItem);return o.shuffle(t).slice(0,e)}async getSomeObjectItems(e){const t=(await this.getAll()).filter(this.isObjectItem);return o.shuffle(t.filter(a=>!!a.shop?.price)).slice(0,e)}async idArrayToEntities(e){return(await this.getAll()).filter(t=>e.includes(t.entityId))}recordToEntities(e){return this.idArrayToEntities(Object.keys(e))}async recordToEntityTuple(e){const t=await this.getAll();return o.recordToArray(e).reduce((a,[n,i])=>{const u=t.find(({entityId:l})=>l===n);return u&&a.push([u,i]),a},[])}async getAllEntitiesLimit(){const e=await this.getAll();return o.arrayToRecord(e.map(t=>[t.entityId,t.shop?.limit??0]))}async getAllEntitiesBy(e){return(await this.getAll()).filter(e)}async fromDBToEquipableEquipment(e){const a=(await this.getAll()).filter(this.isEquipment).find(({entityId:n})=>n===e.entityId);if(!a)throw new Error(`cannot find any equipment: ${e.entityId}`);return this.seedEquipment(a,e.seed)}async getUserEquipmentsCharacteristics(e){let t={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};const a=await I.getAllPopulated();for(const n of f.EQUIPMENT_SLOT){const i=e[n];i&&(t=o.mergeObjects(t,(await this.fromDBToEquipableEquipment(i)).characteristics,(u,l)=>u+l))}for(const n of a){const i=I.hasPanoply(e,n);i&&!("target"in i)&&(t=o.mergeObjects(t,i,(u,l)=>u+l))}return t}getSomeItems(e,t){const a=[];for(;a.length<e;){const n=o.exclude(t,a,i=>i.entityId);a.push(g.pickOrnament(o.groupBy(n,i=>i.shop?.odd??0)))}return o.sortBy(a,n=>n.shop?.price??0)}filterCraftEntities(e){return e.filter(t=>t.usage?.craft)}filterDismantleEntities(e){return e.filter(t=>t.usage?.dismantle)}filterUsableEntities(e){return e.filter(t=>t.usage?.mode)}filterEnchantableEntities(e){return e.filter(t=>t.usage?.enchant)}hasCraftEntities(e){return!!e.find(t=>t.usage?.craft)}hasDismantleEntities(e){return!!e.find(t=>t.usage?.dismantle)}hasEnchantableEntities(e){return!!e.find(t=>t.usage?.enchant)}hasUsableEntities(e){return!!e.find(t=>t.usage?.mode)}isChestItem(e){return e.type==="chest"}isBottleItem(e){return e.type==="bottle"}isBoostItem(e){return e.type==="boost"}isRepairItem(e){return e.type==="repair"}isStoreItem(e){return e.type==="store"}isObjectItem(e){return e.type==="object"}isScrollItem(e){return e.type==="scroll"}isCookedMeal(e){return e.type==="cookedMeal"}isAlcoholItem(e){return e.type==="alcohol"}isSameEquipment(e,t){return e.entityId===t.entityId&&e.seed===t.seed}seedEquipment(e,t){const a=o.seededRandom(t),n=o.sortBy(o.recordToArray(e.characteristics),([i])=>i);return{...e,seed:t,characteristics:Object.fromEntries(n.map(([i,u])=>[i,Array.isArray(u)?o.randomBetween(u[0],u[1]+1,a):u]))}}isEquipped(e,t){return!!Object.values(e).find(a=>a&&this.isSameEquipment(a,t))}calcILvl(e){return Object.values(e.characteristics).reduce((a,n)=>a+n,0)+e.level}}const gr=new s.Schema({type:{type:String,enum:f.EFFECT_KEYS,required:!0},params:{type:s.Schema.Types.Mixed}},{_id:!1}),br=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:[gr],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}),ne=s.models?.Entities||s.model("Entities",br),$r=async r=>await ne.create({...r}),Er=async(r,e)=>ne.find(r,{},e).lean();async function Ir(r){const e=await ne.findOne({entityId:r}).lean();return e||null}const Ur=(r,e)=>ne.findOneAndUpdate(r,e,{returnDocument:"after"}).lean();class Or extends Sr{constructor(){super(3600)}createInDb(e){return $r(e)}updateInDb(e,t){return Ur(e,t)}fetchFromDb(e){return Ir(e)}fetchManyFromDb(e,t){return Er(e,t)}normalizeKey(e){return e}getKey(e){return e.entityId}}const p=new Or,Dr=(r,e,t)=>v.create({user:r,crew:e,permission:t}),Tr=async r=>{await v.deleteOne({user:r})};class Rr extends b{async updatePercent(e,t){await this.update(e,{$set:{percent:t}})}async updatePermission(e,t){await this.update(e,{$set:{permission:t}})}async addUserToCrew(e,t,a){await Dr(e,t,a),this.invalidate(t)}async removeUserFromCrew(e,t){await Tr(e),this.invalidate(e),this.invalidate(t)}async getAllUserIdsFromCrew(e){const t=e.toString(),a=this.cache.get(t);if(a)return a.map(({user:i})=>i);const n=await this.getMany({crew:e});return this.cache.set(t,n),n.map(({user:i})=>i)}}const vr=r=>v.find(r).lean(),Cr=r=>v.findOne({user:r}).lean(),Ar=(r,e)=>v.findOneAndUpdate({user:r},e,{returnDocument:"after"}).lean();class Mr extends Rr{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Cr(e)}fetchManyFromDb(e){return vr(e)}updateInDb(e,t){return Ar(e,t)}}const He=new Mr;class Br extends m{hasAlreadyFoundEntity(e,t){return e.encyclopedia.includes(t)}async addEntities(e,t){await this.update(e,{$addToSet:{encyclopedia:{$each:t}}})}}const _r=async r=>await Y.create({user:r});async function qr(r){const e=await Y.findOne({user:r}).lean();return e||y(await _r(r))}const kr=(r,e)=>Y.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class Nr extends Br{constructor(){super(300)}fetchFromDb(e){return qr(e)}getKey({user:e}){return e}normalizeKey(e){return e.toString()}updateInDb(e,t){return kr(e,t)}}const se=new Nr;class xr extends m{getPanoplyEffectiveBonus(e,t){const a=o.filterNullAndUndefined(Object.values(e.equippedItems)),n=t.equipments.filter(i=>a.find(u=>u.entityId===i.entityId)).length;if(n===t.equipments.length)return t.fullBonus;if(n>=t.equipments.length/2)return t.halfBonus}async getUserEquipmentsCharacteristics(e){let t={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};const a=await I.getAllPopulated();for(const n of f.EQUIPMENT_SLOT){const i=e.equippedItems?.[n];if(!i)continue;const u=await p.fromDBToEquipableEquipment(i);t=o.mergeObjects(t,u.characteristics,(l,c)=>l+c)}for(const n of a){const i=this.getPanoplyEffectiveBonus(e,n);i&&!("target"in i)&&(t=o.mergeObjects(t,i,(u,l)=>u+l))}return t}async hasInventoryRequirements(e,t){const a=await this.get(e);return o.recordToArray(t).reduce((n,[i,u])=>n&&(a.itemList[i]??0)>=(u??0),!0)}async hasEnoughEntity(e,t,a){return((await this.get(e)).itemList[a]??0)>=t}async getItemList(e){return(await this.get(e)).itemList}async calcBottleMultiplier(e,{bottle:{buffs:t}}){const a=await this.get(e),i=(await I.getPanoplyBonus(a.equippedItems)).find(([u,l])=>u.panoplyId==="herbalist"&&l!==null);return i&&i[1]==="full"?t.map(u=>({...u,multiplier:u.multiplier*1.25})):i&&i[1]==="half"?t.map(u=>({...u,multiplier:u.multiplier*1.1})):t}async calcMinStreakForWorkLoot(e){const t=await this.get(e),a=(await I.getPanoplyBonus(t.equippedItems)).find(([n,i])=>n.panoplyId==="marine"&&i!==null);return a&&a[1]==="full"?10:a&&a[1]==="half"?20:1/0}async hasRevolutionaryBuff(e){const t=await this.get(e);return(await I.getPanoplyBonus(t.equippedItems)).find(([n,i])=>n.panoplyId==="revolutionary"&&i!==null)?.[1]??null}async addItem(e,t,a){await this.update(e,{$inc:{[`itemList.${t}`]:a}}),await se.addEntities(e,[t])}async addItems(e,t){await this.update(e,{$inc:Object.fromEntries(Object.entries(t).filter(([,a])=>(a??0)>0).map(([a,n])=>[`itemList.${a}`,n]))}),await se.addEntities(e,o.recordToArray(t).filter(([,a])=>a>0).map(([a])=>a))}async removeItem(e,t,a){a!==0&&await this.update(e,[{$set:{[`itemList.${t}`]:{$max:[{$add:[`$itemList.${t}`,-a]},0]}}}])}async removeEquipment(e,t,a){await this.update(e,{$pull:{equipmentList:{entityId:t,seed:a}}})}async removeAllItem(e,t){await this.update(e,{$set:{[`itemList.${t}`]:0}})}async addEquipments(e,t){await this.update(e,{$push:{equipmentList:{$each:t}}}),await se.addEntities(e,t.map(a=>a.entityId))}async saveEquipments(e){await this.update(e,[{$set:{equipmentSave:{$push:["$equipmentSave","$equippedItems"]}}}])}async changeEquippedEquipment(e,t){const a=await this.get(e);a?.equipmentSave[t]&&await this.equip(e,a.equipmentSave[t])}async equip(e,t){const a=await U.getMaxHp(e),n=Object.fromEntries(o.recordToArray(t).map(([i,u])=>[`equippedItems.${i}`,u]));await this.update(e,{$set:n}),await U.updateHp(e,a)}async unequip(e,t){const a=await U.getMaxHp(e);await this.update(e,{$set:{[`equippedItems.${t}`]:null}}),await U.updateHp(e,a)}async craftItem(e,t,a,n){for(const{entityId:l,size:c}of t.entities)await this.removeItem(e,l,c*a);const{entityId:i,size:u}=t.result;await p.isEntityId(i,p.isEquipment)?await this.addEquipments(e,[{entityId:i,seed:n}]):await p.isEntityId(i,p.isItem)&&await this.addItem(e,i,u*a)}async dismantleEntity(e,t,a,n,i){p.isEquipment(t)?await this.removeEquipment(e,t.entityId,i):p.isItem(t)&&await this.removeItem(e,t.entityId,n);for(const{entityId:u,quantity:l}of a)await p.isEntityId(u,p.isItem)&&await this.addItem(e,u,n*l);await this.removeItem(e,"tools",1)}async enchantItem(e,t,a,n,i){await this.removeItem(e,t,i*4),await this.removeItem(e,n,i),await this.addItem(e,a,i)}async unlockRecipe(e,t){await this.update(e,{$addToSet:{recipes:t}})}}const Fr=r=>V.create({user:r});async function jr(r){const e=await V.findOne({user:r}).lean();return e||y(await Fr(r))}const zr=(r,e)=>V.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class Pr extends xr{constructor(){super(300)}fetchFromDb(e){return jr(e)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}updateInDb(e,t){return zr(e,t)}}const S=new Pr;class Kr extends b{async getTotalCharacteristics(e){const{characteristics:t,scrolls:a}=await this.get(e);return o.arrayToRecord(f.CHARACTERISTICS.map(n=>[n,f.getComputedCharacteristicValue(t[n])+a[n]]))}async isCooldownForXpPassed(e){const t=await this.get(e);return Date.now()-t.xp.lastMessageWithXp.getTime()>60*1e3}async getAllWithExpiredBuffs(){const e=new Date;return this.getMany({$or:[{"xp.boost":{$lt:e}},{"buffs.cooldown.casino":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.cooldown.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.berry.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.berry.global":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.drop.work":{$elemMatch:{expireAt:{$lt:e}}}},{"buffs.xp.global":{$elemMatch:{expireAt:{$lt:e}}}}]})}async calcXpBoost(e){const t=await this.get(e),{boost:a}=t.xp,n=a!==null&&Date.now()<a.getTime()?.2:0,i=Math.max(t.premium?.5:0,t.booster?.25:0);return n+i+t.buffs.xp.global.reduce((u,{expireAt:l,startAt:c,multiplier:$})=>c&&c>new Date||l&&o.hasExpire(l)?u:u+$,0)}calcMessageXp(e){const t=e.trim().length,a=2;return t<10?10*a:t>300?300*a:t*a}async getXpDeathPenalties(e){const t=await this.get(e),a=f.getCurrentLevel(t.xp.amount);return a<=10?5e3:a<=20?1e4:a<=30?2e4:a<=40?3e4:a<=50?5e4:a<=60?75e3:a<=70?15e4:a<=80?25e4:a<=90?4e5:a<=100?75e4:14e6}async calcXp(e,t,a){return t*=1+await this.calcXpBoost(e),Math.ceil(t*a)}async calcBerry(e,t,a){if(t<=0)return t;const n=a?1:await this.calcBuffMultiplier(e,"berry","global");return Math.ceil(t*(n||1))}async calcBuffMultiplier(e,t,a){return(await this.get(e)).buffs[t][a].reduce((u,{expireAt:l,startAt:c,multiplier:$})=>u+(new Date>=(c??new Date)&&(!l||!o.hasExpire(l))?$:0),1)}async getMaxHp(e){const t=await S.get(e),{vitality:a}=await this.getTotalCharacteristics(e),n=await S.getUserEquipmentsCharacteristics(t);return(a+n.vitality)*f.HP_PER_VITALITY+f.DEFAULT_MAX_HP}async getHpRatio(e){const t=await this.get(e),a=await this.getMaxHp(e);return Math.min(t.hp/a,1)}async hasCharacteristicRequirement(e,t){const a=await S.get(e),n=await S.getUserEquipmentsCharacteristics(a),i=o.mergeObjects(await this.getTotalCharacteristics(e),n,(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 a of Object.values(t.buffs))for(const n of Object.values(a))for(const{multiplier:i,startAt:u,expireAt:l}of n)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:a}}=await this.update(e,[{$set:{"xp.boost":{$cond:{if:{$or:[{$not:"$xp.boost"},{$lt:["$xp.boost",new Date]}]},then:{$add:[new Date,t]},else:{$add:["$xp.boost",t]}}}}}]);return a}async updateBuff(e,t){if(Array.isArray(t)){for(const n of t)await this.updateBuff(e,n);return}const a=f.transformToDBBuff(t);await this.update(e,[{$set:{[`buffs.${t.target}`]:{$map:{input:`$buffs.${t.target}`,as:"buff",in:{$cond:{if:{$eq:[{$substr:["$$buff.origin",0,{$indexOfBytes:["$$buff.origin","/"]}]},t.origin.split("/")[0]]},then:{multiplier:t.multiplier,origin:t.origin,expireAt:a.expireAt?{$cond:{if:{$lt:["$$buff.expireAt",new Date]},then:a.expireAt,else:{$add:["$$buff.expireAt",(t.endIn??0)*60*60*1e3]}}}:null,startAt:{$cond:{if:{$gte:["$$buff.startAt",new Date]},then:"$$buff.startAt",else:{$add:[new Date,(t.startIn??0)*60*60*1e3]}}}},else:"$$buff"}}}}}},{$set:{[`buffs.${t.target}`]:{$cond:{if:{$in:[t.origin.split("/")[0],{$map:{input:`$buffs.${t.target}`,as:"buff",in:{$substr:["$$buff.origin",0,{$indexOfBytes:["$$buff.origin","/"]}]}}}]},then:`$buffs.${t.target}`,else:{$concatArrays:[`$buffs.${t.target}`,[{...a}]]}}}}}])}async removeBuff(e,t){await this.update(e,{$pull:{[`buffs.${t.target}`]:{origin:t.origin}}})}async updatePanoplyBuff(e,t,a,n){const i=await p.fromDBToEquipableEquipment(t),u=o.filterNullAndUndefined(Object.values(a)),c=(await I.getAllPopulated()).find(T=>T.panoplyId===i.panoply);if(!c)return;const $=c.equipments.filter(T=>(u.find(le=>T.entityId===le.entityId)||!n&&i.entityId===T.entityId)&&(n?i.entityId!==T.entityId:!0)).length,j=$===c.equipments.length?c.fullBonus:$>=c.equipments.length/2?c.halfBonus:void 0;c.halfBonus&&"target"in c.halfBonus&&await this.removeBuff(e,c.halfBonus),c.fullBonus&&"target"in c.fullBonus&&await this.removeBuff(e,c.fullBonus),j&&"target"in j&&await this.updateBuff(e,j)}async gainHp(e,t){const a=await this.get(e),i=await this.getMaxHp(e)-a.hp;await this.update(e,{$set:{hp:a.hp+Math.floor(Math.min(t,i))}})}async loseHp(e,t){await this.update(e,[{$set:{hp:{$max:[{$add:["$hp",-t]},0]}}}])}async updateHp(e,t){const a=await this.getMaxHp(e);await this.update(e,[{$set:{hp:{$round:[{$multiply:[{$divide:["$hp",t]},a]},0]}}}])}async addCharacteristics(e,t){const a=await this.getMaxHp(e),n=Object.fromEntries(Object.entries(t).filter(([,i])=>i!==0).map(([i,u])=>[`characteristics.${i}`,u]));await this.update(e,{$inc:n}),await this.updateHp(e,a)}async addScrollCharacteristic(e,t){const a=await this.getMaxHp(e),n=Object.fromEntries(Object.entries(t).filter(([,i])=>i!==0).map(([i,u])=>[`scrolls.${i}`,u]));await this.update(e,{$inc:n}),await this.updateHp(e,a)}async resetCharacteristics(e,t){const a=await this.getMaxHp(e),n={vitality:0,strength:0,agility:0,chance:0,intelligence:0,wisdom:0};t?await this.update(e,{$set:{characteristics:n,"resetCharacteristics.free":!1}}):await this.update(e,{$set:{characteristics:n,"resetCharacteristics.nextAvailable":new Date(Date.now()+720*60*60*1e3)},$inc:{berry:-1e8}}),await this.updateHp(e,a)}async resetMinutesInVoiceToday(e){await this.update(e,{$set:{"xp.voice.minutesInVoiceToday":0}})}async addMinutesInVoiceToday(e,t){await this.update(e,{$inc:{"xp.voice.minutesInVoiceToday":t}})}async updateLastVoiceConnection(e,t){await this.update(e,{$set:{"xp.voice.lastConnection":t}})}async incrementWorkUnluckyStreak(e){await this.update(e,{$inc:{workUnluckyStreak:1}})}async resetWorkUnluckyStreak(e){await this.update(e,{$set:{workUnluckyStreak:0}})}async updateScam(e,t){await this.update(e,{$set:{scam:t}})}async updateUserXp(e,t){const a=await He.get(e),n=a?.percent??0,i=await this.calcXp(e,t,(1-n)*await this.getHpRatio(e));let u=0;return await this.addXp(e,i),a&&(u=await ye.calcXp(a.crew,t*n),await ye.addXp(a.crew,u)),{userXp:i,crewXp:u}}async updateUserBerry(e,t,a){const n=await this.calcBerry(e,t,a);return await this.addBerry(e,n),n}}const Qr=r=>D.find(r).lean(),Hr=async r=>await D.create({user:r});async function Wr(r){const e=await D.findOne({user:r}).lean();return e||y(await Hr(r))}const Gr=(r,e)=>D.findOneAndUpdate({user:r},e,{returnDocument:"after",upsert:!0}).lean();class Yr extends Kr{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Wr(e)}fetchManyFromDb(e){return Qr(e)}updateInDb(e,t){return Gr(e,t)}}const U=new Yr;class Xr extends b{async updateSendDailyQuest(e,t){await this.update(e,{$set:{sendDailyQuest:t}})}async updateSendDailyReport(e,t){await this.update(e,{$set:{sendDailyReport:t}})}async updateInventorySort(e,t){await this.update(e,{$set:{"sort.inventory":t}})}async updateReminderSettings(e,t,a){await this.update(e,{$set:{[`reminder.${t}`]:a}})}getUsersWithDailyReportEnable(){return this.getMany({sendDailyReport:!0})}}const Vr=r=>q.find(r).lean(),Lr=async r=>await q.create({user:r});async function Jr(r){const e=await q.findOne({user:r}).lean();return e||y(await Lr(r))}const Zr=(r,e)=>q.findOneAndUpdate({user:r},e,{returnDocument:"after",upsert:!0}).lean();class ea extends Xr{constructor(){super(3600)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return Jr(e)}fetchManyFromDb(e){return Vr(e)}updateInDb(e,t){return Zr(e,t)}}const ge=new ea;class ta extends m{async getCommandCooldown(e,t){return(await this.get(e)).commands[t]}async getRaidCooldown(e,t){return(await this.get(e)).raid[t]}async reduceRaidCooldown(e,t){await this.update(e,[{$set:{"raid.special":{$subtract:[{$ifNull:["$raid.special",new Date]},t*3600*1e3]},"raid.classic":{$subtract:[{$ifNull:["$raid.classic",new Date]},t*3600*1e3]}}}]),await N.updateReminderDate(e,"raid/special",-1*t*3600*1e3),await N.updateReminderDate(e,"raid/classic",-1*t*3600*1e3)}async startRaidCooldown(e,t,a){const{reminder:n}=await ge.get(e);await this.update(e,{$set:{[`raid.${t}`]:new Date(Date.now()+a)}}),n.raid[t]&&await N.addReminder(e,`raid/${t}`,new Date(Date.now()+a))}async lockUserCommand(e){await this.update(e,{$set:{lockUserCommand:new Date(Date.now()+2*3600*1e3)}}),await U.gainHp(e,1)}async useCommand(e,t,a){const{reminder:n}=await ge.get(e);await this.update(e,{$set:{[`commands.${t}`]:new Date(Date.now()+a)}}),n.commands[t]&&await N.addReminder(e,`commands/${t}`,new Date(Date.now()+a))}}const ra=async r=>await W.create({user:r});async function aa(r){const e=await W.findOne({user:r}).lean();return e||y(await ra(r))}const na=(r,e)=>W.findOneAndUpdate({user:r},e,{returnDocument:"after",upsert:!0}).lean();class sa extends ta{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return aa(e)}updateInDb(e,t){return na(e,t)}}const We=new sa;class ia extends m{async unlockTitle(e,t){await g.isOrnamentIds([t],g.isTitle)&&await this.update(e,{$addToSet:{unlockedTitles:t}})}async unlockTitles(e,t){await g.isOrnamentIds(t,g.isTitle)&&await this.update(e,{$addToSet:{unlockedTitles:{$each:t}}})}async selectTitle(e,t){await this.update(e,{$set:{selectedTitle:t}})}async unlockBackground(e,t){await g.isOrnamentIds([t],g.isBackground)&&await this.update(e,{$addToSet:{unlockedBackgrounds:t}})}async unlockBackgrounds(e,t){await g.isOrnamentIds(t,g.isBackground)&&await this.update(e,{$addToSet:{unlockedBackgrounds:{$each:t}}})}async selectBackground(e,t){await this.update(e,{$set:{selectedBackground:t}})}async unlockBadge(e,t,a){t.isProgressive?await this.update(e,{$addToSet:{unlockedBadges:`${t.id}_${a}`}}):await this.update(e,{$addToSet:{unlockedBadges:t.id}})}async unlockFactionBadge(e,t){await this.update(e,{$addToSet:{unlockedFactionBadges:{$each:[`b_marine_${t}`,`b_revolutionary_${t}`,`b_pirate_${t}`]}}})}async unlockProfileAsset(e,t){await this.update(e,{$addToSet:{unlockedProfileAssets:t}})}async unlockBag(e,t){await this.update(e,{$addToSet:{unlockedBags:t}})}async selectBag(e,t){await this.update(e,{$set:{selectedBag:t}})}}const ua=async r=>await L.create({user:r});async function ca(r){const e=await L.findOne({user:r}).lean();return e||y(await ua(r))}const da=async(r,e)=>L.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class la extends ia{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return ca(e)}updateInDb(e,t){return da(e,t)}}const F=new la;class oa extends b{async getStatus(e,t){return(await this.get({user:e,questId:t})).status}async isCompleted(e,t){return await this.getStatus(e,t)==="COMPLETED"}async isStreaking(e,t){const{lastCompletionDate:a}=await this.get({user:e,questId:t});return!!a&&o.sameDay(o.yesterday(),a)}async getStreakMultiplier(e,t){const a=await this.get({user:e,questId:t});return await this.isStreaking(e,t)?1+Math.min(2,(a.streak??0)/10):1}async getCompletedCount(e){return(await this.getMany({user:e,status:f.QuestStatus.COMPLETED})).length}async completeQuest(e,t=!1){const a=o.yesterday();a.setHours(0,0,0,0);const n=new Date;return n.setHours(0,0,0,0),this.update(e,[{$set:{...t?{streak:{$cond:{if:{$and:[{$gte:["$lastCompletionDate",a]},{$lt:["$lastCompletionDate",n]}]},then:{$add:[{$ifNull:["$streak",0]},1]},else:1}}}:{},lastCompletionDate:new Date,status:f.QuestStatus.COMPLETED}}],{upsert:!1})}}function pa(r){return R.find(r).lean()}const ya=async r=>await R.create({...r});async function fa(r){const e=await R.findOne(r).lean();return e||y(await ya(r))}function ma(r,e,t){return R.findOneAndUpdate(r,e,{upsert:!0,...t,returnDocument:"after"}).lean()}class ha extends oa{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 fa(e)}fetchManyFromDb(e){return pa(e)}updateInDb(e,t,a){return ma(e,t,a)}}const be=new ha;class wa extends m{async updateDailyReport(e){const t=await U.get(e),a=await F.get(e),n=await be.getMany({user:e,status:f.QuestStatus.COMPLETED});await this.update(e,{$set:{xpYesterday:t.xp.amount,berryYesterday:t.berry,previousCompletedQuest:n.map(({questId:i})=>i),"previousOrnament.unlockedBadges":a.unlockedBadges,"previousOrnament.unlockedTitles":a.unlockedTitles,"previousOrnament.unlockedBackgrounds":a.unlockedBackgrounds}})}async getDailyReport(e){const t=await this.get(e),{previousOrnament:a,previousCompletedQuest:n,xpYesterday:i,berryYesterday:u}=t;if(i<=0)return;const l=await U.get(e),c=await be.getMany({user:e,status:f.QuestStatus.COMPLETED}),$=await F.get(e),{berry:j,xp:T}=l,{voice:le,amount:xs}=T,{unlockedBadges:Fs,unlockedBackgrounds:js,unlockedTitles:zs}=$;return{berry:j-u,xp:xs-i,voice:o.sameDay(le.lastConnection,o.yesterday())?le.minutesInVoiceToday:0,quest:o.exclude(c.map(({questId:Ps})=>Ps),n),badge:o.exclude(Fs,a.unlockedBadges),title:o.exclude(zs,a.unlockedTitles),background:o.exclude(js,a.unlockedBackgrounds)}}async getAllDailyReportsToSend(){const e=await Qe.getMany({"settings.sendDailyReport":!0,faction:{$ne:"citizen"}});return await Promise.all(e.map(async({_id:t,discordId:a})=>({...await this.getDailyReport(t),user:t,discordId:a})))}}const Sa=r=>G.create({user:r});async function ga(r){const e=await G.findOne({user:r}).lean();return e||y(await Sa(r))}const ba=(r,e)=>G.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class $a extends wa{constructor(){super(60)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return ga(e)}updateInDb(e,t){return ba(e,t)}}const Ea=new $a;class Ia extends m{async setGuessGame(e,t,a,n){await this.update(e,{$set:{guess:{amount:t,tries:a,numberToGuess:n,lastGuess:0}}})}async resetGuessGame(e){await this.update(e,{$set:{guess:null}})}async updateGuessGame(e){await this.update(e,{$inc:{"guess.tries":1},$set:{"guess.lastGuess":Date.now()}})}}const Ua=async r=>await X.create({user:r});async function Oa(r){const e=await X.findOne({user:r}).lean();return e||y(await Ua(r))}const Da=(r,e)=>X.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class Ta extends Ia{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Oa(e)}updateInDb(e,t){return Da(e,t)}}const Ra=new Ta;class va extends m{async hasUnlockedRaid(e,t){return(await this.get(e)).unlocked?.[t]}async alreadyObtainedRaidReward(e,t,a){const n=await this.get(e);return t in n.obtainedRewards?n.obtainedRewards[t].includes(a):!1}async getObtainedRaidReward(e,t){return(await this.get(e)).obtainedRewards[t]??[]}async fulfillCondition(e,t,a,n){const i=await this.get(e);return n==="include"?a.every(u=>(i.obtainedConditions[t]??[]).includes(u)):a.every(u=>!(i.obtainedConditions[t]??[]).includes(u))}async unlockRaid(e,t){await this.update(e,{$set:{[`unlocked.${t}`]:!0}})}async startRaid(e,t,a,n,i){const u=Date.now();return await this.update(e,{$set:{currentRaid:{raidId:t,buffItem:a,seed:u,progression:[],rewards:{}}}}),await We.startRaidCooldown(e,n,i),u}async resetRaid(e){await this.update(e,{$unset:{currentRaid:""}})}async resetRaidProgression(e){await this.update(e,{$set:{"currentRaid.progression":[]}})}async progressRaid(e,t){await this.update(e,{$push:{"currentRaid.progression":t}})}async claimReward(e,t,a){await this.update(e,{$addToSet:{[`obtainedRewards.${t}`]:a}})}async addRewardsToRaid(e,t){await this.update(e,{$inc:Object.fromEntries(o.recordToArray(t).filter(([a])=>a!=="title"&&a!=="condition").map(([a,n])=>[`currentRaid.rewards.${a}`,n])),...t.title?{$set:{"currentRaid.rewards.title":t.title}}:{}})}async updateCondition(e,t,a){await this.update(e,{$addToSet:{[`obtainedConditions.${t}`]:a}})}}const Ca=r=>J.create({user:r}),Aa=async r=>{const e=await J.findOne({user:r}).lean();return e||y(await Ca(r))},Ma=(r,e)=>J.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"});class Ba extends va{constructor(){super(3600)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Aa(e)}updateInDb(e,t){return Ma(e,t)}}const _a=new Ba,qa=new s.Schema({user:{type:s.Schema.Types.ObjectId,required:!0,unique:!0,ref:"User"},xp:{type:Number,default:0},berry:{type:Number,default:0},faction:{type:Number,default:0}}),_=s.models?.UserRank||s.model("UserRank",qa);class ka extends m{async computeAllXpRanks(){const t=(await D.aggregate([{$setWindowFields:{sortBy:{"xp.amount":-1},output:{xpRank:{$rank:{}}}}},{$project:{user:1,xpRank:1}}])).map(({user:a,xpRank:n})=>({updateOne:{filter:{user:a},update:{$set:{xp:n}},upsert:!0}}));t.length>0&&await _.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:a,berryRank:n})=>({updateOne:{filter:{user:a},update:{$set:{berry:n}},upsert:!0}}));t.length>0&&await _.bulkWrite(t),this.clearAll()}async computeAllFactionRanks(){const t=(await E.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:a,factionRank:n})=>({updateOne:{filter:{user:a},update:{$set:{faction:n}},upsert:!0}}));t.length>0&&await _.bulkWrite(t),this.clearAll()}async computeAllRanks(){await Promise.all([this.computeAllXpRanks(),this.computeAllBerryRanks(),this.computeAllFactionRanks()])}}const Na=async r=>await _.create({user:r});async function xa(r){const e=await _.findOne({user:r}).lean();return e||y(await Na(r))}const Fa=(r,e)=>_.findOneAndUpdate({user:r},e,{returnDocument:"after",upsert:!0}).lean();class ja extends ka{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey(e){return e.user}fetchFromDb(e){return xa(e)}updateInDb(e,t){return Fa(e,t)}}const za=new ja;class Pa extends m{async isBuyLimitReached(e,t,a){const n=await p.getAllEntitiesLimit();if(await p.isEntityId(t,p.isEquipment))return!1;const i=await this.get(e),u=i.limit?.[t];let l=n[t];const c=await S.hasRevolutionaryBuff(e);return i.lastShopId!==a?!1:(c==="half"&&t==="chest_2"&&(l+=2),c==="full"&&t==="chest_3"&&(l+=1),!!(l&&u&&u>=l))}async getShopItemRest(e,t,a,n=f.SHOP_DEFAULT_AVAILABLE_ENTITY_AMOUNT){const i=await p.getAllEntitiesLimit();if(await p.isEntityId(t,p.isEquipment))return n;let u=i[t];const l=await this.get(e),c=l.limit?.[t],$=await S.hasRevolutionaryBuff(e);return $==="half"&&t==="chest_2"&&(u+=2),$==="full"&&t==="chest_3"&&(u+=1),u?l.lastShopId!==a?u:c?u-c:Math.min(u,n):n}async increaseBuyLimit(e,t,a,n){await this.update(e,[{$set:{limit:{$cond:{if:{$eq:["$lastShopId",t]},then:{$setField:{field:a,input:{$ifNull:["$limit",{}]},value:{$add:[{$ifNull:[`$limit.${a}`,0]},n]}}},else:{[a]:n}}},lastShopId:t}}])}}const Ka=async r=>await Z.create({user:r}),Qa=async r=>{const e=await Z.findOne({user:r}).lean();return e||y(await Ka(r))},Ha=(r,e)=>Z.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class Wa extends Pa{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Qa(e)}updateInDb(e,t){return Ha(e,t)}}const Ga=new Wa;class Ya extends m{async didSevenDoubleAtDoQ(e){await this.update(e,{$inc:{"doubleOrQuit.sevenDoubleInARowCount":1}})}async winWithBlackjack(e){await this.update(e,{$inc:{"blackJack.blackJackCount":1}})}async updateLastGames(e,t,a){await this.update(e,{$push:{lastGames:{$each:[{gameType:t,endState:a}],$position:0,$slice:20}}})}async drawIncrement(e){await this.update(e,{$inc:{drawCount:1}})}async bet666(e){const t=o.yesterday();t.setHours(0,0,0,0);const a=new Date;a.setHours(0,0,0,0),await A.updateOne({user:e,"bet666.last":{$gte:t,$lt:a}},{$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 Xa=async r=>await A.create({user:r});async function Va(r){const e=await A.findOne({user:r}).lean();return e||y(await Xa(r))}const La=(r,e)=>A.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class Ja extends Ya{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Va(e)}updateInDb(e,t){return La(e,t)}}const Za=new Ja;class en extends m{async increaseXpGiven(e,t){await this.update(e,{$inc:{xpGivenToCrew:t}})}async increaseBerryGiven(e,t){await this.update(e,{$inc:{berryGivenToCrew:t}})}async updateCrew10Percent(e,t){t?await this.update(e,{$set:{timeCrewBeyond10PercentXp:0}}):await this.update(e,{$inc:{timeCrewBeyond10PercentXp:1}})}async updateCrew90Percent(e,t){t?await this.update(e,{$set:{timeCrewAbove90PercentXp:0}}):await this.update(e,{$inc:{timeCrewAbove90PercentXp:1}})}}const tn=async r=>await ee.create({user:r});async function rn(r){const e=await ee.findOne({user:r}).lean();return e||y(await tn(r))}const an=(r,e)=>ee.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class nn extends en{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return rn(e)}updateInDb(e,t){return an(e,t)}}const sn=new nn;class un extends m{async workIncrement(e){await this.update(e,{$inc:{workCount:1}})}async updateTotalSpentInShop(e,t){await this.update(e,{$inc:{totalSpentInShop:t}})}}const cn=r=>te.create({user:r});async function dn(r){const e=await te.findOne({user:r}).lean();return e||y(await cn(r))}const ln=(r,e)=>te.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class on extends un{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return dn(e)}updateInDb(e,t){return ln(e,t)}}const Ge=new on;class pn 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 yn=async r=>await re.create({user:r});async function fn(r){const e=await re.findOne({user:r}).lean();return e||y(await yn(r))}const mn=(r,e)=>re.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class hn extends pn{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return fn(e)}updateInDb(e,t){return mn(e,t)}}const wn=new hn;class Sn 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 gn=async r=>await ae.create({user:r});async function bn(r){const e=await ae.findOne({user:r}).lean();return e||y(await gn(r))}const $n=(r,e)=>ae.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class En extends Sn{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return bn(e)}updateInDb(e,t){return $n(e,t)}}const In=new En;class Un extends m{async readEdito(e){const t=new Date;t.setHours(0,0,0,0),await M.updateOne({user:e,"edito.lastTimeRead":{$gte:t}},{$inc:{"edito.readToday":1},$set:{"edito.lastTimeRead":new Date}}),await M.updateOne({user:e,"edito.lastTimeRead":{$lt:t}},{$set:{"edito.lastTimeRead":new Date,"edito.readToday":1}}),this.invalidate(e)}}const On=async r=>await M.create({user:r});async function Dn(r){const e=await M.findOne({user:r}).lean();return e||y(await On(r))}const Tn=(r,e)=>M.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class Rn extends Un{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Dn(e)}updateInDb(e,t){return Tn(e,t)}}const vn=new Rn;class Cn extends m{async updateCraftStats(e,t,a){const n=await p.get(a);!n||!p.isItem(n)||await this.update(e,{$inc:{"crafts.cookedMeal":p.isCookedMeal(n)?t:0,"crafts.scrolls":p.isScrollItem(n)?t:0,"crafts.totalCrafted":t}})}async incrementAlcoholDrink(e,t,a){["wine","beer","rhum"].includes(t)&&await this.update(e,{$inc:{"alcohols.wines":t==="wine"?a:0,"alcohols.beers":t==="beer"?a:0,"alcohols.rhums":t==="rhum"?a:0,"alcohols.totalConsumed":a}})}async incrementBottleUsedToday(e,t){const a=new Date;a.setHours(0,0,0,0),await B.updateOne({user:e,"bottle.lastUsed":{$gte:a}},{$inc:{"bottle.usedToday":t},$set:{"bottle.lastUsed":new Date}}),await B.updateOne({user:e,"bottle.lastUsed":{$lt:a}},{$set:{"bottle.lastUsed":new Date,"bottle.usedToday":t}}),this.invalidate(e)}async incrementBottleUsedTotal(e,t){await this.update(e,{$inc:{"bottle.totalUsed":t}})}async incrementChestOpenedTotal(e,t){await this.update(e,{$inc:{"chest.totalOpened":t}})}}const An=async r=>await B.create({user:r});async function Mn(r){const e=await B.findOne({user:r}).lean();return e||y(await An(r))}const Bn=(r,e)=>B.findOneAndUpdate({user:r},e,{upsert:!0,returnDocument:"after"}).lean();class _n extends Cn{constructor(){super(300)}normalizeKey(e){return e.toString()}getKey({user:e}){return e}fetchFromDb(e){return Mn(e)}updateInDb(e,t){return Bn(e,t)}}const qn=new _n;class kn extends b{async maxCraftQuantity(e,t){const a=await S.get(e);let n=1/0;for(const i of t)n=Math.min(n,Math.floor((a.itemList[i.entityId]??0)/i.size));return n}async hasEnoughItemsForRecipe(e,t,a){const n=await S.get(e);for(const i of t.entities)if((n.itemList[i.entityId]??0)<i.size*a)return!1;return!0}decodeCraftId(e){return e.split(";").map((t,a)=>({entityId:t==="null"?null:t,index:a}))}encodeCraftId(e){return e.map(({entityId:t})=>`${t}`).join(";")}async isValidRecipe(e){return!!(await this.getAll()).find(a=>a.craftId===e)}async getRecipeResult(e,t){const a=await S.get(e),n=(await I.getPanoplyBonus(a.equippedItems)).find(([i,u])=>i.panoplyId==="little_blacksmith"&&u!==null);return n?.[1]==="full"&&t==="chest_3"?"chest_blacksmith_3":n?.[1]==="half"&&t==="chest_2"?"chest_blacksmith_2":n?.[1]==="half"&&t==="chest_1"?"chest_blacksmith_1":t}}const Nn=new s.Schema({entityId:{type:String,required:!0},size:{type:Number,required:!0}},{_id:!1}),xn=new s.Schema({entityId:{type:String,required:!0},size:{type:Number,required:!0}},{_id:!1}),Fn=new s.Schema({craftId:{type:String,unique:!0,required:!0},name:{type:String,required:!0},entities:{type:[Nn],required:!0},result:{type:xn,required:!0}},{minimize:!1}),ie=s.models?.Recipes||s.model("Recipes",Fn),jn=async r=>await ie.create({...r}),zn=async(r,e)=>ie.find(r,{},e).lean();async function Pn(r){const e=await ie.findOne({craftId:r}).lean();return e||null}const Kn=(r,e)=>ie.findOneAndUpdate(r,e,{returnDocument:"after"}).lean();class Qn extends kn{constructor(){super(3600)}createInDb(e){return jn(e)}updateInDb(e,t){return Kn(e,t)}fetchFromDb(e){return Pn(e)}fetchManyFromDb(e,t){return zn(e,t)}normalizeKey(e){return e}getKey(e){return e.craftId}}const Hn=new Qn,Wn=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}}),ue=s.models?.Bans||s.model("Bans",Wn),Gn=(r,e)=>ue.deleteOne({bannedUserId:r,guildId:e});class Yn extends b{async getUnbanUsers(){return this.getMany({unbannedTimestamp:{$lte:new Date,$ne:null}})}async banUserFromGuild({bannedUserId:e,guildId:t,...a}){await this.update({bannedUserId:e,guildId:t},{...a})}async isBannedFromGuild(e,t){const a=await this.get({bannedUserId:e,guildId:t});return!!(a&&(!a.unbannedTimestamp||a.unbannedTimestamp>new Date))}async deleteBan(e,t){await Gn(e,t),this.invalidate({bannedUserId:e,guildId:t})}}const Xn=r=>ue.find(r).lean(),Vn=r=>ue.findOne(r).lean(),Ln=(r,e)=>ue.findOneAndUpdate(r,e,{returnDocument:"after",upsert:!0}).lean();class Jn extends Yn{constructor(){super(3600*36)}normalizeKey(e){return`${e.guildId}/${e.bannedUserId}`}getKey({bannedUserId:e,guildId:t}){return{bannedUserId:e,guildId:t}}fetchFromDb(e){return Vn(e)}fetchManyFromDb(e){return Xn(e)}updateInDb(e,t){return Ln(e,t)}}const Zn=new Jn,es=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}}}),ce=s.models?.Invitation||s.model("Invitation",es),ts=r=>ce.create({...r}),rs=async r=>{await ce.deleteMany({...r})};class as extends m{async sendInvitation({senderId:e,receiverId:t,gameMode:a,...n}){return await this.get({senderId:e,gameMode:a,receiverId:t})?null:await ts({...n,senderId:e,gameMode:a,receiverId:t})}async deleteInvitation({senderId:e,receiverId:t,gameMode:a}){await rs({senderId:e,gameMode:a,receiverId:t}),this.invalidate({senderId:e,gameMode:a,receiverId:t})}}const ns=r=>ce.findOne({...r}).lean(),ss=(r,e)=>ce.findOneAndUpdate(r,e,{returnDocument:"after"}).lean();class is extends as{constructor(){super(3600)}normalizeKey(e){return`${e.gameMode}/${e.receiverId}/${e.senderId}`}getKey({receiverId:e,gameMode:t,senderId:a}){return{gameMode:t,receiverId:e,senderId:a}}fetchFromDb(e){return ns(e)}updateInDb(e,t){return ss(e,t)}}const us=new is;class cs extends m{async setEditoChannel(e,t){await this.update({guildId:e},{$set:{"edito.channelId":t}})}async randomizeEditoPrice(e){const t=o.randomBetween(100,1001);return await this.update({guildId:e},{$set:{"edito.price":t}}),t}async setEditoMessageId(e,t){await this.update({guildId:e},{$set:{"edito.messageId":t}})}async setRankingChannel(e,t){await this.update({guildId:e},{$set:{"ranking.channelId":t}})}async setRankingMessage(e,t){await this.update({guildId:e},{$set:{"ranking.messageId":t}})}async setCrewInfoChannelId(e,t){await this.update({guildId:e},{$set:{"crew.infoChannelId":t}})}async addCrewChannelId(e,t,a){await this.update({guildId:e},{$push:{"crew.crewChannelIds":{channelId:a,crewId:t}}})}async updateRolesId(e,t){await this.update({guildId:e},{$set:Object.fromEntries(Object.entries(t).map(([a,n])=>[`roles.${a}`,n]))})}async updateChannelId(e,t){await this.update({guildId:e},{$set:Object.fromEntries(Object.entries(t).map(([a,n])=>[`channels.${a}`,n]))})}}const ds=new s.Schema({guildId:{type:String,required:!0,unique:!0},ranking:{channelId:{type:String,default:null},messageId:{type:String,default:null}},roles:{premium:{type:String,default:null},booster:{type:String,default:null},scam:{type:String,default:null},factions:{canChange:{type:String,default:null},canChoose:{type:String,default:null}}},channels:{gambling:{type:String,default:null},work:{type:String,default:null},raid:{type:String,default:null},suggestion:{type:String,default:null},report:{type:String,default:null},reportModerator:{type:String,default:null},faction:{type:String,default:null},discussion:{type:String,default:null},questFallback:{type:String,default:null},reportBug:{type:String,default:null},shop:{type:String,default:null}},edito:{channelId:{type:String,default:null},price:{type:Number,default:100},messageId:{type:String,default:null}},crew:{infoChannelId:{type:String,default:null},crewChannelIds:{type:[{channelId:{type:String},crewId:{type:String}}],default:[]}},shopChannelId:{type:String,default:null}}),$e=s.models?.Settings||s.model("Settings",ds),ls=r=>$e.create({guildId:r}),os=async r=>{const e=await $e.findOne({guildId:r}).lean();return e||y(await ls(r))},ps=(r,e)=>$e.findOneAndUpdate(r,e,{upsert:!0,returnDocument:"after"}).lean();class ys extends cs{constructor(){super(3600*24*30)}normalizeKey(e){return e}getKey({guildId:e}){return e}fetchFromDb(e){return os(e)}updateInDb(e,t){return ps(e,t)}}const fs=new ys,ms=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}),de=s.models?.Shop||s.model("Shop",ms),hs=r=>de.create({shopType:r}),Ye=async r=>{const e=await de.findOne({shopType:r}).lean();return e||y(await hs(r))};class O{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 Ge.updateTotalSpentInShop(e,this.price*t)):await S.removeItem(e,this.currency,this.price*t)}isBackground(){return!1}isChest(){return!1}isTitle(){return!1}isBoostXp(){return!1}isRepair(){return!1}isStore(){return!1}isObject(){return!1}isBottle(){return!1}isEquipment(){return!1}}class ws extends O{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await F.unlockBackground(e,this.data.ornamentId)}isBackground(){return!0}}class Ss extends O{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addItem(e,this.data.entityId,t)}isBoostXp(){return!0}}class gs extends O{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addItem(e,this.data.entityId,t)}isChest(){return!0}}class bs extends O{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addItem(e,this.data.entityId,t)}isObject(){return!0}}class $s extends O{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addEquipments(e,o.range({stop:t}).map(()=>p.seedEquipment({...this.data},Date.now()-Math.round(Math.random()*1e3))).map(a=>({entityId:a.entityId,seed:a.seed})))}isEquipment(){return!0}}class Es extends O{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addItem(e,this.data.entityId,t)}isBottle(){return!0}}class Is extends O{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addItem(e,this.data.entityId,t)}isRepair(){return!0}}class Us extends O{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await S.addItem(e,this.data.entityId,t)}isStore(){return!0}}class Os extends O{price;size;currency;data;constructor({price:e,item:t,size:a,currency:n}){super(),this.data=t,this.price=e,this.size=a,this.currency=n}async onBuy(e,t){await super.onBuy(e,t),await F.unlockTitle(e,this.data.ornamentId)}isTitle(){return!0}}class Ds extends m{async getShopItem(e,t){const n=(await this.get(e)).items.find($=>$.id===t);if(!n)return;const{price:i,size:u,currency:l}=n,c=await p.get(n.id)??await g.get(n.id);if(g.isOrnament(c)&&g.isBackground(c))return new ws({price:i,item:c,size:u,currency:l});if(g.isOrnament(c)&&g.isTitle(c))return new Os({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isChestItem(c))return new gs({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isBoostItem(c))return new Ss({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isRepairItem(c))return new Is({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isStoreItem(c))return new Us({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isObjectItem(c))return new bs({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isEquipment(c))return new $s({price:i,item:c,size:u,currency:l});if(p.isEntity(c)&&p.isBottleItem(c))return new Es({price:i,size:u,item:c,currency:l})}async getShopItemList(e){const t=await this.get(e),a=[];for(const{id:n}of t.items){const i=await this.getShopItem(e,n);i&&a.push(i)}return a}getShopItemId(e){return p.isEntity(e.data)?e.data.entityId:e.data.ornamentId}async updateShopStats(e,t,a){await this.update({shopType:e},{$inc:{"stats.berrySpent":t.price*a,"stats.itemBought":a,"stats.chestBought":t.isChest()?a:0,"stats.percentBought":t.isRepair()?(t.data.effects.find(n=>n.type==="CREW_REPAIR")?.params.amount??0)*a:0,"stats.boostTimeBought":t.isBoostXp()?t.data.ms/(1440*60*1e3):0}})}async buyShopItem(e,t,a,n){const i=t.map(u=>(u.id===this.getShopItemId(a)&&u.size&&(u.size-=n),u));await this.update({shopType:e},{$set:{items:i}})}async publish(e){await this.update({shopType:e},{$set:{publishedAt:new Date}})}async setShopItems(e,t){await this.update({shopType:e},{$set:{items:[...t]}})}}const Ts=(r,e)=>de.findOneAndUpdate(r,e,{upsert:!0,returnDocument:"after"}).lean();class Rs extends Ds{constructor(){super(3600)}normalizeKey(e){return e}getKey({shopType:e}){return e}fetchFromDb(e){return Ye(e)}updateInDb(e,t){return Ts(e,t)}}const vs=new Rs,Cs=new s.Schema({warnedUserId:{type:String,required:!0,index:!0},authorId:String,date:{type:Date,default:Date.now()},reason:{type:String,default:null}}),Xe=s.models?.Warn||s.model("Warn",Cs),As=r=>Xe.countDocuments(r);class Ms extends b{getUserWarns(e){return this.getMany({warnedUserId:e})}getUserWarnCount(e){return As({warnedUserId:e})}}const Bs=r=>Xe.find(r).lean();class _s extends Ms{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 Bs(e)}updateInDb(){throw new Error("Method not implemented.")}}const qs=new _s,ks=r=>{s.connect(r)};class Ns extends s.Types.ObjectId{}d.COOLDOWN_COMMANDS=Xt,d.ObjectId=Ns,d.QUEST_MIDDLEWARE_EVENT_NAME=w,d.RAID_MIDDLEWARE_EVENT_NAME=K,d.banService=Zn,d.connectToServices=ks,d.crewMetaService=ye,d.crewOrnamentsService=mt,d.crewQuestService=Et,d.crewService=Oe,d.crewStatsEngagementService=Rt,d.crewStatsFrequencyService=_t,d.emitQuestMiddlewareEvent=h,d.emitRaidMiddlewareEvent=P,d.entityService=p,d.findShop=Ye,d.invitationService=us,d.ornamentService=g,d.panoplyService=I,d.recipeService=Hn,d.registerQuestMiddlewareEvents=Ze,d.registerRaidMiddlewareEvents=et,d.reminderService=N,d.settingsService=fs,d.shopModel=de,d.shopService=vs,d.userCooldownService=We,d.userCrewService=He,d.userDailyReportService=Ea,d.userEncyclopediaService=se,d.userGamesService=Ra,d.userInventoryService=S,d.userMetaService=U,d.userOrnamentService=F,d.userQuestService=be,d.userRaidService=_a,d.userRankService=za,d.userService=Qe,d.userSettingsService=ge,d.userShopService=Ga,d.userStatsCasinoService=Za,d.userStatsCrewService=sn,d.userStatsEconomyService=Ge,d.userStatsEngagementService=wn,d.userStatsFlagsService=In,d.userStatsFrequencyService=vn,d.userStatsInventoryService=qn,d.warnService=qs,Object.defineProperty(d,Symbol.toStringTag,{value:"Module"})}));
@@ -6,12 +6,19 @@ export declare abstract class AbstractCachedService<T, D extends T & Document, K
6
6
  protected constructor(ttl: number);
7
7
  protected abstract normalizeKey(key: Key): string;
8
8
  protected abstract getKey(e: Lean<D>): Key;
9
- protected abstract fetchFromDb(filter: Key): Promise<Upserted extends true ? Lean<D> : Lean<D> | null>;
9
+ protected abstract fetchFromDb(filter: Key, options?: QueryOptions<D>): Promise<Upserted extends true ? Lean<D> : Lean<D> | null>;
10
+ protected abstract fetchFromDb(filter: Key, options: QueryOptions<D> & {
11
+ upsert: false;
12
+ }): Promise<Lean<D> | null>;
10
13
  protected abstract updateInDb<U extends boolean>(filter: Types.ObjectId, update: MongooseUpdate<D>): Promise<U extends true ? Lean<D> : Lean<D> | null>;
11
14
  protected abstract updateInDb<U extends boolean>(filter: RootFilterQuery<D>, update: MongooseUpdate<D>, options?: QueryOptions<D> & {
12
15
  upsert: U;
13
16
  }): Promise<U extends true ? Lean<D> : Lean<D> | null>;
14
17
  get(filter: Key): Promise<Upserted extends true ? Lean<D> : Lean<D> | null>;
18
+ get(filter: Key, options: QueryOptions<D> & {
19
+ upsert: false;
20
+ }): Promise<Lean<D> | null>;
21
+ get(filter: Key, options: QueryOptions<D>): Promise<Upserted extends true ? Lean<D> : Lean<D> | null>;
15
22
  update<U extends boolean = Upserted>(filter: RootFilterQuery<D>, update: MongooseUpdate<D>, options?: QueryOptions<D> & {
16
23
  upsert: U;
17
24
  }): Promise<U extends true ? Lean<D> : Lean<D> | null>;
@@ -20,7 +27,7 @@ export declare abstract class AbstractCachedService<T, D extends T & Document, K
20
27
  }
21
28
  export declare abstract class AbstractCachedServiceWithFetchMany<T, D extends T & Document, Key extends Partial<D> | Types.ObjectId | string, Upserted extends boolean = false> extends AbstractCachedService<T, D, Key, Upserted> {
22
29
  getAll(): Promise<Lean<D>[]>;
23
- getMany(filter: RootFilterQuery<D>): Promise<Lean<D>[]>;
24
- protected abstract fetchManyFromDb(filter: RootFilterQuery<D>): Promise<Lean<D>[]>;
30
+ getMany(filter: RootFilterQuery<D>, options?: QueryOptions<D>): Promise<Lean<D>[]>;
31
+ protected abstract fetchManyFromDb(filter: RootFilterQuery<D>, options: QueryOptions<D>): Promise<Lean<D>[]>;
25
32
  }
26
33
  //# sourceMappingURL=AbstractCachedService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractCachedService.d.ts","sourceRoot":"","sources":["../../src/services/AbstractCachedService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAC/E,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAIpD,8BAAsB,qBAAqB,CACzC,CAAC,EACD,CAAC,SAAS,CAAC,GAAG,QAAQ,EACtB,GAAG,SAAS,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,GAAG,MAAM,EAChD,QAAQ,SAAS,OAAO,GAAG,KAAK;IAEhC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC;IAE3B,SAAS,aAAa,GAAG,EAAE,MAAM;IAQjC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM;IACjD,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG;IAE1C,SAAS,CAAC,QAAQ,CAAC,WAAW,CAC5B,MAAM,EAAE,GAAG,GACV,OAAO,CAAC,QAAQ,SAAS,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAE5D,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,SAAS,OAAO,EAC7C,MAAM,EAAE,KAAK,CAAC,QAAQ,EACtB,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACrD,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,SAAS,OAAO,EAC7C,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,EAC1B,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG;QAAE,MAAM,EAAE,CAAC,CAAA;KAAE,GACxC,OAAO,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAExC,GAAG,CACd,MAAM,EAAE,GAAG,GACV,OAAO,CAAC,QAAQ,SAAS,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAe/C,MAAM,CAAC,CAAC,SAAS,OAAO,GAAG,QAAQ,EAC9C,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,EAC1B,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG;QAAE,MAAM,EAAE,CAAC,CAAA;KAAE,GACxC,OAAO,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAY9C,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAQ1B,QAAQ,IAAI,IAAI;CAGxB;AAED,8BAAsB,kCAAkC,CACtD,CAAC,EACD,CAAC,SAAS,CAAC,GAAG,QAAQ,EACtB,GAAG,SAAS,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,GAAG,MAAM,EAChD,QAAQ,SAAS,OAAO,GAAG,KAAK,CAChC,SAAQ,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC;IACrC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAe5B,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IASpE,SAAS,CAAC,QAAQ,CAAC,eAAe,CAChC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;CACtB"}
1
+ {"version":3,"file":"AbstractCachedService.d.ts","sourceRoot":"","sources":["../../src/services/AbstractCachedService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAC/E,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAIpD,8BAAsB,qBAAqB,CACzC,CAAC,EACD,CAAC,SAAS,CAAC,GAAG,QAAQ,EACtB,GAAG,SAAS,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,GAAG,MAAM,EAChD,QAAQ,SAAS,OAAO,GAAG,KAAK;IAEhC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC;IAE3B,SAAS,aAAa,GAAG,EAAE,MAAM;IAQjC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM;IACjD,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG;IAE1C,SAAS,CAAC,QAAQ,CAAC,WAAW,CAC5B,MAAM,EAAE,GAAG,EACX,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,QAAQ,SAAS,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC5D,SAAS,CAAC,QAAQ,CAAC,WAAW,CAC5B,MAAM,EAAE,GAAG,EACX,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG;QAAE,MAAM,EAAE,KAAK,CAAA;KAAE,GAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAE1B,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,SAAS,OAAO,EAC7C,MAAM,EAAE,KAAK,CAAC,QAAQ,EACtB,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACrD,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,SAAS,OAAO,EAC7C,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,EAC1B,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG;QAAE,MAAM,EAAE,CAAC,CAAA;KAAE,GACxC,OAAO,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAExC,GAAG,CACd,MAAM,EAAE,GAAG,GACV,OAAO,CAAC,QAAQ,SAAS,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC/C,GAAG,CACd,MAAM,EAAE,GAAG,EACX,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG;QAAE,MAAM,EAAE,KAAK,CAAA;KAAE,GAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACb,GAAG,CACd,MAAM,EAAE,GAAG,EACX,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GACvB,OAAO,CAAC,QAAQ,SAAS,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAgB/C,MAAM,CAAC,CAAC,SAAS,OAAO,GAAG,QAAQ,EAC9C,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,EAC1B,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG;QAAE,MAAM,EAAE,CAAC,CAAA;KAAE,GACxC,OAAO,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAY9C,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAQ1B,QAAQ,IAAI,IAAI;CAGxB;AAED,8BAAsB,kCAAkC,CACtD,CAAC,EACD,CAAC,SAAS,CAAC,GAAG,QAAQ,EACtB,GAAG,SAAS,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,GAAG,MAAM,EAChD,QAAQ,SAAS,OAAO,GAAG,KAAK,CAChC,SAAQ,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC;IACrC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAe5B,OAAO,CAClB,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,EAC1B,OAAO,GAAE,YAAY,CAAC,CAAC,CAAM,GAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IASrB,SAAS,CAAC,QAAQ,CAAC,eAAe,CAChC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,EAC1B,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;CACtB"}
@@ -1,5 +1,5 @@
1
- import type { ProjectionType, RootFilterQuery } from 'mongoose';
1
+ import type { QueryOptions, RootFilterQuery } from 'mongoose';
2
2
  import type { Lean } from '../../types';
3
3
  import type { EntityDocument } from '../types';
4
- export declare const findEntities: (filter: RootFilterQuery<EntityDocument>, projection?: ProjectionType<EntityDocument>) => Promise<Lean<EntityDocument>[]>;
4
+ export declare const findEntities: (filter: RootFilterQuery<EntityDocument>, options: QueryOptions<EntityDocument>) => Promise<Lean<EntityDocument>[]>;
5
5
  //# 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,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,eAAO,MAAM,YAAY,GACvB,QAAQ,eAAe,CAAC,cAAc,CAAC,EACvC,aAAY,cAAc,CAAC,cAAc,CAAM,KAC9C,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAEhC,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,MAAM,UAAU,CAAC;AAE/C,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"}
@@ -1,4 +1,4 @@
1
- import type { RootFilterQuery } from 'mongoose';
1
+ import type { QueryOptions, RootFilterQuery } from 'mongoose';
2
2
  import { type Entity } from '@opfr/definitions';
3
3
  import type { Lean, MongooseUpdate } from '../types';
4
4
  import { EntityHelper } from './helper';
@@ -12,7 +12,7 @@ declare class EntityService extends EntityHelper {
12
12
  }> & {
13
13
  __v: number;
14
14
  }) | null>;
15
- protected fetchManyFromDb(filter: RootFilterQuery<EntityDocument>): Promise<(import("mongoose").FlattenMaps<EntityDocument> & Required<{
15
+ protected fetchManyFromDb(filter: RootFilterQuery<EntityDocument>, options: QueryOptions<EntityDocument>): Promise<(import("mongoose").FlattenMaps<EntityDocument> & Required<{
16
16
  _id: import("mongoose").Types.ObjectId;
17
17
  }> & {
18
18
  __v: number;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/entities/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,cAAM,aAAc,SAAQ,YAAY;;IAK/B,UAAU,CAAC,MAAM,EAAE,MAAM;IAIhC,SAAS,CAAC,UAAU,CAClB,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC,EACvC,MAAM,EAAE,cAAc,CAAC,cAAc,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IAIvC,SAAS,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM;;;;;IAIhC,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC;;;;;IAIjE,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI3C,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAGzC;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/entities/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE9D,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,cAAM,aAAc,SAAQ,YAAY;;IAK/B,UAAU,CAAC,MAAM,EAAE,MAAM;IAIhC,SAAS,CAAC,UAAU,CAClB,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC,EACvC,MAAM,EAAE,cAAc,CAAC,cAAc,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IAIvC,SAAS,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM;;;;;IAIhC,SAAS,CAAC,eAAe,CACvB,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC,EACvC,OAAO,EAAE,YAAY,CAAC,cAAc,CAAC;;;;;IAKvC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI3C,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAGzC;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
@@ -1,5 +1,5 @@
1
- import type { ProjectionType, RootFilterQuery } from 'mongoose';
1
+ import type { QueryOptions, RootFilterQuery } from 'mongoose';
2
2
  import type { Lean } from '../../types';
3
3
  import type { OrnamentDocument } from '../types';
4
- export declare const findOrnaments: (filter: RootFilterQuery<OrnamentDocument>, projection?: ProjectionType<OrnamentDocument>) => Promise<Lean<OrnamentDocument>[]>;
4
+ export declare const findOrnaments: (filter: RootFilterQuery<OrnamentDocument>, options: QueryOptions<OrnamentDocument>) => Promise<Lean<OrnamentDocument>[]>;
5
5
  //# sourceMappingURL=findMany.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"findMany.d.ts","sourceRoot":"","sources":["../../../../src/services/ornaments/process/findMany.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,eAAO,MAAM,aAAa,GACxB,QAAQ,eAAe,CAAC,gBAAgB,CAAC,EACzC,aAAY,cAAc,CAAC,gBAAgB,CAAM,KAChD,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAElC,CAAC"}
1
+ {"version":3,"file":"findMany.d.ts","sourceRoot":"","sources":["../../../../src/services/ornaments/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,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,eAAO,MAAM,aAAa,GACxB,QAAQ,eAAe,CAAC,gBAAgB,CAAC,EACzC,SAAS,YAAY,CAAC,gBAAgB,CAAC,KACtC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAElC,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { RootFilterQuery } from 'mongoose';
1
+ import type { QueryOptions, RootFilterQuery } from 'mongoose';
2
2
  import type { Ornament } from '@opfr/definitions';
3
3
  import type { Lean, MongooseUpdate } from '../types';
4
4
  import { OrnamentHelper } from './helper';
@@ -11,7 +11,7 @@ declare class OrnamentService extends OrnamentHelper {
11
11
  }> & {
12
12
  __v: number;
13
13
  }) | null>;
14
- protected fetchManyFromDb(filter: RootFilterQuery<OrnamentDocument>): Promise<(import("mongoose").FlattenMaps<OrnamentDocument> & Required<{
14
+ protected fetchManyFromDb(filter: RootFilterQuery<OrnamentDocument>, options: QueryOptions<OrnamentDocument>): Promise<(import("mongoose").FlattenMaps<OrnamentDocument> & Required<{
15
15
  _id: import("mongoose").Types.ObjectId;
16
16
  }> & {
17
17
  __v: number;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/ornaments/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAI1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,cAAM,eAAgB,SAAQ,cAAc;;IAK1C,SAAS,CAAC,UAAU,CAClB,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC,EACzC,MAAM,EAAE,cAAc,CAAC,gBAAgB,CAAC,GACvC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAIzC,SAAS,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM;;;;;IAIhC,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC;;;;;IAInE,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM;IAI5C,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAG5C;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/ornaments/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAI1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,cAAM,eAAgB,SAAQ,cAAc;;IAK1C,SAAS,CAAC,UAAU,CAClB,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC,EACzC,MAAM,EAAE,cAAc,CAAC,gBAAgB,CAAC,GACvC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAIzC,SAAS,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM;;;;;IAIhC,SAAS,CAAC,eAAe,CACvB,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC,EACzC,OAAO,EAAE,YAAY,CAAC,gBAAgB,CAAC;;;;;IAKzC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM;IAI5C,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAG5C;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
@@ -1,9 +1,9 @@
1
- import type { RootFilterQuery } from 'mongoose';
1
+ import type { QueryOptions, RootFilterQuery } from 'mongoose';
2
2
  import type { Equipment } from '@opfr/definitions';
3
3
  import type { Lean } from '../../types';
4
4
  import type { PanoplyDocument } from '../types';
5
- export declare const findPanoplies: (filter: RootFilterQuery<PanoplyDocument>) => Promise<Lean<PanoplyDocument>[]>;
6
- export declare const findPopulatedPanoplies: (filter: RootFilterQuery<PanoplyDocument>) => Promise<(import("mongoose").Document<unknown, {}, import("mongoose").MergeType<PanoplyDocument, {
5
+ export declare const findPanoplies: (filter: RootFilterQuery<PanoplyDocument>, options: QueryOptions<PanoplyDocument>) => Promise<Lean<PanoplyDocument>[]>;
6
+ export declare const findPopulatedPanoplies: (filter: RootFilterQuery<PanoplyDocument>, options: QueryOptions<PanoplyDocument>) => Promise<(import("mongoose").Document<unknown, {}, import("mongoose").MergeType<PanoplyDocument, {
7
7
  equipments: Equipment[];
8
8
  }>, {}, {}> & Omit<PanoplyDocument, "equipments"> & {
9
9
  equipments: Equipment[];
@@ -1 +1 @@
1
- {"version":3,"file":"findMany.d.ts","sourceRoot":"","sources":["../../../../src/services/panoplies/process/findMany.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,eAAO,MAAM,aAAa,GACxB,QAAQ,eAAe,CAAC,eAAe,CAAC,KACvC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAEjC,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,QAAQ,eAAe,CAAC,eAAe,CAAC;gBAId,SAAS,EAAE;;gBAAX,SAAS,EAAE;;;;;KACtC,CAAC"}
1
+ {"version":3,"file":"findMany.d.ts","sourceRoot":"","sources":["../../../../src/services/panoplies/process/findMany.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,eAAO,MAAM,aAAa,GACxB,QAAQ,eAAe,CAAC,eAAe,CAAC,EACxC,SAAS,YAAY,CAAC,eAAe,CAAC,KACrC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAEjC,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,QAAQ,eAAe,CAAC,eAAe,CAAC,EACxC,SAAS,YAAY,CAAC,eAAe,CAAC;gBAIZ,SAAS,EAAE;;gBAAX,SAAS,EAAE;;;;;KACtC,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { RootFilterQuery } from 'mongoose';
1
+ import type { QueryOptions, RootFilterQuery } from 'mongoose';
2
2
  import type { Lean, MongooseUpdate } from '../types';
3
3
  import { PanoplyHelper } from './helper';
4
4
  import type { PanoplyDocument } from './types';
@@ -12,7 +12,7 @@ declare class PanoplyService extends PanoplyHelper {
12
12
  }> & {
13
13
  __v: number;
14
14
  }) | null>;
15
- protected fetchManyFromDb(filter?: RootFilterQuery<PanoplyDocument>): Promise<(import("mongoose").FlattenMaps<PanoplyDocument> & Required<{
15
+ protected fetchManyFromDb(filter: RootFilterQuery<PanoplyDocument>, options: QueryOptions<PanoplyDocument>): Promise<(import("mongoose").FlattenMaps<PanoplyDocument> & Required<{
16
16
  _id: import("mongoose").Types.ObjectId;
17
17
  }> & {
18
18
  __v: number;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/panoplies/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,cAAM,cAAe,SAAQ,aAAa;;IAKxC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI3C,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,MAAM;IAI9D,SAAS,CAAC,UAAU,CAClB,MAAM,EAAE,eAAe,CAAC,eAAe,CAAC,EACxC,MAAM,EAAE,cAAc,CAAC,eAAe,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;IAIxC,SAAS,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM;;;;;IAIhC,SAAS,CAAC,eAAe,CAAC,MAAM,GAAE,eAAe,CAAC,eAAe,CAAM;;;;;CAGxE;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/panoplies/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE9D,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,cAAM,cAAe,SAAQ,aAAa;;IAKxC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI3C,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,MAAM;IAI9D,SAAS,CAAC,UAAU,CAClB,MAAM,EAAE,eAAe,CAAC,eAAe,CAAC,EACxC,MAAM,EAAE,cAAc,CAAC,eAAe,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;IAIxC,SAAS,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM;;;;;IAIhC,SAAS,CAAC,eAAe,CACvB,MAAM,EAAE,eAAe,CAAC,eAAe,CAAC,EACxC,OAAO,EAAE,YAAY,CAAC,eAAe,CAAC;;;;;CAIzC;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
@@ -1,5 +1,5 @@
1
- import type { ProjectionType, RootFilterQuery } from 'mongoose';
1
+ import type { QueryOptions, RootFilterQuery } from 'mongoose';
2
2
  import type { Lean } from '../../types';
3
3
  import type { RecipeDocument } from '../types';
4
- export declare const findRecipes: (filter: RootFilterQuery<RecipeDocument>, projection?: ProjectionType<RecipeDocument>) => Promise<Lean<RecipeDocument>[]>;
4
+ export declare const findRecipes: (filter: RootFilterQuery<RecipeDocument>, options: QueryOptions<RecipeDocument>) => Promise<Lean<RecipeDocument>[]>;
5
5
  //# sourceMappingURL=findMany.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"findMany.d.ts","sourceRoot":"","sources":["../../../../src/services/recipe/process/findMany.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,eAAO,MAAM,WAAW,GACtB,QAAQ,eAAe,CAAC,cAAc,CAAC,EACvC,aAAY,cAAc,CAAC,cAAc,CAAM,KAC9C,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAEhC,CAAC"}
1
+ {"version":3,"file":"findMany.d.ts","sourceRoot":"","sources":["../../../../src/services/recipe/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;AAE/C,eAAO,MAAM,WAAW,GACtB,QAAQ,eAAe,CAAC,cAAc,CAAC,EACvC,SAAS,YAAY,CAAC,cAAc,CAAC,KACpC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAEhC,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { RootFilterQuery } from 'mongoose';
1
+ import type { QueryOptions, RootFilterQuery } from 'mongoose';
2
2
  import type { Lean, MongooseUpdate } from '../types';
3
3
  import { RecipeHelper } from './helper';
4
4
  import type { Recipe, RecipeDocument } from './types';
@@ -11,7 +11,7 @@ declare class RecipeService extends RecipeHelper {
11
11
  }> & {
12
12
  __v: number;
13
13
  }) | null>;
14
- protected fetchManyFromDb(filter: RootFilterQuery<RecipeDocument>): Promise<(import("mongoose").FlattenMaps<RecipeDocument> & Required<{
14
+ protected fetchManyFromDb(filter: RootFilterQuery<RecipeDocument>, options: QueryOptions<RecipeDocument>): Promise<(import("mongoose").FlattenMaps<RecipeDocument> & Required<{
15
15
  _id: import("mongoose").Types.ObjectId;
16
16
  }> & {
17
17
  __v: number;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/recipe/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKxC,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEtD,cAAM,aAAc,SAAQ,YAAY;;IAK/B,UAAU,CAAC,MAAM,EAAE,MAAM;IAIhC,SAAS,CAAC,UAAU,CAClB,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC,EACvC,MAAM,EAAE,cAAc,CAAC,cAAc,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IAIvC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM;;;;;IAIrC,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC;;;;;IAIjE,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI3C,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAGzC;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/recipe/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE9D,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKxC,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEtD,cAAM,aAAc,SAAQ,YAAY;;IAK/B,UAAU,CAAC,MAAM,EAAE,MAAM;IAIhC,SAAS,CAAC,UAAU,CAClB,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC,EACvC,MAAM,EAAE,cAAc,CAAC,cAAc,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IAIvC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM;;;;;IAIrC,SAAS,CAAC,eAAe,CACvB,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC,EACvC,OAAO,EAAE,YAAY,CAAC,cAAc,CAAC;;;;;IAKvC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI3C,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAGzC;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
@@ -1,5 +1,5 @@
1
- import type { ProjectionType, RootFilterQuery } from 'mongoose';
1
+ import type { QueryOptions, RootFilterQuery } from 'mongoose';
2
2
  import type { Lean } from '../../types';
3
3
  import type { ReminderDocument } from '../types';
4
- export declare function findReminders(filter: RootFilterQuery<ReminderDocument>, projection?: ProjectionType<ReminderDocument>): Promise<Lean<ReminderDocument>[]>;
4
+ export declare function findReminders(filter: RootFilterQuery<ReminderDocument>, options: QueryOptions<ReminderDocument>): Promise<Lean<ReminderDocument>[]>;
5
5
  //# sourceMappingURL=findMany.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"findMany.d.ts","sourceRoot":"","sources":["../../../../src/services/reminder/process/findMany.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC,EACzC,UAAU,GAAE,cAAc,CAAC,gBAAgB,CAAM,GAChD,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAEnC"}
1
+ {"version":3,"file":"findMany.d.ts","sourceRoot":"","sources":["../../../../src/services/reminder/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,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC,EACzC,OAAO,EAAE,YAAY,CAAC,gBAAgB,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAEnC"}
@@ -1,4 +1,4 @@
1
- import type { ProjectionType, RootFilterQuery, Types } from 'mongoose';
1
+ import type { QueryOptions, RootFilterQuery, Types } from 'mongoose';
2
2
  import type { Lean, MongooseUpdate } from '../types';
3
3
  import { ReminderHelper } from './helper';
4
4
  import type { ReminderDocument, ReminderType } from './types';
@@ -16,7 +16,7 @@ declare class ReminderService extends ReminderHelper {
16
16
  user: Types.ObjectId;
17
17
  type: ReminderType;
18
18
  }): Promise<Lean<ReminderDocument> | null>;
19
- protected fetchManyFromDb(filter: RootFilterQuery<ReminderDocument>, projection?: ProjectionType<ReminderDocument>): Promise<Lean<ReminderDocument>[]>;
19
+ protected fetchManyFromDb(filter: RootFilterQuery<ReminderDocument>, options: QueryOptions<ReminderDocument>): Promise<Lean<ReminderDocument>[]>;
20
20
  protected updateInDb(filter: RootFilterQuery<ReminderDocument>, update: MongooseUpdate<ReminderDocument>, options?: {
21
21
  upsert: boolean;
22
22
  }): Promise<Lean<ReminderDocument> | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/reminder/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEvE,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAI1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE9D,cAAM,eAAgB,SAAQ,cAAc;;IAK1C,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG;QAC3C,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC;QACrB,IAAI,EAAE,YAAY,CAAC;KACpB;IAID,SAAS,CAAC,YAAY,CAAC,EACrB,IAAI,EACJ,IAAI,GACL,EAAE;QACD,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC;QACrB,IAAI,EAAE,YAAY,CAAC;KACpB,GAAG,MAAM;IAIV,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE;QAC5B,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC;QACrB,IAAI,EAAE,YAAY,CAAC;KACpB,GAAG,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAI1C,SAAS,CAAC,eAAe,CACvB,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC,EACzC,UAAU,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,GAC5C,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;IAIpC,SAAS,CAAC,UAAU,CAClB,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC,EACzC,MAAM,EAAE,cAAc,CAAC,gBAAgB,CAAC,EACxC,OAAO,GAAE;QAAE,MAAM,EAAE,OAAO,CAAA;KAAsB,GAC/C,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;CAG1C;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/reminder/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAErE,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAI1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE9D,cAAM,eAAgB,SAAQ,cAAc;;IAK1C,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG;QAC3C,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC;QACrB,IAAI,EAAE,YAAY,CAAC;KACpB;IAID,SAAS,CAAC,YAAY,CAAC,EACrB,IAAI,EACJ,IAAI,GACL,EAAE;QACD,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC;QACrB,IAAI,EAAE,YAAY,CAAC;KACpB,GAAG,MAAM;IAIV,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE;QAC5B,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC;QACrB,IAAI,EAAE,YAAY,CAAC;KACpB,GAAG,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAI1C,SAAS,CAAC,eAAe,CACvB,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC,EACzC,OAAO,EAAE,YAAY,CAAC,gBAAgB,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;IAIpC,SAAS,CAAC,UAAU,CAClB,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC,EACzC,MAAM,EAAE,cAAc,CAAC,gBAAgB,CAAC,EACxC,OAAO,GAAE;QAAE,MAAM,EAAE,OAAO,CAAA;KAAsB,GAC/C,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;CAG1C;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
@@ -1,5 +1,5 @@
1
- import type { RootFilterQuery } from 'mongoose';
1
+ import type { QueryOptions, RootFilterQuery } from 'mongoose';
2
2
  import type { Lean } from '../../types';
3
3
  import type { UserDocument } from '../types';
4
- export declare const findUsers: (filter: RootFilterQuery<UserDocument>) => Promise<Lean<UserDocument>[]>;
4
+ export declare const findUsers: (filter: RootFilterQuery<UserDocument>, options: QueryOptions<UserDocument>) => Promise<Lean<UserDocument>[]>;
5
5
  //# sourceMappingURL=findMany.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"findMany.d.ts","sourceRoot":"","sources":["../../../../src/services/user/process/findMany.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,eAAO,MAAM,SAAS,GACpB,QAAQ,eAAe,CAAC,YAAY,CAAC,KACpC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAE9B,CAAC"}
1
+ {"version":3,"file":"findMany.d.ts","sourceRoot":"","sources":["../../../../src/services/user/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,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,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,5 @@
1
+ import type { QueryOptions } from 'mongoose';
1
2
  import type { Lean } from '../../types';
2
3
  import type { UserDocument } from '../types';
3
- export declare function findUser(discordId: string): Promise<Lean<UserDocument>>;
4
+ export declare function findUser(discordId: string, { upsert, ...options }: QueryOptions<UserDocument>): Promise<Lean<UserDocument>>;
4
5
  //# sourceMappingURL=findOne.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"findOne.d.ts","sourceRoot":"","sources":["../../../../src/services/user/process/findOne.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG7C,wBAAsB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAO7E"}
1
+ {"version":3,"file":"findOne.d.ts","sourceRoot":"","sources":["../../../../src/services/user/process/findOne.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG7C,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,EAAE,MAAa,EAAE,GAAG,OAAO,EAAE,EAAE,YAAY,CAAC,YAAY,CAAC,GACxD,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAO7B"}
@@ -1 +1 @@
1
- {"version":3,"file":"updateOne.d.ts","sourceRoot":"","sources":["../../../../src/services/user/process/updateOne.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,eAAO,MAAM,UAAU,GACrB,QAAQ,eAAe,CAAC,YAAY,CAAC,EACrC,QAAQ,cAAc,CAAC,YAAY,CAAC,KACnC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAK5B,CAAC"}
1
+ {"version":3,"file":"updateOne.d.ts","sourceRoot":"","sources":["../../../../src/services/user/process/updateOne.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,eAAO,MAAM,UAAU,GACrB,QAAQ,eAAe,CAAC,YAAY,CAAC,EACrC,QAAQ,cAAc,CAAC,YAAY,CAAC,KACnC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAO5B,CAAC"}
@@ -1,3 +1,4 @@
1
+ import type { QueryOptions } from 'mongoose';
1
2
  import { type RootFilterQuery } from 'mongoose';
2
3
  import type { Lean, MongooseUpdate } from '../types';
3
4
  import { UserHelper } from './helper';
@@ -6,8 +7,8 @@ declare class UserService extends UserHelper {
6
7
  constructor();
7
8
  protected normalizeKey(key: string): string;
8
9
  protected getKey({ discordId }: Lean<UserDocument>): string;
9
- protected fetchFromDb(filter: string): Promise<Lean<UserDocument>>;
10
- protected fetchManyFromDb(filter: RootFilterQuery<UserDocument>): Promise<Lean<UserDocument>[]>;
10
+ protected fetchFromDb(filter: string, options: QueryOptions<UserDocument>): Promise<Lean<UserDocument>>;
11
+ protected fetchManyFromDb(filter: RootFilterQuery<UserDocument>, options: QueryOptions<UserDocument>): Promise<Lean<UserDocument>[]>;
11
12
  protected updateInDb(filter: RootFilterQuery<UserDocument>, update: MongooseUpdate<UserDocument>): Promise<import("mongoose").FlattenMaps<UserDocument> & Required<{
12
13
  _id: import("mongoose").Types.ObjectId;
13
14
  }> & {
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/user/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAItC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,cAAM,WAAY,SAAQ,UAAU;;IAKlC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI3C,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,MAAM;IAI3D,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAIlE,SAAS,CAAC,eAAe,CACvB,MAAM,EAAE,eAAe,CAAC,YAAY,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;IAIhC,SAAS,CAAC,UAAU,CAClB,MAAM,EAAE,eAAe,CAAC,YAAY,CAAC,EACrC,MAAM,EAAE,cAAc,CAAC,YAAY,CAAC;;;;;CAIvC;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/user/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,YAAY,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAItC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,cAAM,WAAY,SAAQ,UAAU;;IAKlC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI3C,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,MAAM;IAI3D,SAAS,CAAC,WAAW,CACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,YAAY,CAAC,YAAY,CAAC,GAClC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAI9B,SAAS,CAAC,eAAe,CACvB,MAAM,EAAE,eAAe,CAAC,YAAY,CAAC,EACrC,OAAO,EAAE,YAAY,CAAC,YAAY,CAAC,GAClC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;IAIhC,SAAS,CAAC,UAAU,CAClB,MAAM,EAAE,eAAe,CAAC,YAAY,CAAC,EACrC,MAAM,EAAE,cAAc,CAAC,YAAY,CAAC;;;;;CAIvC;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opfr/services",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "private": false,
5
5
  "description": "OPFR services",
6
6
  "author": "Matthieu VEIGA",
@@ -49,5 +49,5 @@
49
49
  "dependencies": {
50
50
  "node-cache": "^5"
51
51
  },
52
- "gitHead": "30203cb24881b699113496fffa3126378ed52f67"
52
+ "gitHead": "510026082ae206f4d29ecb84b824b82a841215c5"
53
53
  }
@@ -1,5 +0,0 @@
1
- import { type Model } from 'mongoose';
2
- import type { BetDocument } from '../types';
3
- declare const betModel: Model<BetDocument>;
4
- export { betModel };
5
- //# sourceMappingURL=model.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../src/services/bet/definition/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAiB,MAAM,UAAU,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAG5C,QAAA,MAAM,QAAQ,EAAE,KAAK,CAAC,WAAW,CACsB,CAAC;AAExD,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -1,15 +0,0 @@
1
- import { Schema } from 'mongoose';
2
- import type { BetDocument } from '../types';
3
- declare const betSchema: Schema<BetDocument, import("mongoose").Model<BetDocument, any, any, any, import("mongoose").Document<unknown, any, BetDocument, any, {}> & import("mongoose").Document<unknown, object, import("../types").BetOPFR, Record<string, any>, {}> & import("../types").BetOPFR & {
4
- _id: import("mongoose").Types.ObjectId;
5
- } & Required<{
6
- _id: import("mongoose").Types.ObjectId;
7
- }> & {
8
- __v: number;
9
- }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, BetDocument, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<BetDocument>, {}, import("mongoose").ResolveSchemaOptions<import("mongoose").DefaultSchemaOptions>> & import("mongoose").FlatRecord<BetDocument> & Required<{
10
- _id: import("mongoose").Types.ObjectId;
11
- }> & {
12
- __v: number;
13
- }>;
14
- export default betSchema;
15
- //# sourceMappingURL=schema.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/services/bet/definition/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,QAAA,MAAM,SAAS;;;;;;;;;;EAwBb,CAAC;AAEH,eAAe,SAAS,CAAC"}
@@ -1,5 +0,0 @@
1
- export type * from './types';
2
- export { betModel } from './definition/model';
3
- export { findBetById } from './process/findOne';
4
- export { createBet } from './process/create';
5
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/bet/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,SAAS,CAAC;AAE7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { BetDocument, BetOPFR } from '../types';
2
- export declare const createBet: (data: BetOPFR) => Promise<BetDocument>;
3
- //# sourceMappingURL=create.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../../src/services/bet/process/create.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAErD,eAAO,MAAM,SAAS,GAAU,MAAM,OAAO,KAAG,OAAO,CAAC,WAAW,CAIlE,CAAC"}
@@ -1,9 +0,0 @@
1
- import type { Types } from 'mongoose';
2
- export declare const findBetById: (betId: Types.ObjectId) => Promise<(import("mongoose").Document<unknown, {}, import("..").BetDocument, {}, {}> & import("mongoose").Document<unknown, object, import("..").BetOPFR, Record<string, any>, {}> & import("..").BetOPFR & {
3
- _id: Types.ObjectId;
4
- } & Required<{
5
- _id: Types.ObjectId;
6
- }> & {
7
- __v: number;
8
- }) | null>;
9
- //# sourceMappingURL=findOne.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"findOne.d.ts","sourceRoot":"","sources":["../../../../src/services/bet/process/findOne.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAItC,eAAO,MAAM,WAAW,GAAU,OAAO,KAAK,CAAC,QAAQ;;;;;;UAOtD,CAAC"}
@@ -1,4 +0,0 @@
1
- import type { Types, UpdateQuery, UpdateWithAggregationPipeline } from 'mongoose';
2
- import type { BetDocument } from '../types';
3
- export declare const updateBetById: (betId: Types.ObjectId, update: UpdateQuery<BetDocument> | UpdateWithAggregationPipeline, upsert?: boolean) => Promise<void>;
4
- //# sourceMappingURL=updateOne.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"updateOne.d.ts","sourceRoot":"","sources":["../../../../src/services/bet/process/updateOne.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,WAAW,EACX,6BAA6B,EAC9B,MAAM,UAAU,CAAC;AAGlB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,eAAO,MAAM,aAAa,GACxB,OAAO,KAAK,CAAC,QAAQ,EACrB,QAAQ,WAAW,CAAC,WAAW,CAAC,GAAG,6BAA6B,EAChE,SAAQ,OAAe,kBAGxB,CAAC"}
@@ -1,22 +0,0 @@
1
- import type { Document, Types } from 'mongoose';
2
- export interface BetOPFR {
3
- betId: number;
4
- betOwner: string;
5
- channelId: string;
6
- messageId: string;
7
- title: string;
8
- desc: string;
9
- state: 'running' | 'finished' | 'treated';
10
- end: Date;
11
- highestBet: number;
12
- choices: string[];
13
- bets: {
14
- owner: string;
15
- amount: number;
16
- choice: number;
17
- }[];
18
- }
19
- export type BetDocument = Document<unknown, object, BetOPFR> & BetOPFR & {
20
- _id: Types.ObjectId;
21
- };
22
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/bet/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEhD,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAElB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IAC1C,GAAG,EAAE,IAAI,CAAC;IAEV,UAAU,EAAE,MAAM,CAAC;IAEnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,EAAE,CAAC;CACL;AAED,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,GAC1D,OAAO,GAAG;IAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAA;CAAE,CAAC"}