summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/routes/guilds/#guild_id/members.ts75
-rw-r--r--src/util/Member.ts80
2 files changed, 130 insertions, 25 deletions
diff --git a/src/routes/guilds/#guild_id/members.ts b/src/routes/guilds/#guild_id/members.ts

index 82c94aa1..69eb5bb6 100644 --- a/src/routes/guilds/#guild_id/members.ts +++ b/src/routes/guilds/#guild_id/members.ts
@@ -1,8 +1,8 @@ import { Request, Response, Router } from "express"; -import { GuildModel, MemberModel, UserModel, toObject, GuildMemberAddEvent } from "@fosscord/server-util"; +import { GuildModel, MemberModel, UserModel, toObject, GuildMemberAddEvent, getPermission } from "@fosscord/server-util"; import { HTTPError } from "lambert-server"; import { instanceOf, Length } from "../../../util/instanceOf"; -import { PublicMemberProjection, addMember, removeMember } from "../../../util/Member"; +import { PublicMemberProjection, addMember, removeMember, addRole, removeRole, changeNickname } from "../../../util/Member"; import { emitEvent } from "../../../util/Event"; import { getPublicUser } from "../../../util/User"; @@ -37,45 +37,70 @@ router.get("/", async (req: Request, res: Response) => { return res.json(toObject(members)); }); -router.get("/:member", async (req: Request, res: Response) => { - const { guild_id } = req.params; - const user_id = req.params.member; +router.get("/:member_id", async (req: Request, res: Response) => { + const { guild_id, member_id } = req.params; - const member = await MemberModel.findOne({ id: user_id, guild_id }).exec(); + const member = await MemberModel.findOne({ id: member_id, guild_id }).exec(); if (!member) throw new HTTPError("Member not found", 404); - return res.json(member); + return res.json(toObject(member)); }); -router.put("/:member", async (req: Request, res: Response) => { - const { guild_id } = req.params; - const guild = await GuildModel.findOne({ id: guild_id }).exec(); - if (!guild) throw new HTTPError("Guild not found", 404); +router.put("/:member_id", async (req: Request, res: Response) => { + const { guild_id, member_id } = req.params; - const user_id = req.params.member; + await addMember(member_id, guild_id); + res.sendStatus(204) +}); - const user = await UserModel.findOne({ id: user_id }).exec(); - if (!user) throw new HTTPError("User not found", 404); - await addMember(user_id, guild_id); +router.delete("/:member_id", async (req: Request, res: Response) => { + const { guild_id, member_id } = req.params; - // https://discord.com/developers/docs/resources/guild#add-guild-member + await removeMember(member_id, guild_id); + res.sendStatus(204) }); +router.delete("/:member_id/roles/:role_id", async (req: Request, res: Response) => { + const { guild_id, role_id, member_id } = req.params; -router.delete("/:member", async (req: Request, res: Response) => { - const { guild_id } = req.params; - const guild = await GuildModel.findOne({ id: guild_id }).exec(); - if (!guild) throw new HTTPError("Guild not found", 404); + const perms = await getPermission(member_id, guild_id); + perms.hasThrow("MANAGE_ROLES"); + + await removeRole(member_id, guild_id, role_id); + res.sendStatus(204); +}); - const user_id = req.params.member; +router.put("/:member_id/roles/:role_id", async (req: Request, res: Response) => { + const { guild_id, role_id, member_id } = req.params; - const member = await MemberModel.findOne({ id: user_id, guild_id }).exec(); - if (!member) throw new HTTPError("Member not found", 404); + const perms = await getPermission(member_id, guild_id); + perms.hasThrow("MANAGE_ROLES"); + + await addRole(member_id, guild_id, role_id); + res.sendStatus(204); +}); + +router.patch("/:member_id/nick", async (req: Request, res: Response) => { + const { guild_id, member_id } = req.params; + if(!req.body.nickname) throw new HTTPError("No nickname defined", 404); + + const perms = await getPermission(member_id, guild_id); + perms.hasThrow("MANAGE_NICKNAMES"); + + await changeNickname(member_id, guild_id, req.body.nickname); + res.status(204); +}); + +router.patch("/members/@me/nick", async (req: Request, res: Response) => { + const { guild_id, member_id } = req.params; + if(!req.body.nickname) throw new HTTPError("No nickname defined", 404); - await removeMember(user_id, guild_id); + const perms = await getPermission(member_id, guild_id); + perms.hasThrow("CHANGE_NICKNAME"); - // https://discord.com/developers/docs/resources/guild#remove-guild-member + await changeNickname(member_id, guild_id, req.body.nickname); + res.status(204); }); diff --git a/src/util/Member.ts b/src/util/Member.ts
index 95a34235..636cdc61 100644 --- a/src/util/Member.ts +++ b/src/util/Member.ts
@@ -4,10 +4,13 @@ import { GuildDeleteEvent, GuildMemberAddEvent, GuildMemberRemoveEvent, + GuildMemberUpdateEvent, GuildModel, MemberModel, + RoleModel, UserModel, } from "@fosscord/server-util"; +import { response } from "express"; import { HTTPError } from "lambert-server"; import Config from "./Config"; import { emitEvent } from "./Event"; @@ -120,3 +123,80 @@ export async function removeMember(user_id: string, guild_id: string) { } as GuildMemberRemoveEvent), ]); } + +export async function addRole(user_id: string, guild_id: string, role_id: string) { + const user = await getPublicUser(user_id); + + const role = await RoleModel.findOne({ id: role_id, guild_id: guild_id }).exec(); + if (!role) throw new HTTPError("role not found", 404); + + var memberObj = await MemberModel.findOneAndUpdate({ + id: user_id, + guild_id: guild_id, + }, { $push: { roles: role_id } }).exec(); + + if(!memberObj) throw new HTTPError("Member not found", 404); + + await emitEvent({ + event: "GUILD_MEMBER_UPDATE", + data: { + guild_id: guild_id, + user: user, + roles: memberObj.roles + + }, + guild_id: guild_id, + } as GuildMemberUpdateEvent); + +} + +export async function removeRole(user_id: string, guild_id: string, role_id: string) { + const user = await getPublicUser(user_id); + + const role = await RoleModel.findOne({ id: role_id, guild_id: guild_id }).exec(); + if (!role) throw new HTTPError("role not found", 404); + + var memberObj = await MemberModel.findOneAndUpdate({ + id: user_id, + guild_id: guild_id, + }, { $pull: { roles: role_id } }).exec(); + + if(!memberObj) throw new HTTPError("Member not found", 404); + + await emitEvent({ + event: "GUILD_MEMBER_UPDATE", + data: { + guild_id: guild_id, + user: user, + roles: memberObj.roles + + }, + guild_id: guild_id, + } as GuildMemberUpdateEvent); + +} + +export async function changeNickname(user_id: string, guild_id: string, nickname: string) { + const user = await getPublicUser(user_id); + + var memberObj = await MemberModel.findOneAndUpdate({ + id: user_id, + guild_id: guild_id, + }, { nick: nickname } ).exec(); + + if(!memberObj) throw new HTTPError("Member not found", 404); + + await emitEvent({ + event: "GUILD_MEMBER_UPDATE", + data: { + guild_id: guild_id, + user: user, + nick: nickname + + }, + guild_id: guild_id, + } as GuildMemberUpdateEvent); + +} + +