import express from "express"; import { guildMap, wait } from "../common.js"; import { dangerousAdminMode } from "../config.js"; import { checkAuth, createToken } from "../tokens.js"; const router = express(); router.get("/", (req, res) => { res.status(200).send({ error: false, message: "SUCCESS_API_OK" }); }); router.post("/tokens/create", async (req, res) => { if (!dangerousAdminMode) return res.status(403).send({ error: true, message: "ERROR_FEATURE_DISABLED" }); const { username, avatarURL, discordID, guildAccess } = req.body; if (!username || !discordID || !guildAccess) return res.status(400).send({ error: true, message: "ERROR_BAD_REQUEST" }); try { const token = await createToken({ username, avatarURL, discordID, guildAccess }); res.status(200).send({ error: false, message: "SUCCESS_TOKEN_CREATED", token }); } catch(e) { res.status(500).send({ error: true, message: "ERROR_TOKEN_CREATE_FAILURE" }); } }); router.post("/guilds/:guildId/channels/:channelId/messages/create", checkAuth(async (req, res) => { const messageContent = req.body.content; if (!messageContent) return res.status(400).send({ error: true, message: "ERROR_NO_MESSAGE_CONTENT" }); const guildId = req.params.guildId; if (!guildId) return res.status(400).send({ error: true, message: "ERROR_NO_GUILD_ID" }); const channelId = req.params.channelId; if (!channelId) return res.status(400).send({ error: true, message: "ERROR_NO_CHANNEL_ID" }); const { username, avatarURL, guildAccess } = req.user; if (guildAccess.indexOf(guildId) === -1) return res.status(403).send({ error: true, message: "ERROR_NO_GUILD_ACCESS" }); const guild = guildMap.get(guildId); try { await guild.discordSendMessage(messageContent, channelId, username, avatarURL); res.status(201).send(""); } catch(e) { console.error("server main: api: message create: error: ", e); res.status(500).send({ error: true, message: "ERROR_MESSAGE_SEND_FAILURE" }); } })); router.get("/guilds/:guildId/channels", checkAuth(async (req, res) => { const guildId = req.params.guildId; if (!guildId) return res.status(400).send({ error: true, message: "ERROR_NO_GUILD_ID" }); const { guildAccess } = req.user; if (guildAccess.indexOf(guildId) === -1) return res.status(403).send({ error: true, message: "ERROR_NO_GUILD_ACCESS" }); const guild = guildMap.get(guildId); try { res.status(200).send({ error: false, channels: guild.userFacingChannelList() }); } catch(e) { console.error("server main: api: guild get channels: error: ", e); res.status(500).send({ error: true, message: "ERROR_CHANNELS_FETCH_FAILURE" }); } })); router.get("/guilds/:guildId/events/poll", checkAuth(async (req, res) => { const guildId = req.params.guildId; if (!guildId) return res.status(400).send({ error: true, message: "ERROR_NO_GUILD_ID" }); const { guildAccess } = req.user; if (guildAccess.indexOf(guildId) === -1) return res.status(403).send({ error: true, message: "ERROR_NO_GUILD_ACCESS" }); const guild = guildMap.get(guildId); try { Promise.race([ guild.holdForEvent(), wait(10000) ]).then(event => { res.status(200).send({ error: false, event }); }) .catch(() => { res.status(200).send({ error: false, event: null }); }); } catch(e) { console.error("server main: api: guild poll events: error: ", e); res.status(500).send({ error: true, message: "ERROR_POLL_FAILURE" }); } })); export default router;