mirror of
https://github.com/spacebarchat/server.git
synced 2026-10-23 00:03:05 +00:00
Merge branch 'main' of https://github.com/fosscord/fosscord-server-util
This commit is contained in:
commit
f01fe1ba3a
114 files changed
+723
-3545
No files matched your search
+47
-29
@@ -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
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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";
|
||||
Reference in new issue
Block a user