Add emoji source endpoint

This commit is contained in:
Rory& 2025-07-07 21:59:25 +02:00
parent 5205ccecd5
commit cb0443821e
4 changed files with 138 additions and 0 deletions

Binary file not shown.

View File

@ -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 <https://www.gnu.org/licenses/>.
*/
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;

View File

@ -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 <https://www.gnu.org/licenses/>.
*/
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;
}

View File

@ -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";