Newer
Older
percord / src / api / routes / guilds / #guild_id / application-command-index.ts
/*
  Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
  Copyright (C) 2023 Spacebar and Spacebar Contributors
  
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU Affero General Public License as published
  by the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.
  
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU Affero General Public License for more details.
  
  You should have received a copy of the GNU Affero General Public License
  along with this program.  If not, see <https://www.gnu.org/licenses/>.
*/

import { route } from "@spacebar/api";
import { Request, Response, Router } from "express";
import { Application, ApplicationCommand, Member, Snowflake } from "@spacebar/util";
import { IsNull } from "typeorm";
import { ApplicationCommandSchema, ApplicationCommandType } from "@spacebar/schemas";

const router = Router({ mergeParams: true });

router.get("/", route({}), async (req: Request, res: Response) => {
	const members = await Member.find({ where: { guild_id: req.params.guild_id, user: { bot: true } } });
	const applications: Application[] = [];

	for (const member of members) {
		const app = await Application.findOne({ where: { id: member.id } });
		if (app) applications.push(app);
	}

	const applicationsSendable = [];

	for (const application of applications) {
		applicationsSendable.push({
			bot_id: application.bot?.id,
			description: application.description,
			flags: application.flags,
			icon: application.icon,
			id: application.id,
			name: application.name,
		});
	}

	const applicationCommands: ApplicationCommand[][] = [];

	for (const application of applications) {
		applicationCommands.push(await ApplicationCommand.find({ where: { application_id: application.id, guild_id: IsNull() } }));
		applicationCommands.push(await ApplicationCommand.find({ where: { application_id: application.id, guild_id: req.params.guild_id } }));
	}

	const applicationCommandsSendable: ApplicationCommandSchema[] = [];

	for (const command of applicationCommands.flat()) {
		applicationCommandsSendable.push({
			id: command.id,
			type: command.type,
			application_id: command.application_id,
			guild_id: command.guild_id,
			name: command.name,
			name_localizations: command.name_localizations,
			// name_localized: // TODO: make this work
			description: command.description,
			description_localizations: command.description_localizations,
			// description_localized: // TODO: make this work
			options: command.type === ApplicationCommandType.CHAT_INPUT ? command.options : undefined,
			default_member_permissions: command.default_member_permissions,
			dm_permission: command.dm_permission,
			permissions: command.permissions,
			nsfw: command.nsfw,
			integration_types: command.integration_types,
			global_popularity_rank: command.global_popularity_rank,
			contexts: command.contexts,
			version: command.version,
			handler: command.handler,
		});
	}

	res.send({
		applications: applicationsSendable,
		application_commands: applicationCommandsSendable,
		version: Snowflake.generate(),
	});
});

export default router;