summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2021-06-28 18:43:22 +0200
committerFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2021-06-28 18:43:22 +0200
commit229e741bfdd4a6d8b7b2617eec5e88c626d29e00 (patch)
tree3d85df3f10054678108826993da596b1315093e5 /src
parent1.3.20 (diff)
downloadserver-229e741bfdd4a6d8b7b2617eec5e88c626d29e00.tar.xz
:sparkles: Rate Limit model
Diffstat (limited to 'src')
-rw-r--r--src/models/RateLimit.ts26
-rw-r--r--src/util/Database.ts28
2 files changed, 43 insertions, 11 deletions
diff --git a/src/models/RateLimit.ts b/src/models/RateLimit.ts
new file mode 100644
index 00000000..7e4ca3cc
--- /dev/null
+++ b/src/models/RateLimit.ts
@@ -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");
diff --git a/src/util/Database.ts b/src/util/Database.ts
index 1b77629f..0732cb4e 100644
--- a/src/util/Database.ts
+++ b/src/util/Database.ts
@@ -46,6 +46,7 @@ export interface MongooseCache {
 export class MongooseCache extends EventEmitter {
 	public stream: ChangeStream;
 	public data: any;
+	public initalizing?: Promise<void>;
 
 	constructor(
 		public collection: Collection,
@@ -59,19 +60,24 @@ export class MongooseCache extends EventEmitter {
 		if (this.opts.array == null) this.opts.array = true;
 	}
 
-	init = async () => {
-		// @ts-ignore
-		this.stream = this.collection.watch(this.pipeline, { fullDocument: "updateLookup" });
+	init = () => {
+		if (this.initalizing) return this.initalizing;
+		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("close", this.destroy);
-		this.stream.on("error", console.error);
+			this.stream.on("change", this.change);
+			this.stream.on("close", this.destroy);
+			this.stream.on("error", console.error);
 
-		if (!this.opts.onlyEvents) {
-			const arr = await this.collection.aggregate(this.pipeline).toArray();
-			if (this.opts.array) this.data = arr || [];
-			else this.data = arr?.[0];
-		}
+			if (!this.opts.onlyEvents) {
+				const arr = await this.collection.aggregate(this.pipeline).toArray();
+				if (this.opts.array) this.data = arr || [];
+				else this.data = arr?.[0];
+			}
+			resolve();
+		});
+		return this.initalizing;
 	};
 
 	changeStream = (pipeline: any) => {