89 lines
2.5 KiB
TypeScript
89 lines
2.5 KiB
TypeScript
import { Router, Request, Response } from "express";
|
|
import client from "modules/discord";
|
|
|
|
const GUILD_ID = process.env.DISCORD_GUILD_ID;
|
|
if (!GUILD_ID) {
|
|
throw new Error("DISCORD_GUILD_ID environment variable is not set.");
|
|
}
|
|
|
|
const router: Router = Router();
|
|
|
|
export const getMember = async (memberId: string) => {
|
|
let guild = client.guilds.cache.get(GUILD_ID);
|
|
|
|
if (!guild) {
|
|
guild = await client.guilds.fetch(GUILD_ID);
|
|
}
|
|
|
|
if (!guild) throw new Error("Guild not found");
|
|
|
|
try {
|
|
let member = guild.members.cache.get(memberId);
|
|
if (!member) {
|
|
member = await guild.members.fetch(memberId);
|
|
}
|
|
return member;
|
|
} catch (error) {
|
|
console.error("Error fetching member:", error);
|
|
throw new Error("Member not found");
|
|
}
|
|
};
|
|
|
|
router.post("/rename", async (req: Request, res: Response) => {
|
|
const { newName, memberId } = req.body;
|
|
if (typeof newName !== "string" || !memberId) {
|
|
res.status(400).json({ error: "Invalid or missing newName or memberId" });
|
|
return;
|
|
}
|
|
try {
|
|
const member = await getMember(memberId);
|
|
await member.setNickname(newName);
|
|
console.log(`Member ${member.id} renamed to ${newName}`);
|
|
res.status(200).json({ message: "Member renamed successfully" });
|
|
} catch (error) {
|
|
console.error("Error renaming member:", error);
|
|
res.status(500).json({ error: "Failed to rename member" });
|
|
}
|
|
});
|
|
|
|
export const changeMemberRoles = async (
|
|
memberId: string,
|
|
roleIds: string[],
|
|
action: "add" | "remove",
|
|
) => {
|
|
const member = await getMember(memberId);
|
|
|
|
const currentRoleIds = member.roles.cache.map((role) => role.id);
|
|
const filteredRoleIds =
|
|
action === "add"
|
|
? roleIds.filter((id: string) => !currentRoleIds.includes(id))
|
|
: roleIds.filter((id: string) => currentRoleIds.includes(id));
|
|
|
|
if (filteredRoleIds.length === 0) {
|
|
return { message: `No roles to ${action}` };
|
|
}
|
|
|
|
await member.roles[action](filteredRoleIds);
|
|
return { message: `Roles ${action}ed successfully` };
|
|
};
|
|
|
|
const handleRoleChange = (action: "add" | "remove") => async (req: Request, res: Response) => {
|
|
const { roleIds, memberId } = req.body;
|
|
if (!Array.isArray(roleIds) || !memberId) {
|
|
res.status(400).json({ error: "Invalid or missing roleIds or memberId" });
|
|
return;
|
|
}
|
|
try {
|
|
const result = await changeMemberRoles(memberId, roleIds, action);
|
|
res.status(200).json(result);
|
|
} catch (error) {
|
|
console.error(`Error ${action}ing roles:`, error);
|
|
res.status(500).json({ error: `Failed to ${action} roles` });
|
|
}
|
|
};
|
|
|
|
router.post("/add-role", handleRoleChange("add"));
|
|
router.post("/remove-role", handleRoleChange("remove"));
|
|
|
|
export default router;
|