summary refs log tree commit diff
diff options
context:
space:
mode:
authorFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2021-02-22 15:51:53 +0100
committerFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2021-02-22 15:51:53 +0100
commita0cb65ccad9036c9f58de3ae800b20e99c8a430e (patch)
treea4fb59f57a50488be6d4b7aa1823bec646ec9613
parent:art: [Ban] use removeMember() + move ban in seperate file (diff)
downloadserver-a0cb65ccad9036c9f58de3ae800b20e99c8a430e.tar.xz
:art: restructure + add/remove Member() function
-rw-r--r--package-lock.json4
-rw-r--r--src/Server.ts2
-rw-r--r--src/middlewares/Authentication.ts2
-rw-r--r--src/routes/api/v8/auth/login.ts2
-rw-r--r--src/routes/api/v8/auth/register.ts2
-rw-r--r--src/routes/api/v8/users/@me/guilds.ts25
-rw-r--r--src/test/test.ts8
-rw-r--r--src/util/Config.ts2
-rw-r--r--src/util/Event.ts6
-rw-r--r--src/util/Member.ts98
-rw-r--r--src/util/User.ts18
11 files changed, 147 insertions, 22 deletions
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; +}