@fnlb-project/database 1.0.83 → 1.0.84

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  // Generated by dts-bundle-generator v9.5.1
2
2
 
3
+ import { GenericErrorSender } from '@fnlb-project/shared/errors';
4
+ import { CategoryConfigSupportedPlatforms, CommunityListingKind, CommunityListingStatus, Locales } from '@fnlb-project/shared/types';
3
5
  import { ConnectOptions, HydratedDocument, Model, Schema, connection } from 'mongoose';
4
6
 
5
7
  export declare class DatabaseClient {
@@ -8,63 +10,6 @@ export declare class DatabaseClient {
8
10
  connect(options?: ConnectOptions): Promise<void>;
9
11
  private connectWithRetry;
10
12
  }
11
- declare enum GeneralErrorCodes {
12
- GenericUnknown = "net.fnlb.errors.generic.unknown",
13
- GenericInternalError = "net.fnlb.errors.generic.internal_error",
14
- GenericValidationFailed = "net.fnlb.errors.generic.validation_failed",
15
- GenericParseFailed = "net.fnlb.errors.generic.parse_failed",
16
- GenericNotFound = "net.fnlb.errors.generic.not_found",
17
- GenericAlreadyExists = "net.fnlb.errors.generic.already_exists",
18
- CommonInvalidRequest = "net.fnlb.errors.common.invalid_request",
19
- CommonUnableToProcessRequest = "net.fnlb.errors.common.unable_to_process_request",
20
- CommonInvalidFieldsLength = "net.fnlb.errors.common.invalid_body_fields_length",
21
- CommonRateLimitExceeded = "net.fnlb.errors.common.rate_limit_exceeded",
22
- CommonLimitExceeded = "net.fnlb.errors.common.limit_exceeded",
23
- CommonUnableToSaveToDatabase = "net.fnlb.errors.common.unable_to_save_to_database",
24
- CommonUpdateRequired = "net.fnlb.errors.common.update_required",
25
- CommonMaintenanceMode = "net.fnlb.errors.common.maintenance_mode",
26
- AuthInvalidToken = "net.fnlb.errors.auth.invalid_token",
27
- AuthInvalidAPIToken = "net.fnlb.errors.auth.invalid_api_token",
28
- AuthManagedAuthRefused = "net.fnlb.errors.auth.managed_auth_refused",
29
- AuthInvalidCaptchaToken = "net.fnlb.errors.auth.invalid_captcha_token",
30
- AuthUnauthorized = "net.fnlb.errors.auth.unauthorized",
31
- AuthForbidden = "net.fnlb.errors.auth.forbidden",
32
- AuthUserBanned = "net.fnlb.errors.auth.user_banned",
33
- Oauth2InvalidCode = "net.fnlb.errors.oauth2.invalid_code",
34
- Oauth2InvalidScope = "net.fnlb.errors.oauth2.invalid_scope",
35
- Oauth2TokenInvalid = "net.fnlb.errors.oauth2.token_invalid",
36
- Oauth2UnableToFetchUser = "net.fnlb.errors.oauth2.unable_to_fetch_user",
37
- Oauth2UnableToFetchConnections = "net.fnlb.errors.oauth2.unable_to_fetch_connections",
38
- Oauth2UserWithoutConnection = "net.fnlb.errors.oauth2.user_without_connection",
39
- Oauth2ConnectionNotVerified = "net.fnlb.errors.oauth2.connection_not_verified",
40
- ReleaseNotFound = "net.fnlb.errors.release.no_release_found",
41
- ReleaseVersionAlreadyExists = "net.fnlb.errors.release.version_already_exists",
42
- ReleaseHashMismatch = "net.fnlb.errors.release.hash_mismatch",
43
- MfaNotEnabled = "net.fnlb.errors.mfa.not_enabled",
44
- MfaAlreadyEnabled = "net.fnlb.errors.mfa.already_enabled",
45
- MfaChallengeExpired = "net.fnlb.errors.mfa.challenge_expired",
46
- MfaSetupExpired = "net.fnlb.errors.mfa.setup_expired"
47
- }
48
- declare enum InputErrorCodes {
49
- LoginInvalidCredentials = "net.fnlb.errors.login.invalid_credentials",
50
- LoginInvalidEmail = "net.fnlb.errors.login.invalid_email",
51
- LoginInvalidOrUsedEmail = "net.fnlb.errors.login.invalid_or_used_email",
52
- AuthPasswordConfirmationInvalid = "net.fnlb.errors.auth.invalid_password_confirmation",
53
- MfaInvalidCode = "net.fnlb.errors.mfa.invalid_code",
54
- MfaRequired = "net.fnlb.errors.mfa.required"
55
- }
56
- export type ErrorCodes = GeneralErrorCodes | InputErrorCodes;
57
- declare enum ErrorInputTypes {
58
- Username = "username",
59
- Email = "email",
60
- Password = "password",
61
- Shared = "shared",
62
- MfaCode = "mfaCode"
63
- }
64
- export type ErrorSenderErrors = GeneralErrorCodes | GeneralErrorCodes[] | InputErrorCodes | InputErrorCodes[] | ErrorCodes | ErrorCodes[];
65
- declare abstract class GenericErrorSender {
66
- abstract sendError(code: number, errors: ErrorSenderErrors, input?: ErrorInputTypes): unknown;
67
- }
68
13
  export declare class DatabaseErrorHandler {
69
14
  static handleError(err: any, errorSender: GenericErrorSender): unknown;
70
15
  }
@@ -230,55 +175,6 @@ export declare const BotModel: import("mongoose").Model<{
230
175
  } & {
231
176
  __v: number;
232
177
  }>>;
233
- declare enum CategoryConfigSupportedPlatforms {
234
- Win = "WIN",
235
- Mac = "MAC",
236
- Psn = "PSN",
237
- Xbl = "XBL",
238
- Swt = "SWT",
239
- Swt2 = "SWT2",
240
- Ios = "IOS",
241
- And = "AND",
242
- Ps5 = "PS5",
243
- Xsx = "XSX"
244
- }
245
- declare enum CommunityListingKind {
246
- Bot = "bot",
247
- Preset = "preset",
248
- Category = "category",
249
- Event = "event",
250
- CustomCommand = "custom_command",
251
- Scheduled = "scheduled"
252
- }
253
- declare enum CommunityListingStatus {
254
- Pending = "pending",
255
- Published = "published",
256
- Rejected = "rejected",
257
- Unlisted = "unlisted"
258
- }
259
- declare enum Locales {
260
- Default = "en",
261
- EnUS = "en-US",
262
- Es = "es",
263
- Es419 = "es-419",
264
- Ar = "ar",
265
- De = "de",
266
- Fr = "fr",
267
- He = "he",
268
- Id = "id",
269
- It = "it",
270
- Ja = "ja",
271
- Ko = "ko",
272
- Pl = "pl",
273
- Pt = "pt",
274
- PtBR = "pt-BR",
275
- Ru = "ru",
276
- Th = "th",
277
- Tr = "tr",
278
- Vi = "vi",
279
- Zh = "zh",
280
- ZhHant = "zh-Hant"
281
- }
282
178
  export declare const CategoryModel: import("mongoose").Model<{
283
179
  owner: import("mongoose").Types.ObjectId;
284
180
  name: string;
@@ -3703,6 +3599,8 @@ export interface IUser {
3703
3599
  username: string;
3704
3600
  avatar?: string;
3705
3601
  email: string;
3602
+ /** Encrypted personal email kept for account recovery when `email` is a staff @fnlb.net address. */
3603
+ recoveryEmail?: string;
3706
3604
  password: string;
3707
3605
  apiToken: string;
3708
3606
  flags?: number;
package/dist/index.js CHANGED
@@ -937,4 +937,4 @@ updatePath: '${n.raw.path}'`);n.trace.add(e);let s=Object.keys(e||{}),i=s.length
937
937
  * No-op if there is already a default connection.
938
938
  */function iO(e){if(e.connection)return;let t=e.createConnection();t[EJ]=!0,t.models=e.models}var $n=OJ.exports=SJ=new re({[_J]:!0})});var DJ=y(function(uxe,bJ){/*!
939
939
  * Module dependencies.
940
- */var wJ=SG();_2().set(wJ);var td=CJ();td.setDriver(wJ);td.Mongoose.prototype.mongo=Ca();bJ.exports=td});var Co=y(function(axe,Ee){var H=DJ();Ee.exports=H;Ee.exports.default=H;Ee.exports.mongoose=H;Ee.exports.cast=H.cast;Ee.exports.STATES=H.STATES;Ee.exports.setDriver=H.setDriver;Ee.exports.set=H.set;Ee.exports.get=H.get;Ee.exports.createConnection=H.createConnection;Ee.exports.connect=H.connect;Ee.exports.disconnect=H.disconnect;Ee.exports.startSession=H.startSession;Ee.exports.pluralize=H.pluralize;Ee.exports.model=H.model;Ee.exports.deleteModel=H.deleteModel;Ee.exports.modelNames=H.modelNames;Ee.exports.plugin=H.plugin;Ee.exports.connections=H.connections;Ee.exports.version=H.version;Ee.exports.Aggregate=H.Aggregate;Ee.exports.Mongoose=H.Mongoose;Ee.exports.Schema=H.Schema;Ee.exports.SchemaType=H.SchemaType;Ee.exports.SchemaTypes=H.SchemaTypes;Ee.exports.VirtualType=H.VirtualType;Ee.exports.Types=H.Types;Ee.exports.Query=H.Query;Ee.exports.Model=H.Model;Ee.exports.Document=H.Document;Ee.exports.ObjectId=H.ObjectId;Ee.exports.isValidObjectId=H.isValidObjectId;Ee.exports.isObjectIdOrHexString=H.isObjectIdOrHexString;Ee.exports.syncIndexes=H.syncIndexes;Ee.exports.Decimal128=H.Decimal128;Ee.exports.Mixed=H.Mixed;Ee.exports.Date=H.Date;Ee.exports.Number=H.Number;Ee.exports.Error=H.Error;Ee.exports.MongooseError=H.MongooseError;Ee.exports.now=H.now;Ee.exports.CastError=H.CastError;Ee.exports.SchemaTypeOptions=H.SchemaTypeOptions;Ee.exports.mongo=H.mongo;Ee.exports.mquery=H.mquery;Ee.exports.sanitizeFilter=H.sanitizeFilter;Ee.exports.trusted=H.trusted;Ee.exports.skipMiddlewareFunction=H.skipMiddlewareFunction;Ee.exports.overwriteMiddlewareResult=H.overwriteMiddlewareResult});var wOe=Do(Co(),1);var wo=Do(Co(),1);class TJ{dbURI;constructor(e){if(!e)throw Error("DB URI is not valid.");this.dbURI=e}async connect(e){console.log("Connecting to database..."),await this.connectWithRetry(e),wo.connection.on("connecting",()=>{console.log("Connecting to Database...")}),wo.connection.on("connected",()=>{console.log("Database is connected.")}),wo.connection.on("open",()=>{console.log("Database connection is ready.")}),wo.connection.on("disconnecting: ",()=>{console.log("Database is disconnecting...")}),wo.connection.on("error",(t)=>{console.error("Database connection error:",t)}),wo.connection.on("disconnected",(t)=>{console.warn("Database disconnected.",t)}),wo.connection.on("reconnected",(t)=>{console.warn("Database reconnected.",t)})}async connectWithRetry(e){try{await wo.connect(this.dbURI,{maxPoolSize:1000,autoIndex:!0,socketTimeoutMS:300000,...e})}catch(t){console.error("Unable to connect to the database. Retrying in 5s...",t),setTimeout(()=>this.connectWithRetry(),5000)}}}var XSe;((e)=>{e.String="string",e.Integer="integer",e.Float="float",e.Boolean="boolean",e.Object="object",e.Wildcard="wildcard",e.Exec="exec"})(XSe||={});var ZSe;((e)=>{e[e.Single=0]="Single",e[e.Select=1]="Select",e[e.Array=2]="Array"})(ZSe||={});var eOe;((e)=>{e[e.Offline=0]="Offline",e[e.Booting=1]="Booting",e[e.Available=2]="Available",e[e.Busy=3]="Busy",e[e.Disconnected=4]="Disconnected"})(eOe||={});var tOe;((e)=>{e[e.Neutral=0]="Neutral",e[e.Success=1]="Success",e[e.Info=2]="Info",e[e.Warn=3]="Warn",e[e.Error=4]="Error"})(tOe||={});var oO;((e)=>{e.Win="WIN",e.Mac="MAC",e.Psn="PSN",e.Xbl="XBL",e.Swt="SWT",e.Swt2="SWT2",e.Ios="IOS",e.And="AND",e.Ps5="PS5",e.Xsx="XSX"})(oO||={});var uO;((e)=>{e[e.Public=0]="Public",e[e.Private=1]="Private"})(uO||={});var aO;((e)=>{e[e.Auto=0]="Auto",e[e.Online=1]="Online",e[e.Away=2]="Away"})(aO||={});var W1;((e)=>{e[e.Event=0]="Event",e[e.CustomCommand=1]="CustomCommand",e[e.Scheduled=2]="Scheduled"})(W1||={});var z1;((e)=>{e[e.RunCommand=0]="RunCommand",e[e.RunFunction=1]="RunFunction",e[e.ControlFlow=2]="ControlFlow"})(z1||={});var cO;((e)=>{e[e.Ready=0]="Ready",e[e.Disconnected=1]="Disconnected",e[e.PartyInvite=2]="PartyInvite",e[e.PartyJoinRequest=3]="PartyJoinRequest",e[e.PartyMemberJoined=4]="PartyMemberJoined",e[e.PartyMemberLeft=5]="PartyMemberLeft",e[e.PartyMemberKicked=6]="PartyMemberKicked",e[e.PartyMemberMessage=7]="PartyMemberMessage",e[e.PartyMemberPromoted=8]="PartyMemberPromoted",e[e.PartyMemberReady=9]="PartyMemberReady",e[e.PartyMemberSitOut=10]="PartyMemberSitOut",e[e.PartyMemberUnready=11]="PartyMemberUnready",e[e.PartyMemberMatch=12]="PartyMemberMatch",e[e.PartyMemberCosmeticUpdated=13]="PartyMemberCosmeticUpdated",e[e.FriendAdded=14]="FriendAdded",e[e.FriendRemoved=15]="FriendRemoved",e[e.FriendRequest=16]="FriendRequest",e[e.FriendMessage=17]="FriendMessage",e[e.FriendOnline=18]="FriendOnline",e[e.FriendOffline=19]="FriendOffline",e[e.UserBlocked=20]="UserBlocked",e[e.UserUnblocked=21]="UserUnblocked",e[e.PartyMemberInParty=22]="PartyMemberInParty"})(cO||={});var fg;((e)=>{e.Default="en",e.EnUS="en-US",e.Es="es",e.Es419="es-419",e.Ar="ar",e.De="de",e.Fr="fr",e.He="he",e.Id="id",e.It="it",e.Ja="ja",e.Ko="ko",e.Pl="pl",e.Pt="pt",e.PtBR="pt-BR",e.Ru="ru",e.Th="th",e.Tr="tr",e.Vi="vi",e.Zh="zh",e.ZhHant="zh-Hant"})(fg||={});var rOe;((e)=>{e.Default="en",e.Ar="ar",e.De="de",e.Es="es",e.Es419="es-419",e.Fr="fr",e.Id="id",e.It="it",e.Ja="ja",e.Ko="ko",e.Pl="pl",e.PtBR="pt-BR",e.Ru="ru",e.Th="th",e.Tr="tr",e.Vi="vi",e.ZhHans="zh-Hans",e.ZhHant="zh-Hant"})(rOe||={});var lO;((e)=>{e.Bot="bot",e.Preset="preset",e.Category="category",e.Event="event",e.CustomCommand="custom_command",e.Scheduled="scheduled"})(lO||={});var hO;((e)=>{e.Pending="pending",e.Published="published",e.Rejected="rejected",e.Unlisted="unlisted"})(hO||={});var MJ;((e)=>{e.GenericUnknown="net.fnlb.errors.generic.unknown",e.GenericInternalError="net.fnlb.errors.generic.internal_error",e.GenericValidationFailed="net.fnlb.errors.generic.validation_failed",e.GenericParseFailed="net.fnlb.errors.generic.parse_failed",e.GenericNotFound="net.fnlb.errors.generic.not_found",e.GenericAlreadyExists="net.fnlb.errors.generic.already_exists",e.CommonInvalidRequest="net.fnlb.errors.common.invalid_request",e.CommonUnableToProcessRequest="net.fnlb.errors.common.unable_to_process_request",e.CommonInvalidFieldsLength="net.fnlb.errors.common.invalid_body_fields_length",e.CommonRateLimitExceeded="net.fnlb.errors.common.rate_limit_exceeded",e.CommonLimitExceeded="net.fnlb.errors.common.limit_exceeded",e.CommonUnableToSaveToDatabase="net.fnlb.errors.common.unable_to_save_to_database",e.CommonUpdateRequired="net.fnlb.errors.common.update_required",e.CommonMaintenanceMode="net.fnlb.errors.common.maintenance_mode",e.AuthInvalidToken="net.fnlb.errors.auth.invalid_token",e.AuthInvalidAPIToken="net.fnlb.errors.auth.invalid_api_token",e.AuthManagedAuthRefused="net.fnlb.errors.auth.managed_auth_refused",e.AuthInvalidCaptchaToken="net.fnlb.errors.auth.invalid_captcha_token",e.AuthUnauthorized="net.fnlb.errors.auth.unauthorized",e.AuthForbidden="net.fnlb.errors.auth.forbidden",e.AuthUserBanned="net.fnlb.errors.auth.user_banned",e.Oauth2InvalidCode="net.fnlb.errors.oauth2.invalid_code",e.Oauth2InvalidScope="net.fnlb.errors.oauth2.invalid_scope",e.Oauth2TokenInvalid="net.fnlb.errors.oauth2.token_invalid",e.Oauth2UnableToFetchUser="net.fnlb.errors.oauth2.unable_to_fetch_user",e.Oauth2UnableToFetchConnections="net.fnlb.errors.oauth2.unable_to_fetch_connections",e.Oauth2UserWithoutConnection="net.fnlb.errors.oauth2.user_without_connection",e.Oauth2ConnectionNotVerified="net.fnlb.errors.oauth2.connection_not_verified",e.ReleaseNotFound="net.fnlb.errors.release.no_release_found",e.ReleaseVersionAlreadyExists="net.fnlb.errors.release.version_already_exists",e.ReleaseHashMismatch="net.fnlb.errors.release.hash_mismatch",e.MfaNotEnabled="net.fnlb.errors.mfa.not_enabled",e.MfaAlreadyEnabled="net.fnlb.errors.mfa.already_enabled",e.MfaChallengeExpired="net.fnlb.errors.mfa.challenge_expired",e.MfaSetupExpired="net.fnlb.errors.mfa.setup_expired"})(MJ||={});var xJ;((e)=>{e.LoginInvalidCredentials="net.fnlb.errors.login.invalid_credentials",e.LoginInvalidEmail="net.fnlb.errors.login.invalid_email",e.LoginInvalidOrUsedEmail="net.fnlb.errors.login.invalid_or_used_email",e.AuthPasswordConfirmationInvalid="net.fnlb.errors.auth.invalid_password_confirmation",e.MfaInvalidCode="net.fnlb.errors.mfa.invalid_code",e.MfaRequired="net.fnlb.errors.mfa.required"})(xJ||={});var Ja={...MJ,...xJ},nOe;((e)=>{e.Username="username",e.Email="email",e.Password="password",e.Shared="shared",e.MfaCode="mfaCode"})(nOe||={});var sOe;((e)=>{e.General="general",e.Input="input"})(sOe||={});var iOe;((e)=>{e[e.Disabled=1]="Disabled",e[e.Verified=2]="Verified",e[e.VerificationPending=4]="VerificationPending",e[e.PublicClient=8]="PublicClient"})(iOe||={});var oOe;((e)=>{e[e.Disabled=1]="Disabled",e[e.Public=2]="Public",e[e.InvalidAuth=4]="InvalidAuth",e[e.Prepared=8]="Prepared"})(oOe||={});var uOe;((e)=>{e[e.Disabled=1]="Disabled",e[e.Managed=2]="Managed"})(uOe||={});var aOe;((e)=>e[e.NotWearable=1]="NotWearable")(aOe||={});var cOe;((e)=>{e[e.identify=1]="identify",e[e.email=2]="email",e[e.connections=4]="connections",e[e["bots.read"]=8]="bots.read",e[e["bots.write"]=16]="bots.write",e[e["bots.run"]=32]="bots.run",e[e["categories.read"]=64]="categories.read",e[e["categories.write"]=128]="categories.write",e[e["commands.run"]=256]="commands.run",e[e.openid=512]="openid",e[e.profile=1024]="profile"})(cOe||={});var lOe;((e)=>{e[e.Ready=1]="Ready",e[e.Leader=2]="Leader",e[e.SittingOut=4]="SittingOut",e[e.Playing=8]="Playing"})(lOe||={});var hOe;((e)=>{e[e.Disabled=1]="Disabled",e[e.IgnoreSelf=2]="IgnoreSelf",e[e.IgnoreBots=4]="IgnoreBots",e[e.IgnoreLeader=8]="IgnoreLeader",e[e.IgnoreOwners=16]="IgnoreOwners",e[e.IgnoreAdmins=32]="IgnoreAdmins",e[e.IgnoreWhitelistUsers=64]="IgnoreWhitelistUsers",e[e.IgnoreBlacklistUsers=128]="IgnoreBlacklistUsers",e[e.IgnoreExcludedAutoAddFriends=256]="IgnoreExcludedAutoAddFriends",e[e.IgnoreFriends=512]="IgnoreFriends",e[e.IgnoreOtherBots=1024]="IgnoreOtherBots",e[e.IgnorePartyMembers=2048]="IgnorePartyMembers"})(hOe||={});var oa;((e)=>{e[e.Staff=1]="Staff",e[e.Admin=2]="Admin",e[e.Vip=4]="Vip",e[e.Verified=8]="Verified",e[e.Banned=16]="Banned",e[e.Tester=32]="Tester",e[e.Developer=64]="Developer",e[e.Partner=128]="Partner",e[e.Management=256]="Management",e[e.Moderation=512]="Moderation",e[e.Support=1024]="Support",e[e.IncreasedLimits=2048]="IncreasedLimits",e[e.Disabled=4096]="Disabled"})(oa||={});var fO;((i)=>{i[i.InternalError=1]="InternalError";i[i.BadValue=2]="BadValue";i[i.NoSuchKey=4]="NoSuchKey";i[i.KeyNotFound=211]="KeyNotFound";i[i.DuplicateKey=11000]="DuplicateKey"})(fO||={});class BJ{static handleError(e,t){if(!e)return!1;switch(e.code){case 11000:return t.sendError(400,Ja.GenericAlreadyExists);case 2:return t.sendError(500,Ja.CommonUnableToSaveToDatabase);case 211:return t.sendError(500,Ja.CommonUnableToSaveToDatabase);case 4:return t.sendError(500,Ja.CommonUnableToSaveToDatabase);case 1:return console.error("Internal MongoDB error:",e),t.sendError(500,Ja.CommonUnableToSaveToDatabase);default:return console.error("Unhandled MongoError code:",e.code,e),t.sendError(500,Ja.CommonUnableToSaveToDatabase)}}}var rd=Do(Co(),1);var fOe=["password","token","apiToken","applications","mfa","deviceAuth","secret"];class Ms{static transformSchemaToJSON(e){let t=new Set(e);return(r,n)=>{if(n._id!==void 0)n.id=n._id;delete n._id,delete n.__v;for(let s of Object.keys(n))if(!t.has(s))delete n[s];for(let s of fOe)delete n[s]}}}var dOe=8,FJ=new rd.Schema({owner:{type:rd.Schema.Types.ObjectId,ref:"user",required:!0,index:!0},secret:{type:String,required:function(){return!((this.flags??0)&dOe)},trim:!0},name:{type:String,required:!0,trim:!0},icon:{type:String,required:!1,trim:!0,default:void 0},description:{type:String,required:!1,trim:!0,default:void 0},scopes:{type:Number,required:!1,default:void 0},redirectUris:{type:[String],required:!1,trim:!0,default:void 0},tosUri:{type:String,required:!1,trim:!0,default:void 0},policyUri:{type:String,required:!1,trim:!0,default:void 0},installUri:{type:String,required:!1,trim:!0,default:void 0},flags:{type:Number,required:!1,default:void 0}});FJ.set("toJSON",{transform:Ms.transformSchemaToJSON(["id","owner","name","icon","description","scopes","redirectUris","tosUri","policyUri","installUri","flags"])});var pOe=rd.model("application",FJ);var G1=Do(Co(),1);var PJ=new G1.Schema({owner:{type:G1.Schema.Types.ObjectId,ref:"user",required:!0,index:!0},parent:{type:G1.Schema.Types.ObjectId,ref:"category",required:!1,index:!0,sparse:!0},nickname:{type:String,required:!0,trim:!0},flags:{type:Number,required:!1},email:{type:String,required:!1,trim:!0},deviceAuth:{required:!0,type:{accountId:{type:String,required:!0,unique:!0,lowercase:!0,trim:!0},deviceId:{type:String,required:!0,lowercase:!0,trim:!0},secret:{type:String,required:!0,trim:!0}},_id:!1},mmsBannedUntil:{type:Number,required:!1}});PJ.set("toJSON",{transform:Ms.transformSchemaToJSON(["id","owner","parent","nickname","flags","email","mmsBannedUntil"])});var mOe=G1.model("bot",PJ);var sd=Do(Co(),1);function nd(e){return Object.values(e).filter((t)=>typeof t==="number")}var IJ=new sd.Schema({owner:{type:sd.Schema.Types.ObjectId,ref:"user",required:!0,index:!0},name:{type:String,required:!0,trim:!0},flags:{type:Number,required:!1},managed:{type:Boolean,required:!1,index:!0,sparse:!0,default:void 0},config:{replyLangs:{type:[String],enum:Object.values(fg),default:void 0},searchLangs:{type:[String],enum:Object.values(fg),default:void 0},platform:{type:[String],enum:Object.values(oO),default:void 0},privacy:{type:Number,enum:nd(uO),default:void 0},prefixes:{type:[String],default:void 0},statusType:{type:Number,enum:nd(aO),default:void 0},statusText:{type:[String],default:void 0},statusInterval:{type:Number,default:void 0},level:{type:[Number],default:void 0},bpLevel:{type:[Number],default:void 0},extraOwners:{type:[{id:String,name:String,_id:!1}],default:void 0},admins:{type:[{id:String,name:String,_id:!1}],default:void 0},whitelistUsers:{type:[{id:String,name:String,_id:!1}],default:void 0},blacklistUsers:{type:[{id:String,name:String,_id:!1}],default:void 0},excludedAutoAddFriends:{type:[{id:String,name:String,_id:!1}],default:void 0},otherBots:{type:[{id:String,name:String,_id:!1}],default:void 0},inviteTimeout:{type:Number,default:void 0},maxBotsPerLobby:{type:Number,default:void 0},maxBotsPerLobbyWithOwner:{type:Number,default:void 0},maxBotsPerLobbyWithAdmin:{type:Number,default:void 0},maxBotsPerLobbyWithWhitelistUser:{type:Number,default:void 0},allowMatchmaking:{type:Boolean,default:void 0},leaveAfterMatchmaking:{type:Boolean,default:void 0},disableMatchmakingChecks:{type:Boolean,default:void 0},disablePlaylistChecks:{type:Boolean,default:void 0},disableJoinMessages:{type:Boolean,default:void 0},disableAutomaticMessages:{type:Boolean,default:void 0},acceptFriendRequests:{type:Boolean,default:void 0},sendFriendRequestOnJoinParty:{type:Boolean,default:void 0},sendFriendRequestOnMemberJoinParty:{type:Boolean,default:void 0},runCommandsWithoutPrefix:{type:Boolean,default:void 0},setCosmeticsWithoutCommands:{type:Boolean,default:void 0},setCosmeticsWithPrefix:{type:Boolean,default:void 0},acceptInvites:{type:Boolean,default:void 0},startBannedBots:{type:Boolean,default:void 0},triggers:{type:[{name:{type:String,required:!0},flags:{type:Number,required:!1,default:void 0},type:{type:Number,required:!0,enum:nd(W1)},event:{type:Number,enum:nd(cO),required(){return this.type===W1.Event},default:void 0},command:{type:String,required(){return this.type===W1.CustomCommand},default:void 0},interval:{type:String,required(){return this.type===W1.Scheduled},default:void 0},actions:{type:[{id:{type:String,required:!1},parent:{type:String,required:!1},type:{type:Number,enum:nd(z1),required:!0},command:{type:String,required(){return this.type===z1.RunCommand}},function:{type:String,required(){return this.type===z1.RunFunction}},statement:{type:String,required(){return this.type===z1.ControlFlow}},args:{type:[String],default:void 0,required:!0},condition:{type:String,default:void 0,required:!1},_id:!1}],required:!0,default:void 0,_id:!1},_id:!1}],default:void 0},onlyOwnerCommands:{type:[String],default:void 0},onlyAdminCommands:{type:[String],default:void 0},onlyWhitelistUsersCommands:{type:[String],default:void 0},onlyFriendsCommands:{type:[String],default:void 0},onlyPartyMembersCommands:{type:[String],default:void 0},onlyWhisperCommands:{type:[String],default:void 0},startOutfit:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},startBackpack:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},startPickaxe:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},startShoes:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},startSidekick:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},startBanner:{type:[{id:String,_id:!1}],default:void 0},startBannerColor:{type:[{id:String,_id:!1}],default:void 0},joinOutfit:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},joinBackpack:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},joinPickaxe:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},joinEmote:{type:[{id:String,_id:!1}],default:void 0},joinShoes:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},joinSidekick:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},joinBanner:{type:[{id:String,_id:!1}],default:void 0},joinBannerColor:{type:[{id:String,_id:!1}],default:void 0},memberJoinOutfit:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},memberJoinBackpack:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},memberJoinPickaxe:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},memberJoinEmote:{type:[{id:String,_id:!1}],default:void 0},memberJoinShoes:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},memberJoinSidekick:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},memberJoinBanner:{type:[{id:String,_id:!1}],default:void 0},memberJoinBannerColor:{type:[{id:String,_id:!1}],default:void 0}}});IJ.set("toJSON",{transform:Ms.transformSchemaToJSON(["id","owner","name","flags","managed","config"])});var yOe=sd.model("category",IJ);var H1=Do(Co(),1),dO=new H1.Schema({listing:{type:H1.Schema.Types.ObjectId,ref:"communityListing",required:!0},user:{type:H1.Schema.Types.ObjectId,ref:"user",required:!0}});dO.index({listing:1,user:1},{unique:!0});dO.index({user:1,listing:1});var gOe=H1.model("communityListingLike",dO);var K1=Do(Co(),1);var pO=new K1.Schema({kind:{type:String,required:!0,enum:Object.values(lO),index:!0},title:{type:String,required:!0,trim:!0,maxlength:80},description:{type:String,required:!1,trim:!0,maxlength:2000},tags:{type:[String],default:void 0},author:{type:K1.Schema.Types.ObjectId,ref:"user",required:!0,index:!0},status:{type:String,required:!0,enum:Object.values(hO),index:!0},stats:{type:{installs:{type:Number,required:!1},likes:{type:Number,required:!1,default:0,min:0}},_id:!1,required:!1,default:void 0},liveRef:{type:{categoryId:{type:String,required:!0,trim:!0}},_id:!1,required:!1,default:void 0},payload:{type:K1.Schema.Types.Mixed,required:!1,default:void 0}});pO.index({status:1,kind:1});pO.set("toJSON",{transform:Ms.transformSchemaToJSON(["id","kind","title","description","tags","author","status","stats","liveRef","payload"])});var _Oe=K1.model("communityListing",pO);var od=Do(Co(),1);var id={id:{type:String,required:!0},variants:{type:[Number],default:void 0},_id:!1},EOe={id:{type:String,required:!0},_id:!1},$J=new od.Schema({owner:{type:od.Schema.Types.ObjectId,ref:"user",required:!0,index:!0},name:{type:String,required:!0,trim:!0,maxlength:64},outfit:{type:id,default:void 0},pickaxe:{type:id,default:void 0},backpack:{type:id,default:void 0},emote:{type:EOe,default:void 0},shoes:{type:id,default:void 0},sidekick:{type:id,default:void 0}});$J.set("toJSON",{transform:Ms.transformSchemaToJSON(["id","owner","name","outfit","pickaxe","backpack","emote","shoes","sidekick"])});var AOe=od.model("preset",$J);var ad=Do(Co(),1);class Y1{bitfield;constructor(e){this.bitfield=e??0}static from(...e){let t=0;for(let r of e)t|=r;return new Y1(t)}has(e){return(this.bitfield&e)!==0}hasAll(...e){let t=0;for(let r of e)t|=r;return(this.bitfield&t)===t}hasAny(...e){let t=0;for(let r of e)t|=r;return(this.bitfield&t)!==0}add(e){return this.bitfield|=e,this}remove(e){return this.bitfield&=~e,this}toNumber(){return this.bitfield}}var SOe=86400000;function mO(e,t,r){let n=new Y1(e),i=n.has(oa.Vip)&&!t;if(n.add(oa.Vip),r==null||i)return{update:{$set:{flags:n.toNumber()},$unset:{vipExpiresAt:1}},vipExpiresAt:null,permanent:!0};let a=new Date(Date.now()+r*SOe);return{update:{$set:{flags:n.toNumber(),vipExpiresAt:a}},vipExpiresAt:a,permanent:!1}}function dg(e){let t=new Y1(e);return t.remove(oa.Vip),{$set:{flags:t.toNumber()},$unset:{vipExpiresAt:1}}}function yO(e,t,r=Date.now()){if(!t)return"none";if(!new Y1(e).has(oa.Vip))return"cleanup";if(new Date(t).getTime()>r)return"none";return"expire"}var OOe=/^[a-f\d]{24}$/i;function ud(e){return typeof e==="string"&&OOe.test(e)}var gO=new ad.Schema({token:{type:String,required:!0,unique:!1},username:{type:String,required:!0,trim:!0},avatar:{type:String,required:!1,trim:!0,maxlength:128},email:{type:String,index:!0,required:!0,unique:!0,trim:!0},password:{type:String,required:!0},apiToken:{type:String,required:!0,index:!1,unique:!1,trim:!0},flags:{type:Number,required:!1},vipExpiresAt:{type:Date,required:!1,index:!0},connections:{discord:{id:{type:String,index:!0,unique:!0,sparse:!0},username:{type:String},verified:{type:Boolean,required:!1}},google:{id:{type:String,index:!0,unique:!0,sparse:!0},username:{type:String},verified:{type:Boolean,required:!1}},epic:{id:{type:String,index:!0,unique:!0,sparse:!0},username:{type:String},verified:{type:Boolean,required:!1}}},applications:{type:[{_id:!1,id:{type:ad.Schema.Types.ObjectId,ref:"application",required:!0,trim:!0},token:{type:String,required:!0,trim:!0},scopes:{type:Number,required:!0}}],default:void 0},mfa:{type:{totp:{enabled:{type:Boolean,required:!1},secret:{type:String,required:!1}},recoveryCodes:{type:[{_id:!1,hash:{type:String,required:!0},usedAt:{type:Date,required:!1}}],default:void 0}},default:void 0}},{statics:{async verifyPassword(e,t){return Bun.password.verify(e,t)},async expireVipIfNeeded(e){let t=yO(e.flags,e.vipExpiresAt);if(t==="none")return!1;let r=dg(e.flags);return e.flags=r.$set.flags,e.vipExpiresAt=void 0,await this.updateOne({_id:e._id},r).exec(),t==="expire"},async findByToken(e,t){if(!ud(e))return null;let r=await this.findById(e);if(!r?.token||r.token!==t)return null;return await this.expireVipIfNeeded(r),r},async findByAPIToken(e,t){if(!ud(e))return null;let r=await this.findById(e);if(!r?.apiToken||r.apiToken!==t)return null;return await this.expireVipIfNeeded(r),r},async findByAccessToken(e,t){if(!ud(e))return null;let r=await this.findById(e),n=r?.applications?.find((s)=>s.token===t);if(!n||!r)return null;return await this.expireVipIfNeeded(r),{user:r,app:n}},async grantVip(e,t){if(!ud(e))return null;let r=await this.findById(e).exec();if(!r)return null;await this.expireVipIfNeeded(r);let n=typeof t==="number"&&Number.isFinite(t)?Math.max(1,Math.floor(t)):null,{update:s,vipExpiresAt:i,permanent:o}=mO(r.flags,r.vipExpiresAt,n),a=await this.updateOne({_id:r._id},s).exec();if(a.matchedCount===0)return null;return r.flags=s.$set.flags,r.vipExpiresAt=i??void 0,{ok:!0,permanent:o,vipExpiresAt:i,modified:a.modifiedCount>0,user:r}},async revokeVip(e){if(!ud(e))return null;let t=await this.findById(e).exec();if(!t)return null;let r=dg(t.flags),n=await this.updateOne({_id:t._id},r).exec();if(n.matchedCount===0)return null;return t.flags=r.$set.flags,t.vipExpiresAt=void 0,{ok:!0,modified:n.modifiedCount>0,user:t}},async expireDueVips(e=100){let t=new Date,r=await this.find({flags:{$bitsAnySet:oa.Vip},vipExpiresAt:{$lte:t}}).limit(e).exec(),n=[];for(let s of r){if(!await this.revokeVip(s.id))continue;n.push({id:s.id,username:s.username,email:s.email,discordId:s.connections?.discord?.id})}return n}}});gO.pre("save",async function(e){if(!this.isModified("password"))return e();try{return this.password=await Bun.password.hash(this.password,{algorithm:process.env.SAVE_ACCOUNT_ALGORITHM||"argon2id",timeCost:parseInt(process.env.SAVE_ACCOUNT_TIME_COST||"3"),cost:parseInt(process.env.SAVE_ACCOUNT_ALGORITHM_COST||"12")}),e()}catch(t){return e(t)}});gO.set("toJSON",{transform:Ms.transformSchemaToJSON(["id","username","avatar","email","flags","vipExpiresAt","connections"])});var COe=ad.model("user",gO);var uBe=wOe.connection;export{pOe as ApplicationModel,mOe as BotModel,yOe as CategoryModel,gOe as CommunityListingLikeModel,_Oe as CommunityListingModel,TJ as DatabaseClient,BJ as DatabaseErrorHandler,fO as DatabaseErrors,AOe as PresetModel,COe as UserModel,dg as buildVipClearUpdate,mO as buildVipGrantUpdate,uBe as connection,yO as shouldExpireVip};
940
+ */var wJ=SG();_2().set(wJ);var td=CJ();td.setDriver(wJ);td.Mongoose.prototype.mongo=Ca();bJ.exports=td});var Co=y(function(axe,Ee){var H=DJ();Ee.exports=H;Ee.exports.default=H;Ee.exports.mongoose=H;Ee.exports.cast=H.cast;Ee.exports.STATES=H.STATES;Ee.exports.setDriver=H.setDriver;Ee.exports.set=H.set;Ee.exports.get=H.get;Ee.exports.createConnection=H.createConnection;Ee.exports.connect=H.connect;Ee.exports.disconnect=H.disconnect;Ee.exports.startSession=H.startSession;Ee.exports.pluralize=H.pluralize;Ee.exports.model=H.model;Ee.exports.deleteModel=H.deleteModel;Ee.exports.modelNames=H.modelNames;Ee.exports.plugin=H.plugin;Ee.exports.connections=H.connections;Ee.exports.version=H.version;Ee.exports.Aggregate=H.Aggregate;Ee.exports.Mongoose=H.Mongoose;Ee.exports.Schema=H.Schema;Ee.exports.SchemaType=H.SchemaType;Ee.exports.SchemaTypes=H.SchemaTypes;Ee.exports.VirtualType=H.VirtualType;Ee.exports.Types=H.Types;Ee.exports.Query=H.Query;Ee.exports.Model=H.Model;Ee.exports.Document=H.Document;Ee.exports.ObjectId=H.ObjectId;Ee.exports.isValidObjectId=H.isValidObjectId;Ee.exports.isObjectIdOrHexString=H.isObjectIdOrHexString;Ee.exports.syncIndexes=H.syncIndexes;Ee.exports.Decimal128=H.Decimal128;Ee.exports.Mixed=H.Mixed;Ee.exports.Date=H.Date;Ee.exports.Number=H.Number;Ee.exports.Error=H.Error;Ee.exports.MongooseError=H.MongooseError;Ee.exports.now=H.now;Ee.exports.CastError=H.CastError;Ee.exports.SchemaTypeOptions=H.SchemaTypeOptions;Ee.exports.mongo=H.mongo;Ee.exports.mquery=H.mquery;Ee.exports.sanitizeFilter=H.sanitizeFilter;Ee.exports.trusted=H.trusted;Ee.exports.skipMiddlewareFunction=H.skipMiddlewareFunction;Ee.exports.overwriteMiddlewareResult=H.overwriteMiddlewareResult});var wOe=Do(Co(),1);var wo=Do(Co(),1);class TJ{dbURI;constructor(e){if(!e)throw Error("DB URI is not valid.");this.dbURI=e}async connect(e){console.log("Connecting to database..."),await this.connectWithRetry(e),wo.connection.on("connecting",()=>{console.log("Connecting to Database...")}),wo.connection.on("connected",()=>{console.log("Database is connected.")}),wo.connection.on("open",()=>{console.log("Database connection is ready.")}),wo.connection.on("disconnecting: ",()=>{console.log("Database is disconnecting...")}),wo.connection.on("error",(t)=>{console.error("Database connection error:",t)}),wo.connection.on("disconnected",(t)=>{console.warn("Database disconnected.",t)}),wo.connection.on("reconnected",(t)=>{console.warn("Database reconnected.",t)})}async connectWithRetry(e){try{await wo.connect(this.dbURI,{maxPoolSize:1000,autoIndex:!0,socketTimeoutMS:300000,...e})}catch(t){console.error("Unable to connect to the database. Retrying in 5s...",t),setTimeout(()=>this.connectWithRetry(),5000)}}}var XSe;((e)=>{e.String="string",e.Integer="integer",e.Float="float",e.Boolean="boolean",e.Object="object",e.Wildcard="wildcard",e.Exec="exec"})(XSe||={});var ZSe;((e)=>{e[e.Single=0]="Single",e[e.Select=1]="Select",e[e.Array=2]="Array"})(ZSe||={});var eOe;((e)=>{e[e.Offline=0]="Offline",e[e.Booting=1]="Booting",e[e.Available=2]="Available",e[e.Busy=3]="Busy",e[e.Disconnected=4]="Disconnected"})(eOe||={});var tOe;((e)=>{e[e.Neutral=0]="Neutral",e[e.Success=1]="Success",e[e.Info=2]="Info",e[e.Warn=3]="Warn",e[e.Error=4]="Error"})(tOe||={});var oO;((e)=>{e.Win="WIN",e.Mac="MAC",e.Psn="PSN",e.Xbl="XBL",e.Swt="SWT",e.Swt2="SWT2",e.Ios="IOS",e.And="AND",e.Ps5="PS5",e.Xsx="XSX"})(oO||={});var uO;((e)=>{e[e.Public=0]="Public",e[e.Private=1]="Private"})(uO||={});var aO;((e)=>{e[e.Auto=0]="Auto",e[e.Online=1]="Online",e[e.Away=2]="Away"})(aO||={});var W1;((e)=>{e[e.Event=0]="Event",e[e.CustomCommand=1]="CustomCommand",e[e.Scheduled=2]="Scheduled"})(W1||={});var z1;((e)=>{e[e.RunCommand=0]="RunCommand",e[e.RunFunction=1]="RunFunction",e[e.ControlFlow=2]="ControlFlow"})(z1||={});var cO;((e)=>{e[e.Ready=0]="Ready",e[e.Disconnected=1]="Disconnected",e[e.PartyInvite=2]="PartyInvite",e[e.PartyJoinRequest=3]="PartyJoinRequest",e[e.PartyMemberJoined=4]="PartyMemberJoined",e[e.PartyMemberLeft=5]="PartyMemberLeft",e[e.PartyMemberKicked=6]="PartyMemberKicked",e[e.PartyMemberMessage=7]="PartyMemberMessage",e[e.PartyMemberPromoted=8]="PartyMemberPromoted",e[e.PartyMemberReady=9]="PartyMemberReady",e[e.PartyMemberSitOut=10]="PartyMemberSitOut",e[e.PartyMemberUnready=11]="PartyMemberUnready",e[e.PartyMemberMatch=12]="PartyMemberMatch",e[e.PartyMemberCosmeticUpdated=13]="PartyMemberCosmeticUpdated",e[e.FriendAdded=14]="FriendAdded",e[e.FriendRemoved=15]="FriendRemoved",e[e.FriendRequest=16]="FriendRequest",e[e.FriendMessage=17]="FriendMessage",e[e.FriendOnline=18]="FriendOnline",e[e.FriendOffline=19]="FriendOffline",e[e.UserBlocked=20]="UserBlocked",e[e.UserUnblocked=21]="UserUnblocked",e[e.PartyMemberInParty=22]="PartyMemberInParty"})(cO||={});var fg;((e)=>{e.Default="en",e.EnUS="en-US",e.Es="es",e.Es419="es-419",e.Ar="ar",e.De="de",e.Fr="fr",e.He="he",e.Id="id",e.It="it",e.Ja="ja",e.Ko="ko",e.Pl="pl",e.Pt="pt",e.PtBR="pt-BR",e.Ru="ru",e.Th="th",e.Tr="tr",e.Vi="vi",e.Zh="zh",e.ZhHant="zh-Hant"})(fg||={});var rOe;((e)=>{e.Default="en",e.Ar="ar",e.De="de",e.Es="es",e.Es419="es-419",e.Fr="fr",e.Id="id",e.It="it",e.Ja="ja",e.Ko="ko",e.Pl="pl",e.PtBR="pt-BR",e.Ru="ru",e.Th="th",e.Tr="tr",e.Vi="vi",e.ZhHans="zh-Hans",e.ZhHant="zh-Hant"})(rOe||={});var lO;((e)=>{e.Bot="bot",e.Preset="preset",e.Category="category",e.Event="event",e.CustomCommand="custom_command",e.Scheduled="scheduled"})(lO||={});var hO;((e)=>{e.Pending="pending",e.Published="published",e.Rejected="rejected",e.Unlisted="unlisted"})(hO||={});var MJ;((e)=>{e.GenericUnknown="net.fnlb.errors.generic.unknown",e.GenericInternalError="net.fnlb.errors.generic.internal_error",e.GenericValidationFailed="net.fnlb.errors.generic.validation_failed",e.GenericParseFailed="net.fnlb.errors.generic.parse_failed",e.GenericNotFound="net.fnlb.errors.generic.not_found",e.GenericAlreadyExists="net.fnlb.errors.generic.already_exists",e.CommonInvalidRequest="net.fnlb.errors.common.invalid_request",e.CommonUnableToProcessRequest="net.fnlb.errors.common.unable_to_process_request",e.CommonInvalidFieldsLength="net.fnlb.errors.common.invalid_body_fields_length",e.CommonRateLimitExceeded="net.fnlb.errors.common.rate_limit_exceeded",e.CommonLimitExceeded="net.fnlb.errors.common.limit_exceeded",e.CommonUnableToSaveToDatabase="net.fnlb.errors.common.unable_to_save_to_database",e.CommonUpdateRequired="net.fnlb.errors.common.update_required",e.CommonMaintenanceMode="net.fnlb.errors.common.maintenance_mode",e.AuthInvalidToken="net.fnlb.errors.auth.invalid_token",e.AuthInvalidAPIToken="net.fnlb.errors.auth.invalid_api_token",e.AuthManagedAuthRefused="net.fnlb.errors.auth.managed_auth_refused",e.AuthInvalidCaptchaToken="net.fnlb.errors.auth.invalid_captcha_token",e.AuthUnauthorized="net.fnlb.errors.auth.unauthorized",e.AuthForbidden="net.fnlb.errors.auth.forbidden",e.AuthUserBanned="net.fnlb.errors.auth.user_banned",e.Oauth2InvalidCode="net.fnlb.errors.oauth2.invalid_code",e.Oauth2InvalidScope="net.fnlb.errors.oauth2.invalid_scope",e.Oauth2TokenInvalid="net.fnlb.errors.oauth2.token_invalid",e.Oauth2UnableToFetchUser="net.fnlb.errors.oauth2.unable_to_fetch_user",e.Oauth2UnableToFetchConnections="net.fnlb.errors.oauth2.unable_to_fetch_connections",e.Oauth2UserWithoutConnection="net.fnlb.errors.oauth2.user_without_connection",e.Oauth2ConnectionNotVerified="net.fnlb.errors.oauth2.connection_not_verified",e.ReleaseNotFound="net.fnlb.errors.release.no_release_found",e.ReleaseVersionAlreadyExists="net.fnlb.errors.release.version_already_exists",e.ReleaseHashMismatch="net.fnlb.errors.release.hash_mismatch",e.MfaNotEnabled="net.fnlb.errors.mfa.not_enabled",e.MfaAlreadyEnabled="net.fnlb.errors.mfa.already_enabled",e.MfaChallengeExpired="net.fnlb.errors.mfa.challenge_expired",e.MfaSetupExpired="net.fnlb.errors.mfa.setup_expired"})(MJ||={});var xJ;((e)=>{e.LoginInvalidCredentials="net.fnlb.errors.login.invalid_credentials",e.LoginInvalidEmail="net.fnlb.errors.login.invalid_email",e.LoginInvalidOrUsedEmail="net.fnlb.errors.login.invalid_or_used_email",e.AuthPasswordConfirmationInvalid="net.fnlb.errors.auth.invalid_password_confirmation",e.MfaInvalidCode="net.fnlb.errors.mfa.invalid_code",e.MfaRequired="net.fnlb.errors.mfa.required"})(xJ||={});var Ja={...MJ,...xJ},nOe;((e)=>{e.Username="username",e.Email="email",e.Password="password",e.Shared="shared",e.MfaCode="mfaCode"})(nOe||={});var sOe;((e)=>{e.General="general",e.Input="input"})(sOe||={});var iOe;((e)=>{e[e.Disabled=1]="Disabled",e[e.Verified=2]="Verified",e[e.VerificationPending=4]="VerificationPending",e[e.PublicClient=8]="PublicClient"})(iOe||={});var oOe;((e)=>{e[e.Disabled=1]="Disabled",e[e.Public=2]="Public",e[e.InvalidAuth=4]="InvalidAuth",e[e.Prepared=8]="Prepared"})(oOe||={});var uOe;((e)=>{e[e.Disabled=1]="Disabled",e[e.Managed=2]="Managed"})(uOe||={});var aOe;((e)=>e[e.NotWearable=1]="NotWearable")(aOe||={});var cOe;((e)=>{e[e.identify=1]="identify",e[e.email=2]="email",e[e.connections=4]="connections",e[e["bots.read"]=8]="bots.read",e[e["bots.write"]=16]="bots.write",e[e["bots.run"]=32]="bots.run",e[e["categories.read"]=64]="categories.read",e[e["categories.write"]=128]="categories.write",e[e["commands.run"]=256]="commands.run",e[e.openid=512]="openid",e[e.profile=1024]="profile"})(cOe||={});var lOe;((e)=>{e[e.Ready=1]="Ready",e[e.Leader=2]="Leader",e[e.SittingOut=4]="SittingOut",e[e.Playing=8]="Playing"})(lOe||={});var hOe;((e)=>{e[e.Disabled=1]="Disabled",e[e.IgnoreSelf=2]="IgnoreSelf",e[e.IgnoreBots=4]="IgnoreBots",e[e.IgnoreLeader=8]="IgnoreLeader",e[e.IgnoreOwners=16]="IgnoreOwners",e[e.IgnoreAdmins=32]="IgnoreAdmins",e[e.IgnoreWhitelistUsers=64]="IgnoreWhitelistUsers",e[e.IgnoreBlacklistUsers=128]="IgnoreBlacklistUsers",e[e.IgnoreExcludedAutoAddFriends=256]="IgnoreExcludedAutoAddFriends",e[e.IgnoreFriends=512]="IgnoreFriends",e[e.IgnoreOtherBots=1024]="IgnoreOtherBots",e[e.IgnorePartyMembers=2048]="IgnorePartyMembers"})(hOe||={});var oa;((e)=>{e[e.Staff=1]="Staff",e[e.Admin=2]="Admin",e[e.Vip=4]="Vip",e[e.Verified=8]="Verified",e[e.Banned=16]="Banned",e[e.Tester=32]="Tester",e[e.Developer=64]="Developer",e[e.Partner=128]="Partner",e[e.Management=256]="Management",e[e.Moderation=512]="Moderation",e[e.Support=1024]="Support",e[e.IncreasedLimits=2048]="IncreasedLimits",e[e.Disabled=4096]="Disabled"})(oa||={});var fO;((i)=>{i[i.InternalError=1]="InternalError";i[i.BadValue=2]="BadValue";i[i.NoSuchKey=4]="NoSuchKey";i[i.KeyNotFound=211]="KeyNotFound";i[i.DuplicateKey=11000]="DuplicateKey"})(fO||={});class BJ{static handleError(e,t){if(!e)return!1;switch(e.code){case 11000:return t.sendError(400,Ja.GenericAlreadyExists);case 2:return t.sendError(500,Ja.CommonUnableToSaveToDatabase);case 211:return t.sendError(500,Ja.CommonUnableToSaveToDatabase);case 4:return t.sendError(500,Ja.CommonUnableToSaveToDatabase);case 1:return console.error("Internal MongoDB error:",e),t.sendError(500,Ja.CommonUnableToSaveToDatabase);default:return console.error("Unhandled MongoError code:",e.code,e),t.sendError(500,Ja.CommonUnableToSaveToDatabase)}}}var rd=Do(Co(),1);var fOe=["password","token","apiToken","applications","mfa","deviceAuth","secret"];class Ms{static transformSchemaToJSON(e){let t=new Set(e);return(r,n)=>{if(n._id!==void 0)n.id=n._id;delete n._id,delete n.__v;for(let s of Object.keys(n))if(!t.has(s))delete n[s];for(let s of fOe)delete n[s]}}}var dOe=8,FJ=new rd.Schema({owner:{type:rd.Schema.Types.ObjectId,ref:"user",required:!0,index:!0},secret:{type:String,required:function(){return!((this.flags??0)&dOe)},trim:!0},name:{type:String,required:!0,trim:!0},icon:{type:String,required:!1,trim:!0,default:void 0},description:{type:String,required:!1,trim:!0,default:void 0},scopes:{type:Number,required:!1,default:void 0},redirectUris:{type:[String],required:!1,trim:!0,default:void 0},tosUri:{type:String,required:!1,trim:!0,default:void 0},policyUri:{type:String,required:!1,trim:!0,default:void 0},installUri:{type:String,required:!1,trim:!0,default:void 0},flags:{type:Number,required:!1,default:void 0}});FJ.set("toJSON",{transform:Ms.transformSchemaToJSON(["id","owner","name","icon","description","scopes","redirectUris","tosUri","policyUri","installUri","flags"])});var pOe=rd.model("application",FJ);var G1=Do(Co(),1);var PJ=new G1.Schema({owner:{type:G1.Schema.Types.ObjectId,ref:"user",required:!0,index:!0},parent:{type:G1.Schema.Types.ObjectId,ref:"category",required:!1,index:!0,sparse:!0},nickname:{type:String,required:!0,trim:!0},flags:{type:Number,required:!1},email:{type:String,required:!1,trim:!0},deviceAuth:{required:!0,type:{accountId:{type:String,required:!0,unique:!0,lowercase:!0,trim:!0},deviceId:{type:String,required:!0,lowercase:!0,trim:!0},secret:{type:String,required:!0,trim:!0}},_id:!1},mmsBannedUntil:{type:Number,required:!1}});PJ.set("toJSON",{transform:Ms.transformSchemaToJSON(["id","owner","parent","nickname","flags","email","mmsBannedUntil"])});var mOe=G1.model("bot",PJ);var sd=Do(Co(),1);function nd(e){return Object.values(e).filter((t)=>typeof t==="number")}var IJ=new sd.Schema({owner:{type:sd.Schema.Types.ObjectId,ref:"user",required:!0,index:!0},name:{type:String,required:!0,trim:!0},flags:{type:Number,required:!1},managed:{type:Boolean,required:!1,index:!0,sparse:!0,default:void 0},config:{replyLangs:{type:[String],enum:Object.values(fg),default:void 0},searchLangs:{type:[String],enum:Object.values(fg),default:void 0},platform:{type:[String],enum:Object.values(oO),default:void 0},privacy:{type:Number,enum:nd(uO),default:void 0},prefixes:{type:[String],default:void 0},statusType:{type:Number,enum:nd(aO),default:void 0},statusText:{type:[String],default:void 0},statusInterval:{type:Number,default:void 0},level:{type:[Number],default:void 0},bpLevel:{type:[Number],default:void 0},extraOwners:{type:[{id:String,name:String,_id:!1}],default:void 0},admins:{type:[{id:String,name:String,_id:!1}],default:void 0},whitelistUsers:{type:[{id:String,name:String,_id:!1}],default:void 0},blacklistUsers:{type:[{id:String,name:String,_id:!1}],default:void 0},excludedAutoAddFriends:{type:[{id:String,name:String,_id:!1}],default:void 0},otherBots:{type:[{id:String,name:String,_id:!1}],default:void 0},inviteTimeout:{type:Number,default:void 0},maxBotsPerLobby:{type:Number,default:void 0},maxBotsPerLobbyWithOwner:{type:Number,default:void 0},maxBotsPerLobbyWithAdmin:{type:Number,default:void 0},maxBotsPerLobbyWithWhitelistUser:{type:Number,default:void 0},allowMatchmaking:{type:Boolean,default:void 0},leaveAfterMatchmaking:{type:Boolean,default:void 0},disableMatchmakingChecks:{type:Boolean,default:void 0},disablePlaylistChecks:{type:Boolean,default:void 0},disableJoinMessages:{type:Boolean,default:void 0},disableAutomaticMessages:{type:Boolean,default:void 0},acceptFriendRequests:{type:Boolean,default:void 0},sendFriendRequestOnJoinParty:{type:Boolean,default:void 0},sendFriendRequestOnMemberJoinParty:{type:Boolean,default:void 0},runCommandsWithoutPrefix:{type:Boolean,default:void 0},setCosmeticsWithoutCommands:{type:Boolean,default:void 0},setCosmeticsWithPrefix:{type:Boolean,default:void 0},acceptInvites:{type:Boolean,default:void 0},startBannedBots:{type:Boolean,default:void 0},triggers:{type:[{name:{type:String,required:!0},flags:{type:Number,required:!1,default:void 0},type:{type:Number,required:!0,enum:nd(W1)},event:{type:Number,enum:nd(cO),required(){return this.type===W1.Event},default:void 0},command:{type:String,required(){return this.type===W1.CustomCommand},default:void 0},interval:{type:String,required(){return this.type===W1.Scheduled},default:void 0},actions:{type:[{id:{type:String,required:!1},parent:{type:String,required:!1},type:{type:Number,enum:nd(z1),required:!0},command:{type:String,required(){return this.type===z1.RunCommand}},function:{type:String,required(){return this.type===z1.RunFunction}},statement:{type:String,required(){return this.type===z1.ControlFlow}},args:{type:[String],default:void 0,required:!0},condition:{type:String,default:void 0,required:!1},_id:!1}],required:!0,default:void 0,_id:!1},_id:!1}],default:void 0},onlyOwnerCommands:{type:[String],default:void 0},onlyAdminCommands:{type:[String],default:void 0},onlyWhitelistUsersCommands:{type:[String],default:void 0},onlyFriendsCommands:{type:[String],default:void 0},onlyPartyMembersCommands:{type:[String],default:void 0},onlyWhisperCommands:{type:[String],default:void 0},startOutfit:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},startBackpack:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},startPickaxe:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},startShoes:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},startSidekick:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},startBanner:{type:[{id:String,_id:!1}],default:void 0},startBannerColor:{type:[{id:String,_id:!1}],default:void 0},joinOutfit:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},joinBackpack:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},joinPickaxe:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},joinEmote:{type:[{id:String,_id:!1}],default:void 0},joinShoes:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},joinSidekick:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},joinBanner:{type:[{id:String,_id:!1}],default:void 0},joinBannerColor:{type:[{id:String,_id:!1}],default:void 0},memberJoinOutfit:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},memberJoinBackpack:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},memberJoinPickaxe:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},memberJoinEmote:{type:[{id:String,_id:!1}],default:void 0},memberJoinShoes:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},memberJoinSidekick:{type:[{id:String,variants:[Number],_id:!1}],default:void 0},memberJoinBanner:{type:[{id:String,_id:!1}],default:void 0},memberJoinBannerColor:{type:[{id:String,_id:!1}],default:void 0}}});IJ.set("toJSON",{transform:Ms.transformSchemaToJSON(["id","owner","name","flags","managed","config"])});var yOe=sd.model("category",IJ);var H1=Do(Co(),1),dO=new H1.Schema({listing:{type:H1.Schema.Types.ObjectId,ref:"communityListing",required:!0},user:{type:H1.Schema.Types.ObjectId,ref:"user",required:!0}});dO.index({listing:1,user:1},{unique:!0});dO.index({user:1,listing:1});var gOe=H1.model("communityListingLike",dO);var K1=Do(Co(),1);var pO=new K1.Schema({kind:{type:String,required:!0,enum:Object.values(lO),index:!0},title:{type:String,required:!0,trim:!0,maxlength:80},description:{type:String,required:!1,trim:!0,maxlength:2000},tags:{type:[String],default:void 0},author:{type:K1.Schema.Types.ObjectId,ref:"user",required:!0,index:!0},status:{type:String,required:!0,enum:Object.values(hO),index:!0},stats:{type:{installs:{type:Number,required:!1},likes:{type:Number,required:!1,default:0,min:0}},_id:!1,required:!1,default:void 0},liveRef:{type:{categoryId:{type:String,required:!0,trim:!0}},_id:!1,required:!1,default:void 0},payload:{type:K1.Schema.Types.Mixed,required:!1,default:void 0}});pO.index({status:1,kind:1});pO.set("toJSON",{transform:Ms.transformSchemaToJSON(["id","kind","title","description","tags","author","status","stats","liveRef","payload"])});var _Oe=K1.model("communityListing",pO);var od=Do(Co(),1);var id={id:{type:String,required:!0},variants:{type:[Number],default:void 0},_id:!1},EOe={id:{type:String,required:!0},_id:!1},$J=new od.Schema({owner:{type:od.Schema.Types.ObjectId,ref:"user",required:!0,index:!0},name:{type:String,required:!0,trim:!0,maxlength:64},outfit:{type:id,default:void 0},pickaxe:{type:id,default:void 0},backpack:{type:id,default:void 0},emote:{type:EOe,default:void 0},shoes:{type:id,default:void 0},sidekick:{type:id,default:void 0}});$J.set("toJSON",{transform:Ms.transformSchemaToJSON(["id","owner","name","outfit","pickaxe","backpack","emote","shoes","sidekick"])});var AOe=od.model("preset",$J);var ad=Do(Co(),1);class Y1{bitfield;constructor(e){this.bitfield=e??0}static from(...e){let t=0;for(let r of e)t|=r;return new Y1(t)}has(e){return(this.bitfield&e)!==0}hasAll(...e){let t=0;for(let r of e)t|=r;return(this.bitfield&t)===t}hasAny(...e){let t=0;for(let r of e)t|=r;return(this.bitfield&t)!==0}add(e){return this.bitfield|=e,this}remove(e){return this.bitfield&=~e,this}toNumber(){return this.bitfield}}var SOe=86400000;function mO(e,t,r){let n=new Y1(e),i=n.has(oa.Vip)&&!t;if(n.add(oa.Vip),r==null||i)return{update:{$set:{flags:n.toNumber()},$unset:{vipExpiresAt:1}},vipExpiresAt:null,permanent:!0};let a=new Date(Date.now()+r*SOe);return{update:{$set:{flags:n.toNumber(),vipExpiresAt:a}},vipExpiresAt:a,permanent:!1}}function dg(e){let t=new Y1(e);return t.remove(oa.Vip),{$set:{flags:t.toNumber()},$unset:{vipExpiresAt:1}}}function yO(e,t,r=Date.now()){if(!t)return"none";if(!new Y1(e).has(oa.Vip))return"cleanup";if(new Date(t).getTime()>r)return"none";return"expire"}var OOe=/^[a-f\d]{24}$/i;function ud(e){return typeof e==="string"&&OOe.test(e)}var gO=new ad.Schema({token:{type:String,required:!0,unique:!1},username:{type:String,required:!0,trim:!0},avatar:{type:String,required:!1,trim:!0,maxlength:128},email:{type:String,index:!0,required:!0,unique:!0,trim:!0},recoveryEmail:{type:String,required:!1,trim:!0},password:{type:String,required:!0},apiToken:{type:String,required:!0,index:!1,unique:!1,trim:!0},flags:{type:Number,required:!1},vipExpiresAt:{type:Date,required:!1,index:!0},connections:{discord:{id:{type:String,index:!0,unique:!0,sparse:!0},username:{type:String},verified:{type:Boolean,required:!1}},google:{id:{type:String,index:!0,unique:!0,sparse:!0},username:{type:String},verified:{type:Boolean,required:!1}},epic:{id:{type:String,index:!0,unique:!0,sparse:!0},username:{type:String},verified:{type:Boolean,required:!1}}},applications:{type:[{_id:!1,id:{type:ad.Schema.Types.ObjectId,ref:"application",required:!0,trim:!0},token:{type:String,required:!0,trim:!0},scopes:{type:Number,required:!0}}],default:void 0},mfa:{type:{totp:{enabled:{type:Boolean,required:!1},secret:{type:String,required:!1}},recoveryCodes:{type:[{_id:!1,hash:{type:String,required:!0},usedAt:{type:Date,required:!1}}],default:void 0}},default:void 0}},{statics:{async verifyPassword(e,t){return Bun.password.verify(e,t)},async expireVipIfNeeded(e){let t=yO(e.flags,e.vipExpiresAt);if(t==="none")return!1;let r=dg(e.flags);return e.flags=r.$set.flags,e.vipExpiresAt=void 0,await this.updateOne({_id:e._id},r).exec(),t==="expire"},async findByToken(e,t){if(!ud(e))return null;let r=await this.findById(e);if(!r?.token||r.token!==t)return null;return await this.expireVipIfNeeded(r),r},async findByAPIToken(e,t){if(!ud(e))return null;let r=await this.findById(e);if(!r?.apiToken||r.apiToken!==t)return null;return await this.expireVipIfNeeded(r),r},async findByAccessToken(e,t){if(!ud(e))return null;let r=await this.findById(e),n=r?.applications?.find((s)=>s.token===t);if(!n||!r)return null;return await this.expireVipIfNeeded(r),{user:r,app:n}},async grantVip(e,t){if(!ud(e))return null;let r=await this.findById(e).exec();if(!r)return null;await this.expireVipIfNeeded(r);let n=typeof t==="number"&&Number.isFinite(t)?Math.max(1,Math.floor(t)):null,{update:s,vipExpiresAt:i,permanent:o}=mO(r.flags,r.vipExpiresAt,n),a=await this.updateOne({_id:r._id},s).exec();if(a.matchedCount===0)return null;return r.flags=s.$set.flags,r.vipExpiresAt=i??void 0,{ok:!0,permanent:o,vipExpiresAt:i,modified:a.modifiedCount>0,user:r}},async revokeVip(e){if(!ud(e))return null;let t=await this.findById(e).exec();if(!t)return null;let r=dg(t.flags),n=await this.updateOne({_id:t._id},r).exec();if(n.matchedCount===0)return null;return t.flags=r.$set.flags,t.vipExpiresAt=void 0,{ok:!0,modified:n.modifiedCount>0,user:t}},async expireDueVips(e=100){let t=new Date,r=await this.find({flags:{$bitsAnySet:oa.Vip},vipExpiresAt:{$lte:t}}).limit(e).exec(),n=[];for(let s of r){if(!await this.revokeVip(s.id))continue;n.push({id:s.id,username:s.username,email:s.email,discordId:s.connections?.discord?.id})}return n}}});gO.pre("save",async function(e){if(!this.isModified("password"))return e();try{return this.password=await Bun.password.hash(this.password,{algorithm:process.env.SAVE_ACCOUNT_ALGORITHM||"argon2id",timeCost:parseInt(process.env.SAVE_ACCOUNT_TIME_COST||"3"),cost:parseInt(process.env.SAVE_ACCOUNT_ALGORITHM_COST||"12")}),e()}catch(t){return e(t)}});gO.set("toJSON",{transform:Ms.transformSchemaToJSON(["id","username","avatar","email","flags","vipExpiresAt","connections"])});var COe=ad.model("user",gO);var uBe=wOe.connection;export{pOe as ApplicationModel,mOe as BotModel,yOe as CategoryModel,gOe as CommunityListingLikeModel,_Oe as CommunityListingModel,TJ as DatabaseClient,BJ as DatabaseErrorHandler,fO as DatabaseErrors,AOe as PresetModel,COe as UserModel,dg as buildVipClearUpdate,mO as buildVipGrantUpdate,uBe as connection,yO as shouldExpireVip};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fnlb-project/database",
3
3
  "description": "FNLB Database Client",
4
- "version": "1.0.83",
4
+ "version": "1.0.84",
5
5
  "private": false,
6
6
  "type": "module",
7
7
  "main": "dist/index.js",