summary refs log tree commit diff
path: root/src/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/util')
-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
4 files changed, 120 insertions, 4 deletions
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; +}