diff --git a/assets/schemas.json b/assets/schemas.json index f098d015..d7a7e0ca 100755 Binary files a/assets/schemas.json and b/assets/schemas.json differ diff --git a/src/api/routes/emojis/#emoji_id/source.ts b/src/api/routes/emojis/#emoji_id/source.ts new file mode 100644 index 00000000..7ce8b42e --- /dev/null +++ b/src/api/routes/emojis/#emoji_id/source.ts @@ -0,0 +1,93 @@ +/* + 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 . +*/ + +import { route } from "@spacebar/api"; +import { + Emoji, + APIErrorResponse, + DiscordApiErrors, + EmojiSourceResponse, + Guild, + Member, + EmojiGuild, +} from "@spacebar/util"; +import { Request, Response, Router } from "express"; + +const router = Router(); + +router.get( + "/", + route({ + responses: { + 200: { + body: "EmojiSourceResponse", + }, + 404: { + body: "APIErrorResponse", + }, + }, + }), + async (req: Request, res: Response) => { + const { emoji_id } = req.params; + + const emoji = await Emoji.findOne({ where: { id: emoji_id } }); + if (!emoji) { + res.status(404).json({ + code: DiscordApiErrors.UNKNOWN_EMOJI.code, + message: `No emoji with ID ${emoji_id} appear to exist. Are you sure you didn't mistype it?`, + errors: {}, + } as APIErrorResponse); + return; + } + + // TODO: emojis can be owned by applications these days, account for this when we get there? + res.json({ + type: "GUILD", + guild: { + ...(await Guild.findOne({ + where: { + id: emoji.guild_id, + }, + select: { + id: true, + name: true, + icon: true, + description: true, + features: true, + emojis: true, + premium_tier: true, + premium_subscription_count: true, + }, + })), + approximate_member_count: await Member.countBy({ + guild_id: emoji.guild_id, + }), + approximate_presence_count: await Member.countBy({ + guild_id: emoji.guild_id, + user: { + sessions: { + status: "online", + }, + }, + }), + } as EmojiGuild, + } as EmojiSourceResponse); + }, +); + +export default router; diff --git a/src/util/schemas/responses/EmojiSourceResponse.ts b/src/util/schemas/responses/EmojiSourceResponse.ts new file mode 100644 index 00000000..6eeebb32 --- /dev/null +++ b/src/util/schemas/responses/EmojiSourceResponse.ts @@ -0,0 +1,44 @@ +/* + Spacebar: A FOSS re-implementation and extension of the Discord.com backend. + Copyright (C) 2025 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 . +*/ + +import { Emoji } from "@spacebar/util"; + +export interface EmojiSourceResponse { + type: "GUILD" | "APPLICATION"; + guild?: EmojiGuild | null; + application?: EmojiApplication | null; +} + +// keep in sync with +export interface EmojiGuild { + id: string; + name: string; + icon?: string | null; + description?: string | null; + features: string[]; + emojis: Emoji[]; + premium_tier: number; + premium_subscription_count?: number; + approximate_member_count?: number; + approximate_presence_count?: number; +} + +export interface EmojiApplication { + id: string; + name: string; +} diff --git a/src/util/schemas/responses/index.ts b/src/util/schemas/responses/index.ts index 67daaddc..29537cf7 100644 --- a/src/util/schemas/responses/index.ts +++ b/src/util/schemas/responses/index.ts @@ -24,6 +24,7 @@ export * from "./CaptchaRequiredResponse"; export * from "./DiscoverableGuildsResponse"; export * from "./EmailDomainLookupResponse"; export * from "./EmailDomainLookupVerifyCodeResponse"; +export * from "./EmojiSourceResponse" export * from "./GatewayBotResponse"; export * from "./GatewayResponse"; export * from "./GenerateRegistrationTokensResponse";