blob: 79b115e13585a389aa84bdb0db6f0af2286ae580 [file] [log] [blame]
#!/bin
import type { Guild, GuildMember } from "discord.js";
import type { NucleusClient } from "../utils/client.js";
//@ts-expect-error
import express from "express";
//@ts-expect-error
import bodyParser from "body-parser";
import EmojiEmbed from "../utils/generateEmojiEmbed.js";
//@ts-expect-error
import structuredClone from "@ungap/structured-clone";
const jsonParser = bodyParser.json();
const app = express();
const port = 10000;
const runServer = (client: NucleusClient) => {
app.get("/", (_req: express.Request, res: express.Response) => {
res.status(200).send(client.ws.ping.toString());
});
app.post("/verify/:code", jsonParser, async function (req: express.Request, res: express.Response) {
const code = req.params.code;
const secret = req.body.secret;
if (secret === client.config.verifySecret) {
const guild = (await client.guilds.fetch(client.verify[code]!.gID)) as Guild | null;
if (!guild) {
return res.status(404);
}
const member = (await guild.members.fetch(client.verify[code]!.uID)) as GuildMember | null;
if (!member) {
return res.status(404);
}
if (member.roles.cache.has(client.verify[code]!.rID)) {
return res.status(200);
}
await member.roles.add(client.verify[code]!.rID);
const interaction = client.verify[code]!.interaction;
await interaction.editReply({
embeds: [
new EmojiEmbed()
.setTitle("Verify")
.setDescription("Verification complete! You can now dismiss this message")
.setStatus("Success")
.setEmoji("MEMBER.JOIN")
],
components: []
});
client.verify = Object.keys(client.verify)
.filter((k) => k !== code)
.reduce((obj, key) => {
return { ...obj, [key]: client.verify[key] };
}, {});
const { log, NucleusColors, entry, renderUser, renderDelta } = client.logger;
try {
const data = {
meta: {
type: "memberVerify",
displayName: "Member Verified",
calculateType: "guildMemberVerify",
color: NucleusColors.green,
emoji: "CONTROL.BLOCKTICK",
timestamp: Date.now()
},
list: {
member: entry(member.id, renderUser(member.user)),
joined: entry(member.joinedTimestamp, renderDelta(member.joinedTimestamp!)),
verified: entry(Date.now(), renderDelta(Date.now()))
},
hidden: {
guild: guild.id
}
};
await log(data);
} catch {
res.sendStatus(500);
}
res.sendStatus(200);
} else {
res.sendStatus(403);
}
});
app.get("/verify/:code", jsonParser, async function (req: express.Request, res: express.Response) {
const code = req.params.code;
if (client.verify[code]) {
try {
const interaction = client.verify[code]!.interaction;
await interaction.editReply({
embeds: [
new EmojiEmbed()
.setTitle("Verify")
.setDescription(
"Verify was opened in another tab or window, please complete the check there to continue"
)
.setStatus("Success")
.setEmoji("MEMBER.JOIN")
]
});
} catch {
return res.sendStatus(410);
}
const data = structuredClone(client.verify[code]);
delete data.interaction;
return res.status(200).send(data);
}
return res.sendStatus(404);
});
app.post("/rolemenu/:code", jsonParser, async function (req: express.Request, res: express.Response) {
const code = req.params.code;
const secret = req.body.secret;
if (secret === client.config.verifySecret) {
const guild = (await client.guilds.fetch(client.roleMenu[code]!.guild)) as Guild | null;
if (!guild) {
return res.status(404);
}
const member = (await guild.members.fetch(client.roleMenu[code]!.user)) as GuildMember | null;
if (!member) {
return res.status(404);
}
res.sendStatus(200);
} else {
res.sendStatus(403);
}
});
app.get("/rolemenu/:code", jsonParser, async function (req: express.Request, res: express.Response) {
const code = req.params.code;
if (client.roleMenu[code] !== undefined) {
try {
const interaction = client.roleMenu[code]!.interaction;
await interaction.editReply({
embeds: [
new EmojiEmbed()
.setTitle("Roles")
.setDescription(
"The role menu was opened in another tab or window, please select your roles there to continue"
)
.setStatus("Success")
.setEmoji("GUILD.GREEN")
],
components: []
});
} catch {
return res.sendStatus(410);
}
const data = structuredClone(client.roleMenu[code]);
delete data.interaction;
console.log(data);
return res.status(200).send(data);
}
return res.sendStatus(404);
});
app.get("/transcript/:code/human", jsonParser, async function (req: express.Request, res: express.Response) {
const code = req.params.code;
if (code === undefined) return res.status(400).send("No code provided");
const entry = await client.database.transcripts.read(code, req.query.key as string, req.query.iv as string);
if (entry === null) return res.status(404).send("Could not find a transcript by that code");
// Convert to a human readable format
const data = client.database.transcripts.toHumanReadable(entry);
res.attachment(`${code}.txt`);
res.type("txt");
return res.status(200).send(data);
});
app.get("/transcript/:code", jsonParser, async function (req: express.Request, res: express.Response) {
const code = req.params.code;
if (code === undefined) return res.status(400).send("No code provided");
const entry = await client.database.transcripts.read(code, req.query.key as string, req.query.iv as string);
if (entry === null) return res.status(404).send("Could not find a transcript by that code");
// Convert to a human readable format
return res.status(200).send(entry);
});
app.get("/channels/:id", jsonParser, async function (req: express.Request, res: express.Response) {
const id = req.params.id;
if (id === undefined) return res.status(400).send("No id provided");
const channel = await client.channels.fetch(id);
if (channel === null) return res.status(400).send("Could not find a channel by that id");
if (channel.isDMBased()) return res.status(400).send("Cannot get a DM channel");
return res.status(200).send(channel.name);
});
app.get("/users/:id", jsonParser, async function (req: express.Request, res: express.Response) {
const id = req.params.id;
if (id === undefined) return res.status(400).send("No id provided");
let user;
try {
user = await client.users.fetch(id);
} catch (e) {
console.log(e);
return res.status(404).send("Could not find a user by that id");
}
return res.status(200).send(user.username);
});
app.listen(port);
};
export default runServer;