From fe53b86e6f4572959bb645413d91f84e6751124f Mon Sep 17 00:00:00 2001 From: Rory& Date: Fri, 17 Oct 2025 13:49:13 +0200 Subject: [PATCH] games/detectable --- src/api/routes/games/detectable.ts | 52 ++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/api/routes/games/detectable.ts diff --git a/src/api/routes/games/detectable.ts b/src/api/routes/games/detectable.ts new file mode 100644 index 00000000..167720c1 --- /dev/null +++ b/src/api/routes/games/detectable.ts @@ -0,0 +1,52 @@ +/* + 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 { Request, Response, Router } from "express"; +import { ApplicationDetectableResponse } from "@spacebar/schemas*"; + +const router: Router = Router({ mergeParams: true }); +const cache = { + data: {}, + lastUpdated: 0 +} + +// modern dclients call this, is /applications/detectable deprecated? +router.get( + "/", + route({ + responses: { + 200: { + body: "ApplicationDetectableResponse", + }, + }, + }), + async (req: Request, res: Response) => { + // cache for 6 hours + if (Date.now() - cache.lastUpdated > 6 * 60 * 60 * 1000) { + const response = await fetch("https://discord.com/api/v10/games/detectable"); // because, well, it's unauthenticated anyways + const data = await response.json(); + cache.data = data as ApplicationDetectableResponse; + cache.lastUpdated = Date.now(); + } + + res.status(200).json(cache.data); + }, +); + +export default router;