diff options
-rw-r--r-- | assets/public/1f0bfc0865d324c2587920a7d80c609b.png | bin | 0 -> 4380 bytes | |||
-rw-r--r-- | assets/public/3c6ccb83716d1e4fb91d3082f6b21d77.png | bin | 0 -> 4511 bytes | |||
-rw-r--r-- | assets/public/4c1b599b1ef5b9f1874fdb9933f3e03b.png | bin | 0 -> 4251 bytes | |||
-rw-r--r-- | assets/public/6f26ddd1bf59740c536d2274bb834a05.png | bin | 0 -> 4494 bytes | |||
-rw-r--r-- | assets/public/7c8f476123d28d103efe381543274c25.png | bin | 0 -> 4657 bytes | |||
-rw-r--r-- | assets/public/c09a43a372ba81e3018c3151d4ed4773.png | bin | 0 -> 4158 bytes | |||
-rw-r--r-- | package-lock.json | 1 | ||||
-rw-r--r-- | src/cdn/routes/embed.ts | 67 |
8 files changed, 67 insertions, 1 deletions
diff --git a/assets/public/1f0bfc0865d324c2587920a7d80c609b.png b/assets/public/1f0bfc0865d324c2587920a7d80c609b.png new file mode 100644 index 00000000..9b92bd2f --- /dev/null +++ b/assets/public/1f0bfc0865d324c2587920a7d80c609b.png Binary files differdiff --git a/assets/public/3c6ccb83716d1e4fb91d3082f6b21d77.png b/assets/public/3c6ccb83716d1e4fb91d3082f6b21d77.png new file mode 100644 index 00000000..62c599a7 --- /dev/null +++ b/assets/public/3c6ccb83716d1e4fb91d3082f6b21d77.png Binary files differdiff --git a/assets/public/4c1b599b1ef5b9f1874fdb9933f3e03b.png b/assets/public/4c1b599b1ef5b9f1874fdb9933f3e03b.png new file mode 100644 index 00000000..bd7afef2 --- /dev/null +++ b/assets/public/4c1b599b1ef5b9f1874fdb9933f3e03b.png Binary files differdiff --git a/assets/public/6f26ddd1bf59740c536d2274bb834a05.png b/assets/public/6f26ddd1bf59740c536d2274bb834a05.png new file mode 100644 index 00000000..9f137906 --- /dev/null +++ b/assets/public/6f26ddd1bf59740c536d2274bb834a05.png Binary files differdiff --git a/assets/public/7c8f476123d28d103efe381543274c25.png b/assets/public/7c8f476123d28d103efe381543274c25.png new file mode 100644 index 00000000..3e8eeae9 --- /dev/null +++ b/assets/public/7c8f476123d28d103efe381543274c25.png Binary files differdiff --git a/assets/public/c09a43a372ba81e3018c3151d4ed4773.png b/assets/public/c09a43a372ba81e3018c3151d4ed4773.png new file mode 100644 index 00000000..67ee7bbd --- /dev/null +++ b/assets/public/c09a43a372ba81e3018c3151d4ed4773.png Binary files differdiff --git a/package-lock.json b/package-lock.json index 165a2b23..ecd455b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,6 @@ "probe-image-size": "^7.2.3", "proxy-agent": "^5.0.0", "reflect-metadata": "^0.1.13", - "sqlite3": "*", "ts-node": "^10.9.1", "tslib": "^2.4.1", "typeorm": "^0.3.10", diff --git a/src/cdn/routes/embed.ts b/src/cdn/routes/embed.ts new file mode 100644 index 00000000..fd13d215 --- /dev/null +++ b/src/cdn/routes/embed.ts @@ -0,0 +1,67 @@ +/* + Fosscord: A FOSS re-implementation and extension of the Discord.com backend. + Copyright (C) 2023 Fosscord and Fosscord 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 { Request, Response, Router } from "express"; +import FileType from "file-type"; +import fs from "fs/promises"; +import { HTTPError } from "lambert-server"; +import { join } from "path"; + +const defaultAvatarHashMap = new Map([ + ["0", "1f0bfc0865d324c2587920a7d80c609b"], + ["1", "c09a43a372ba81e3018c3151d4ed4773"], + ["2", "7c8f476123d28d103efe381543274c25"], + ["3", "6f26ddd1bf59740c536d2274bb834a05"], + ["4", "3c6ccb83716d1e4fb91d3082f6b21d77"], + ["5", "4c1b599b1ef5b9f1874fdb9933f3e03b"], +]); + +const router = Router(); + +async function getFile(path: string) { + try { + return fs.readFile(path); + } catch (error) { + try { + const files = await fs.readdir(path); + if (!files.length) return null; + return fs.readFile(join(path, files[0])); + } catch (error) { + return null; + } + } +} + +router.get("/avatars/:id", async (req: Request, res: Response) => { + let { id } = req.params; + id = id.split(".")[0]; // remove .file extension + const hash = defaultAvatarHashMap.get(id); + if (!hash) throw new HTTPError("not found", 404); + const path = join(process.cwd(), "assets", "public", `${hash}.png`); + + const file = await getFile(path); + if (!file) throw new HTTPError("not found", 404); + const type = await FileType.fromBuffer(file); + + res.set("Content-Type", type?.mime); + res.set("Cache-Control", "public, max-age=31536000"); + + return res.send(file); +}); + +export default router; |