This commit is contained in:
xnacly committed 2021-04-08 15:56:11 +02:00
commit f01fe1ba3a
114 files changed
+723 -3545

No files matched your search

+47 -29
View File
@@ -1,13 +1,26 @@
import "./MongoBigInt";
import mongoose, { Collection, Connection } from "mongoose";
import mongoose, { Collection, Connection, LeanDocument } from "mongoose";
import { ChangeStream, ChangeEvent, Long } from "mongodb";
import EventEmitter from "events";
import { Document } from "mongoose";
const uri = process.env.MONGO_URL || "mongodb://localhost:27017/fosscord?readPreference=secondaryPreferred";
const connection = mongoose.createConnection(uri, { autoIndex: true });
console.log(`[DB] connect: ${uri}`);
const connection = mongoose.createConnection(uri, { autoIndex: true, useNewUrlParser: true, useUnifiedTopology: true });
export default <Connection>connection;
function transform<T>(document: T) {
// @ts-ignore
return document.toObject({ virtuals: true });
}
export function toObject<T>(document: T): LeanDocument<T> {
// @ts-ignore
return Array.isArray(document) ? document.map((x) => transform<T>(x)) : transform(document);
}
export interface MongooseCache {
on(event: "delete", listener: (id: string) => void): this;
on(event: "change", listener: (data: any) => void): this;
@@ -29,7 +42,8 @@ export class MongooseCache extends EventEmitter {
super();
}
async init() {
init = async () => {
// @ts-ignore
this.stream = this.collection.watch(this.pipeline, { fullDocument: "updateLookup" });
this.stream.on("change", this.change);
@@ -40,9 +54,9 @@ export class MongooseCache extends EventEmitter {
const arr = await this.collection.aggregate(this.pipeline).toArray();
this.data = arr.length ? arr[0] : arr;
}
}
};
convertResult(obj: any) {
convertResult = (obj: any) => {
if (obj instanceof Long) return BigInt(obj.toString());
if (typeof obj === "object") {
Object.keys(obj).forEach((key) => {
@@ -51,40 +65,44 @@ export class MongooseCache extends EventEmitter {
}
return obj;
}
};
change = (doc: ChangeEvent) => {
// @ts-ignore
if (doc.fullDocument) {
try {
// @ts-ignore
if (!this.opts.onlyEvents) this.data = doc.fullDocument;
}
if (doc.fullDocument) {
// @ts-ignore
if (!this.opts.onlyEvents) this.data = doc.fullDocument;
}
switch (doc.operationType) {
case "dropDatabase":
return this.destroy();
case "drop":
return this.destroy();
case "delete":
return this.emit("delete", doc.documentKey._id.toHexString());
case "insert":
return this.emit("insert", doc.fullDocument);
case "update":
case "replace":
return this.emit("change", doc.fullDocument);
case "invalidate":
return this.destroy();
default:
return;
switch (doc.operationType) {
case "dropDatabase":
return this.destroy();
case "drop":
return this.destroy();
case "delete":
return this.emit("delete", doc.documentKey._id.toHexString());
case "insert":
return this.emit("insert", doc.fullDocument);
case "update":
case "replace":
return this.emit("change", doc.fullDocument);
case "invalidate":
return this.destroy();
default:
return;
}
} catch (error) {
this.emit("error", error);
}
};
destroy() {
this.stream.off("change", this.change);
destroy = () => {
this.stream?.off("change", this.change);
this.emit("close");
if (this.stream.isClosed()) return;
return this.stream.close();
}
};
}
+12 -10
View File
@@ -131,7 +131,7 @@ export class Permissions extends BitField {
guild,
channel,
}: {
user: { id: bigint; roles: bigint[] };
user: { id: string; roles: string[] };
guild: { roles: Role[] };
channel?: {
overwrites?: ChannelPermissionOverwrite[];
@@ -154,22 +154,24 @@ export class Permissions extends BitField {
}
export async function getPermission(
user_id: bigint,
guild_id: bigint,
channel_id?: bigint,
cache?: { channel?: ChannelDocument | null; member?: MemberDocument | null }
user_id: string,
guild_id: string,
channel_id?: string,
cache?: { channel?: ChannelDocument | null; member?: MemberDocument | null; guild?: GuildDocument | null }
) {
var { channel, member } = cache || {};
var { channel, member, guild } = cache || {};
const guild = await GuildModel.findOne({ id: guild_id }, { owner_id: true }).exec();
if (!guild) guild = await GuildModel.findOne({ id: guild_id }, { owner_id: true }).exec();
if (!guild) throw new Error("Guild not found");
if (guild.owner_id === user_id) return new Permissions(Permissions.FLAGS.ADMINISTRATOR);
member = await MemberModel.findOne({ guild_id, id: user_id }, "roles").exec();
if (!member) member = await MemberModel.findOne({ guild_id, id: user_id }, "roles").exec();
if (!member) throw new Error("Member not found");
var roles = await RoleModel.find({ guild_id, id: { $in: member.roles } }).exec();
if (channel_id) {
var roles = await RoleModel.find({ guild_id, id: { $in: member.roles } })
.lean()
.exec();
if (channel_id && !channel) {
channel = await ChannelModel.findOne({ id: channel_id }, "permission_overwrites").exec();
}
+1 -1
View File
@@ -87,7 +87,7 @@ export class Snowflake {
var worker = Snowflake.workerId << 17n;
var process = Snowflake.processId << 12n;
var increment = Snowflake.INCREMENT++;
return time | worker | process | increment;
return (time | worker | process | increment).toString();
}
/**
+7
View File
@@ -0,0 +1,7 @@
export * from "./String";
export * from "./BitField";
export * from "./Intents";
export * from "./MessageFlags";
export * from "./Permissions";
export * from "./Snowflake";
export * from "./UserFlags";