diff --git a/package-lock.json b/package-lock.json
index 6dd6eaba..e8d36370 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1363,7 +1363,7 @@
},
"node_modules/fosscord-server-util": {
"version": "1.0.0",
- "resolved": "git+ssh://git@github.com/fosscord/fosscord-server-util.git#0ab57bb6cd92dbd8c90f716645139d691de7493d",
+ "resolved": "git+ssh://git@github.com/fosscord/fosscord-server-util.git#c058020a7ca033077755594e0cb0a0658d10596f",
"license": "ISC",
"dependencies": {
"jsonwebtoken": "^8.5.1",
@@ -5077,7 +5077,7 @@
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
},
"fosscord-server-util": {
- "version": "git+ssh://git@github.com/fosscord/fosscord-server-util.git#0ab57bb6cd92dbd8c90f716645139d691de7493d",
+ "version": "git+ssh://git@github.com/fosscord/fosscord-server-util.git#c058020a7ca033077755594e0cb0a0658d10596f",
"from": "fosscord-server-util@github:fosscord/fosscord-server-util",
"requires": {
"jsonwebtoken": "^8.5.1",
diff --git a/src/Server.ts b/src/Server.ts
index 6861cb1c..0c92e1b7 100644
--- a/src/Server.ts
+++ b/src/Server.ts
@@ -4,7 +4,7 @@ import { Connection } from "mongoose";
import { Server, ServerOptions } from "lambert-server";
import { Authentication, GlobalRateLimit } from "./middlewares/";
import Config from "./util/Config";
-import { db } from "./routes/api/v8/channels/#channelid/node_modules/fosscord-server-util";
+import { db } from "fosscord-server-util";
import i18next from "i18next";
import i18nextMiddleware, { I18next } from "i18next-http-middleware";
import i18nextBackend from "i18next-node-fs-backend";
diff --git a/src/middlewares/Authentication.ts b/src/middlewares/Authentication.ts
index 7869686d..e7650684 100644
--- a/src/middlewares/Authentication.ts
+++ b/src/middlewares/Authentication.ts
@@ -1,6 +1,6 @@
import { NextFunction, Request, Response } from "express";
import { HTTPError } from "lambert-server";
-import { checkToken } from "../routes/api/v8/channels/#channelid/node_modules/fosscord-server-util";
+import { checkToken } from "fosscord-server-util";
export const NO_AUTHORIZATION_ROUTES = ["/api/v8/auth/login", "/api/v8/auth/register"];
diff --git a/src/routes/api/v8/auth/login.ts b/src/routes/api/v8/auth/login.ts
index 68367120..acdac1ce 100644
--- a/src/routes/api/v8/auth/login.ts
+++ b/src/routes/api/v8/auth/login.ts
@@ -2,7 +2,7 @@ import { Request, Response, Router } from "express";
import { check, FieldErrors, Length } from "../../../../util/instanceOf";
import bcrypt from "bcrypt";
import jwt from "jsonwebtoken";
-import { User, UserModel } from "../channels/#channelid/node_modules/fosscord-server-util";
+import { User, UserModel } from "fosscord-server-util";
import Config from "../../../../util/Config";
import { adjustEmail } from "./register";
diff --git a/src/routes/api/v8/auth/register.ts b/src/routes/api/v8/auth/register.ts
index c73210c5..1205c462 100644
--- a/src/routes/api/v8/auth/register.ts
+++ b/src/routes/api/v8/auth/register.ts
@@ -1,6 +1,6 @@
import { Request, Response, Router } from "express";
import Config from "../../../../util/Config";
-import { trimSpecial, User, Snowflake, UserModel } from "../channels/#channelid/node_modules/fosscord-server-util";
+import { trimSpecial, User, Snowflake, UserModel } from "fosscord-server-util";
import bcrypt from "bcrypt";
import { check, Email, EMAIL_REGEX, FieldErrors, Length } from "../../../../util/instanceOf";
import "missing-native-js-functions";
diff --git a/src/routes/api/v8/users/@me/guilds.ts b/src/routes/api/v8/users/@me/guilds.ts
index e205f6ec..0021d911 100644
--- a/src/routes/api/v8/users/@me/guilds.ts
+++ b/src/routes/api/v8/users/@me/guilds.ts
@@ -1,13 +1,8 @@
import { Router, Request, Response } from "express";
-import {
- GuildModel,
- MemberModel,
- UserModel,
- GuildDeleteEvent,
- GuildMemberRemoveEvent,
-} from "../../channels/#channelid/node_modules/fosscord-server-util";
+import { GuildModel, MemberModel, UserModel, GuildDeleteEvent, GuildMemberRemoveEvent } from "fosscord-server-util";
import { HTTPError } from "lambert-server";
import { emitEvent } from "../../../../../util/Event";
+import { getPublicUser } from "../../../../../util/User";
const router: Router = Router();
@@ -20,16 +15,22 @@ router.get("/", async (req: Request, res: Response) => {
if (!user) throw new HTTPError("User not found", 404);
var guildIDs = user.guilds || [];
- var guildsss = await GuildModel.find({ id: { $in: guildIDs } }).exec();
- res.json(guildsss);
+ var guild = await GuildModel.find({ id: { $in: guildIDs } }).exec();
+ res.json(guild);
});
+// user send to leave a certain guild
router.delete("/:id", async (req: Request, res: Response) => {
const guildID = BigInt(req.params.id);
- if (await GuildModel.findOne({ id: guildID, owner_id: req.userid }).exec())
- throw new HTTPError("You can't leave your own guild", 400);
- var user = await UserModel.findOneAndUpdate({ id: req.userid }, { $pull: { guilds: guildID } }).exec();
+ const guild = await GuildModel.findOne({ id: guildID }).exec();
+
+ if (!guild) throw new HTTPError("Guild doesn't exist", 404);
+ if (guild.owner_id === req.userid) throw new HTTPError("You can't leave your own guild", 400);
+
await MemberModel.deleteOne({ id: req.userid, guild_id: guildID }).exec();
+ await UserModel.updateOne({ id: req.userid }, { $pull: { guilds: guildID } }).exec();
+ const user = await getPublicUser(req.userid);
+
await emitEvent({
event: "GUILD_DELETE",
data: {
diff --git a/src/test/test.ts b/src/test/test.ts
new file mode 100644
index 00000000..fd50ab9a
--- /dev/null
+++ b/src/test/test.ts
@@ -0,0 +1,8 @@
+import { getPermission } from "fosscord-server-util";
+
+async function main() {
+ const t = await getPermission(811642917432066048n, 812327318532915201n);
+ console.log(t);
+}
+
+main();
diff --git a/src/util/Config.ts b/src/util/Config.ts
index a2587dda..200ec1b2 100644
--- a/src/util/Config.ts
+++ b/src/util/Config.ts
@@ -1,4 +1,4 @@
-import { Config } from "../routes/api/v8/channels/#channelid/node_modules/fosscord-server-util";
+import { Config } from "fosscord-server-util";
import crypto from "crypto";
import fs from "fs";
diff --git a/src/util/Event.ts b/src/util/Event.ts
index 06553521..31838583 100644
--- a/src/util/Event.ts
+++ b/src/util/Event.ts
@@ -1,10 +1,10 @@
-import { Event, EventModel } from "../routes/api/v8/channels/#channelid/node_modules/fosscord-server-util";
+import { Event, EventModel } from "fosscord-server-util";
export async function emitEvent(payload: Omit<Event, "created_at">) {
- const emitEvent = {
+ const obj = {
created_at: new Date(), // in seconds
...payload,
};
- return await new EventModel(emitEvent).save();
+ return await new EventModel(obj).save();
}
diff --git a/src/util/Member.ts b/src/util/Member.ts
new file mode 100644
index 00000000..3ef2b903
--- /dev/null
+++ b/src/util/Member.ts
@@ -0,0 +1,98 @@
+import {
+ Guild,
+ GuildCreateEvent,
+ GuildDeleteEvent,
+ GuildMemberAddEvent,
+ GuildMemberRemoveEvent,
+ GuildModel,
+ MemberModel,
+ UserModel,
+} from "fosscord-server-util";
+import { HTTPError } from "lambert-server";
+import { emitEvent } from "./Event";
+import { getPublicUser } from "./User";
+
+export async function addMember(user_id: bigint, guild_id: bigint, cache?: { guild?: Guild }) {
+ const user = await getPublicUser(user_id);
+
+ const guild = cache?.guild || (await GuildModel.findOne({ id: guild_id }).exec());
+ const member = {
+ id: user_id,
+ guild_id: guild_id,
+ nick: undefined,
+ roles: [guild_id], // @everyone role
+ joined_at: Date.now(),
+ premium_since: undefined,
+ deaf: false,
+ mute: false,
+ pending: false,
+ };
+
+ return Promise.all([
+ new MemberModel({
+ ...member,
+ settings: {
+ channel_overrides: [],
+ message_notifications: 0,
+ mobile_push: true,
+ mute_config: null,
+ muted: false,
+ suppress_everyone: false,
+ suppress_roles: false,
+ version: 0,
+ },
+ }).save(),
+
+ UserModel.updateOne({ id: user_id }, { $push: { guilds: guild_id } }).exec(),
+ GuildModel.updateOne({ id: guild_id }, { $inc: { member_count: 1 } }).exec(),
+
+ emitEvent({
+ event: "GUILD_MEMBER_ADD",
+ data: {
+ ...member,
+ user,
+ guild_id: guild_id,
+ },
+ guild_id: guild_id,
+ } as GuildMemberAddEvent),
+ emitEvent({
+ event: "GUILD_CREATE",
+ data: guild,
+ guild_id: guild_id,
+ } as GuildCreateEvent),
+ ]);
+}
+
+export async function removeMember(user_id: bigint, guild_id: bigint) {
+ const user = await getPublicUser(user_id);
+
+ const guild = await GuildModel.findOne({ id: guild_id }, { owner_id: true }).exec();
+ if (!guild) throw new HTTPError("Guild not found", 404);
+ if (guild.owner_id === user_id) throw new Error("The owner cannot be removed of the guild");
+
+ // use promise all to execute all promises at the same time -> save time
+ return Promise.all([
+ MemberModel.deleteOne({
+ id: user_id,
+ guild_id: guild_id,
+ }).exec(),
+ UserModel.updateOne({ id: user.id }, { $pull: { guilds: guild_id } }).exec(),
+ GuildModel.updateOne({ id: guild_id }, { $inc: { member_count: -1 } }).exec(),
+
+ emitEvent({
+ event: "GUILD_DELETE",
+ data: {
+ id: guild_id,
+ },
+ user_id: user_id,
+ } as GuildDeleteEvent),
+ emitEvent({
+ event: "GUILD_MEMBER_REMOVE",
+ data: {
+ guild_id: guild_id,
+ user: user,
+ },
+ guild_id: guild_id,
+ } as GuildMemberRemoveEvent),
+ ]);
+}
diff --git a/src/util/User.ts b/src/util/User.ts
new file mode 100644
index 00000000..778730e2
--- /dev/null
+++ b/src/util/User.ts
@@ -0,0 +1,18 @@
+import { UserModel } from "fosscord-server-util";
+import { HTTPError } from "lambert-server";
+
+export async function getPublicUser(user_id: bigint, additional_fields?: any) {
+ const user = await UserModel.findOne(
+ { id: user_id },
+ {
+ username: true,
+ discriminator: true,
+ id: true,
+ public_flags: true,
+ avatar: true,
+ ...additional_fields,
+ }
+ ).exec();
+ if (!user) throw new HTTPError("User not found", 404);
+ return user;
+}
|