Rate Limit model

This commit is contained in:
Flam3rboy 2021-06-28 18:43:22 +02:00
parent 15de8b3563
commit 229e741bfd
2 changed files with 43 additions and 11 deletions

26
src/models/RateLimit.ts Normal file
View File

@ -0,0 +1,26 @@
import { Schema, Document, Types } from "mongoose";
import db from "../util/Database";
import { ChannelModel } from "./Channel";
import { UserModel } from "./User";
import { GuildModel } from "./Guild";
export interface Bucket {
id: "global" | string; // channel_239842397 | guild_238927349823 | webhook_238923423498
user: string;
hits: number;
blocked: boolean;
}
export interface BucketDocument extends Bucket, Document {
id: string;
}
export const BucketSchema = new Schema({
id: { type: String, required: true },
user_id: { type: String, required: true }, // bot, user, oauth_application, webhook
hits: { type: Number, required: true }, // Number of times the user hit this bucket
blocked: { type: Boolean, required: true },
});
// @ts-ignore
export const BucketModel = db.model<BucketDocument>("Bucket", BucketSchema, "ratelimits");

View File

@ -46,6 +46,7 @@ export interface MongooseCache {
export class MongooseCache extends EventEmitter { export class MongooseCache extends EventEmitter {
public stream: ChangeStream; public stream: ChangeStream;
public data: any; public data: any;
public initalizing?: Promise<void>;
constructor( constructor(
public collection: Collection, public collection: Collection,
@ -59,19 +60,24 @@ export class MongooseCache extends EventEmitter {
if (this.opts.array == null) this.opts.array = true; if (this.opts.array == null) this.opts.array = true;
} }
init = async () => { init = () => {
// @ts-ignore if (this.initalizing) return this.initalizing;
this.stream = this.collection.watch(this.pipeline, { fullDocument: "updateLookup" }); this.initalizing = new Promise(async (resolve, reject) => {
// @ts-ignore
this.stream = this.collection.watch(this.pipeline, { fullDocument: "updateLookup" });
this.stream.on("change", this.change); this.stream.on("change", this.change);
this.stream.on("close", this.destroy); this.stream.on("close", this.destroy);
this.stream.on("error", console.error); this.stream.on("error", console.error);
if (!this.opts.onlyEvents) { if (!this.opts.onlyEvents) {
const arr = await this.collection.aggregate(this.pipeline).toArray(); const arr = await this.collection.aggregate(this.pipeline).toArray();
if (this.opts.array) this.data = arr || []; if (this.opts.array) this.data = arr || [];
else this.data = arr?.[0]; else this.data = arr?.[0];
} }
resolve();
});
return this.initalizing;
}; };
changeStream = (pipeline: any) => { changeStream = (pipeline: any) => {