From ec6cb4b3552b1ec83172ecab9064822913054be2 Mon Sep 17 00:00:00 2001 From: Taevas Date: Thu, 6 Mar 2025 22:18:15 +0100 Subject: [PATCH] Remove Netlify, make an API server --- .gitignore | 2 +- README.md | 12 +- {netlify/functions => api}/coding_github.ts | 17 +- api/coding_gitlab.ts | 21 + {netlify/functions => api}/coding_kitsudev.ts | 15 +- .../functions => api}/fediverse_kitsuclub.ts | 21 +- api/gaming_osu.ts | 32 + .../functions => api}/gaming_speedruncom.ts | 19 +- .../functions => api}/hacking_hackthebox.ts | 20 +- .../functions => api}/japanese_wanikani.ts | 25 +- {netlify/functions => api}/media_anilist.ts | 15 +- {netlify/functions => api}/media_lastfm.ts | 17 +- {netlify/functions => api}/token.ts | 27 +- {netlify/functions => api}/website_umami.ts | 25 +- {public => assets}/brittany.jpg | Bin .../fonts/LexendDeca-Regular.ttf | Bin {public => assets}/lain.png | Bin {public => assets}/logos/anilist.svg | 0 {public => assets}/logos/github.svg | 0 {public => assets}/logos/gitlab.svg | 0 {public => assets}/logos/lastdotfm.png | Bin {public => assets}/logos/matrix.svg | 0 {public => assets}/logos/osu.svg | 0 {public => assets}/logos/speedrundotcom.png | Bin {public => assets}/logos/youtube.svg | 0 {public => assets}/osu_rulesets/fruits.png | Bin {public => assets}/osu_rulesets/mania.png | Bin {public => assets}/osu_rulesets/osu.png | Bin {public => assets}/osu_rulesets/taiko.png | Bin {public => assets}/swordventure.png | Bin bun.lockb | Bin 254688 -> 219945 bytes index.css | 1863 +++++++++++++++++ index.html | 4 +- index.ts | 103 + netlify.toml | 13 - netlify/functions/coding_gitlab.ts | 26 - netlify/functions/gaming_osu.ts | 34 - package.json | 18 +- src/App.css | 2 +- src/App.tsx | 8 +- src/Infos/Coding/GitHub.tsx | 6 +- src/Infos/Coding/GitLab.tsx | 4 +- src/Infos/Coding/KitsuDev.tsx | 6 +- src/Infos/Coding/index.tsx | 8 +- src/Infos/DataHandler.tsx | 2 +- src/Infos/Fediverse/KitsuClub.tsx | 6 +- src/Infos/Fediverse/index.tsx | 4 +- src/Infos/Gaming/Osu.tsx | 6 +- src/Infos/Gaming/Speedruncom.tsx | 8 +- src/Infos/Gaming/index.tsx | 8 +- src/Infos/Hacking/Hackthebox.tsx | 6 +- src/Infos/Hacking/index.tsx | 4 +- src/Infos/Japanese/Wanikani.tsx | 4 +- src/Infos/Japanese/index.tsx | 4 +- src/Infos/Media/Anilist.tsx | 6 +- src/Infos/Media/Lastfm.tsx | 6 +- src/Infos/Media/index.tsx | 6 +- src/Infos/Website/Umami.tsx | 4 +- src/Infos/Website/index.tsx | 6 +- src/Infos/index.tsx | 14 +- src/Main/MainWindow/SocialButtons/index.tsx | 16 +- src/Main/MainWindow/TabButtons/index.tsx | 4 +- src/Main/MainWindow/index.tsx | 6 +- src/Main/Tabs/About/index.tsx | 6 +- src/Main/Tabs/Contact/index.tsx | 12 +- src/Main/Tabs/Projects/index.tsx | 14 +- src/Main/Tabs/Support/index.tsx | 6 +- src/Main/Tabs/Tab.tsx | 2 +- src/Main/Tabs/index.tsx | 8 +- src/Main/index.tsx | 4 +- src/parts/ButtonLink.tsx | 2 +- tsconfig.json | 28 +- vite.config.js | 7 - 73 files changed, 2238 insertions(+), 334 deletions(-) rename {netlify/functions => api}/coding_github.ts (70%) create mode 100644 api/coding_gitlab.ts rename {netlify/functions => api}/coding_kitsudev.ts (57%) rename {netlify/functions => api}/fediverse_kitsuclub.ts (86%) create mode 100644 api/gaming_osu.ts rename {netlify/functions => api}/gaming_speedruncom.ts (88%) rename {netlify/functions => api}/hacking_hackthebox.ts (57%) rename {netlify/functions => api}/japanese_wanikani.ts (83%) rename {netlify/functions => api}/media_anilist.ts (88%) rename {netlify/functions => api}/media_lastfm.ts (77%) rename {netlify/functions => api}/token.ts (79%) rename {netlify/functions => api}/website_umami.ts (72%) rename {public => assets}/brittany.jpg (100%) rename {public => assets}/fonts/LexendDeca-Regular.ttf (100%) rename {public => assets}/lain.png (100%) rename {public => assets}/logos/anilist.svg (100%) rename {public => assets}/logos/github.svg (100%) rename {public => assets}/logos/gitlab.svg (100%) rename {public => assets}/logos/lastdotfm.png (100%) rename {public => assets}/logos/matrix.svg (100%) rename {public => assets}/logos/osu.svg (100%) rename {public => assets}/logos/speedrundotcom.png (100%) rename {public => assets}/logos/youtube.svg (100%) rename {public => assets}/osu_rulesets/fruits.png (100%) rename {public => assets}/osu_rulesets/mania.png (100%) rename {public => assets}/osu_rulesets/osu.png (100%) rename {public => assets}/osu_rulesets/taiko.png (100%) rename {public => assets}/swordventure.png (100%) create mode 100644 index.css create mode 100644 index.ts delete mode 100644 netlify.toml delete mode 100644 netlify/functions/coding_gitlab.ts delete mode 100644 netlify/functions/gaming_osu.ts delete mode 100644 vite.config.js diff --git a/.gitignore b/.gitignore index ebdb2d1..391ce0e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ .netlify node_modules dist -*.log +.env diff --git a/README.md b/README.md index 173f021..0ef8281 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -[![Netlify Status](https://api.netlify.com/api/v1/badges/10889a9b-c148-488d-aecd-9a44e0cf6f46/deploy-status)](https://taevas.xyz) - # taevas.xyz My personal website! @@ -7,18 +5,16 @@ My personal website! ## Build and develop ```bash -bun install --global netlify-cli -bun i --ignore-scripts -netlify dev +bun i +bun dev ``` ## Environment variables This package uses [`@carbon/icons-react`](https://github.com/carbon-design-system/carbon/tree/main/packages/icons-react), which **installs [a telemetry package which can be disabled](https://github.com/ibm-telemetry/telemetry-js/tree/main#opting-out-of-ibm-telemetry-data-collection):** -```bash -netlify env:set IBM_TELEMETRY_DISABLED true -``` +Set the environment variable IBM_TELEMETRY_DISABLED to true + This package makes use of several online APIs through Netlify in order to deliver the `Infos` that are available on the right side of the website, accessing most of these APIs requires a key (or similar), which can be set through the following environment variables: diff --git a/netlify/functions/coding_github.ts b/api/coding_github.ts similarity index 70% rename from netlify/functions/coding_github.ts rename to api/coding_github.ts index 26d213b..8ac45da 100644 --- a/netlify/functions/coding_github.ts +++ b/api/coding_github.ts @@ -1,9 +1,9 @@ -import {type Handler} from "@netlify/functions"; import {Octokit} from "@octokit/rest"; -import {type GithubInfo} from "#Infos/Coding/GitHub.js"; +import {type GithubInfo} from "#Infos/Coding/GitHub.tsx"; +import type { Handler } from ".."; -const handler: Handler = async () => { - const octokit = new Octokit({auth: process.env.API_GITHUB}); +export const coding_github: Handler = async () => { + const octokit = new Octokit({auth: process.env["API_GITHUB"]}); const github = await octokit.rest.activity.listEventsForAuthenticatedUser({username: "TTTaevas"}); const publicPush = github.data.find((e) => (e.type === "PushEvent" || e.type === "PullRequestEvent") && e.public); @@ -19,10 +19,7 @@ const handler: Handler = async () => { } : undefined, }; - return { - statusCode: 200, - body: JSON.stringify(info), - }; + return new Response(new Blob([JSON.stringify(info)], { + type: "application/json", + }), {status: 200}); }; - -export {handler}; diff --git a/api/coding_gitlab.ts b/api/coding_gitlab.ts new file mode 100644 index 0000000..9d6e854 --- /dev/null +++ b/api/coding_gitlab.ts @@ -0,0 +1,21 @@ +import { Gitlab } from "@gitbeaker/rest"; +import {type GitlabInfo} from "#Infos/Coding/GitLab.tsx"; +import type { Handler } from ".."; + +export const coding_gitlab: Handler = async () => { + const api = new Gitlab({token: process.env["API_GITLAB"]!}); + const gitlab = await api.Events.all({action: "pushed"}); + + const created_at = gitlab.at(0)?.created_at; + if (typeof created_at !== "string") { + return new Response("Not Found", {status: 404}); + } + + const activity: GitlabInfo = { + date: created_at.substring(0, created_at.indexOf("T")), + }; + + return new Response(new Blob([JSON.stringify(activity)], { + type: "application/json", + }), {status: 200}); +}; diff --git a/netlify/functions/coding_kitsudev.ts b/api/coding_kitsudev.ts similarity index 57% rename from netlify/functions/coding_kitsudev.ts rename to api/coding_kitsudev.ts index 3e62b92..fc095b7 100644 --- a/netlify/functions/coding_kitsudev.ts +++ b/api/coding_kitsudev.ts @@ -1,7 +1,7 @@ -import {type Handler} from "@netlify/functions"; -import { type KitsudevInfo } from "#Infos/Coding/KitsuDev.js"; +import { type KitsudevInfo } from "#Infos/Coding/KitsuDev.tsx"; +import type { Handler } from ".."; -const handler: Handler = async () => { +export const coding_kitsudev: Handler = async () => { const kitsudev = await (await fetch("https://kitsunes.dev/api/v1/users/Taevas/activities/feeds?limit=1")).json() as [{ repo: { full_name: string @@ -16,10 +16,7 @@ const handler: Handler = async () => { date: kitsudev[0].created }; - return { - statusCode: 200, - body: JSON.stringify(info), - }; + return new Response(new Blob([JSON.stringify(info)], { + type: "application/json", + }), {status: 200}); }; - -export {handler}; diff --git a/netlify/functions/fediverse_kitsuclub.ts b/api/fediverse_kitsuclub.ts similarity index 86% rename from netlify/functions/fediverse_kitsuclub.ts rename to api/fediverse_kitsuclub.ts index 99340a5..22b5921 100644 --- a/netlify/functions/fediverse_kitsuclub.ts +++ b/api/fediverse_kitsuclub.ts @@ -1,11 +1,11 @@ -import {type Handler} from "@netlify/functions"; -import { KitsuclubInfo } from "#Infos/Fediverse/KitsuClub.js"; +import { type KitsuclubInfo } from "#Infos/Fediverse/KitsuClub.tsx"; +import type { Handler } from ".."; -const handler: Handler = async () => { +export const fediverse_kitsuclub: Handler = async () => { const kitsuclub = await (await fetch("https://kitsunes.club/api/users/notes", { method: "POST", headers: { - "Authorization": `Bearer ${process.env.API_KITSUCLUB}`, + "Authorization": `Bearer ${process.env["API_KITSUCLUB"]}`, "Content-Type": "application/json", }, body: JSON.stringify({ @@ -42,9 +42,7 @@ const handler: Handler = async () => { const details = kitsuclub.at(Math.max(0, kitsuclub.length - 1)); if (!details) { - return { - statusCode: 404, - }; + return new Response("Not Found", {status: 404}); } let scan_text = details.text; @@ -89,10 +87,7 @@ const handler: Handler = async () => { }) }; - return { - statusCode: 200, - body: JSON.stringify(activity), - }; + return new Response(new Blob([JSON.stringify(activity)], { + type: "application/json", + }), {status: 200}); }; - -export {handler}; diff --git a/api/gaming_osu.ts b/api/gaming_osu.ts new file mode 100644 index 0000000..9564779 --- /dev/null +++ b/api/gaming_osu.ts @@ -0,0 +1,32 @@ +import * as osu from "osu-api-v2-js"; +import {type OsuInfo} from "#Infos/Gaming/Osu.tsx"; +import {MongoClient} from "mongodb"; +import {type Token} from "./token.tsx"; +import type { Handler } from "../index.ts"; + +export const gaming_osu: Handler = async (params) => { + const client = new MongoClient(process.env["URL_MONGODB"]!); + await client.connect(); + + const db = client.db("tokens"); + const collection = db.collection("osu"); + const token = await collection.findOne(); + void client.close(); + + let ruleset = params.has("ruleset") ? Number(params.get("ruleset")) : undefined; + if (ruleset && isNaN(ruleset)) {ruleset = undefined;} + const api = new osu.API({access_token: token?.access_token}); + const profile = await api.getUser(7276846, ruleset); + + const info: OsuInfo = { + country: profile.country.name, + ranks: { + global: profile.statistics.global_rank ?? 0, + country: profile.statistics.country_rank ?? 0, + }, + }; + + return new Response(new Blob([JSON.stringify(info)], { + type: "application/json", + }), {status: 200}); +}; diff --git a/netlify/functions/gaming_speedruncom.ts b/api/gaming_speedruncom.ts similarity index 88% rename from netlify/functions/gaming_speedruncom.ts rename to api/gaming_speedruncom.ts index f8e06ad..112a4df 100644 --- a/netlify/functions/gaming_speedruncom.ts +++ b/api/gaming_speedruncom.ts @@ -1,5 +1,5 @@ -import {type Handler} from "@netlify/functions"; -import {type SpeedruncomInfo} from "#Infos/Gaming/Speedruncom.js"; +import {type SpeedruncomInfo} from "#Infos/Gaming/Speedruncom.tsx"; +import type { Handler } from ".."; interface Runs { data: { @@ -41,15 +41,13 @@ interface Level { }; } -const handler: Handler = async () => { +export const gaming_speedruncom: Handler = async () => { // using the API's embedding would be stupid here, as that'd create lag due to irrelevant runs const speedruncom = await (await fetch("https://www.speedrun.com/api/v1/users/j03v45mj/personal-bests")).json() as Runs; const data = speedruncom.data.at(0); if (!data) { - return { - statusCode: 404, - }; + return new Response("Not Found", {status: 404}); } const urlsToRequest = [`https://www.speedrun.com/api/v1/games/${data.run.game}`]; @@ -76,10 +74,9 @@ const handler: Handler = async () => { run.time = run.time.substring(1); } - return { - statusCode: 200, - body: JSON.stringify(run), - }; + return new Response(new Blob([JSON.stringify(run)], { + type: "application/json", + }), {status: 200}); }; // https://gist.github.com/vankasteelj/74ab7793133f4b257ea3 @@ -92,5 +89,3 @@ function sec2time(timeInSeconds: number) { const milliseconds = Number(time.toString().slice(-3)); return pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3); }; - -export {handler}; diff --git a/netlify/functions/hacking_hackthebox.ts b/api/hacking_hackthebox.ts similarity index 57% rename from netlify/functions/hacking_hackthebox.ts rename to api/hacking_hackthebox.ts index 743a81a..8a9fd18 100644 --- a/netlify/functions/hacking_hackthebox.ts +++ b/api/hacking_hackthebox.ts @@ -1,7 +1,7 @@ -import {type Handler} from "@netlify/functions"; -import {type HacktheboxInfo} from "#Infos/Hacking/Hackthebox.js"; +import {type HacktheboxInfo} from "#Infos/Hacking/Hackthebox.tsx"; +import type { Handler } from ".."; -const handler: Handler = async () => { +export const hacking_hackthebox: Handler = async () => { const hackthebox = await (await fetch("https://www.hackthebox.com/api/v4/profile/activity/1063999")).json() as { profile: { activity: HacktheboxInfo[]; @@ -10,19 +10,13 @@ const handler: Handler = async () => { const pwn = hackthebox.profile.activity.find((a: HacktheboxInfo) => a?.object_type === "machine"); if (!pwn) { - return { - statusCode: 404, - body: "", - }; + return new Response("Not Found", {status: 404}); } pwn.machine_avatar = `https://www.hackthebox.com${pwn.machine_avatar}`; pwn.date = pwn.date.substring(0, pwn.date.indexOf("T")); - return { - statusCode: 200, - body: JSON.stringify(pwn), - }; + return new Response(new Blob([JSON.stringify(pwn)], { + type: "application/json", + }), {status: 200}); }; - -export {handler}; diff --git a/netlify/functions/japanese_wanikani.ts b/api/japanese_wanikani.ts similarity index 83% rename from netlify/functions/japanese_wanikani.ts rename to api/japanese_wanikani.ts index 75a385d..96ba700 100644 --- a/netlify/functions/japanese_wanikani.ts +++ b/api/japanese_wanikani.ts @@ -1,6 +1,6 @@ -import {type Handler} from "@netlify/functions"; -import {type WanikaniInfo} from "#Infos/Japanese/Wanikani.js"; -import { WKLevelProgression, WKResetCollection, WKSummary } from "@bachmacintosh/wanikani-api-types"; +import {type WanikaniInfo} from "#Infos/Japanese/Wanikani.tsx"; +import type { WKLevelProgression, WKResetCollection, WKSummary } from "@bachmacintosh/wanikani-api-types"; +import type { Handler } from ".."; interface Subject { id: number; @@ -48,7 +48,7 @@ function addStuffToLearn(ids: number[], data: {available_at: string; subject_ids return arr; } -const handler: Handler = async () => { +export const japanese_wanikani: Handler = async () => { const urlsToRequest = [ "https://api.wanikani.com/v2/level_progressions", "https://api.wanikani.com/v2/resets", @@ -56,8 +56,8 @@ const handler: Handler = async () => { ]; const toRequest = urlsToRequest.map((url) => new Promise(async (resolve) => { const response = await fetch(url, {headers: { - "Authorization": `Bearer ${process.env.API_WANIKANI}`, - "Content-Type": "application/json", + "Authorization": `Bearer ${process.env["API_WANIKANI"]}`, + "Content-Type": "application.json", }}); resolve(await response.json()); })); @@ -92,8 +92,8 @@ const handler: Handler = async () => { const subjectIdsAll = subjectIdsLessons.concat(subjectIdsReviews); const subjects = await (await fetch(`https://api.wanikani.com/v2/subjects?ids=${subjectIdsAll.toString()}`, {headers: { - "Authorization": `Bearer ${process.env.API_WANIKANI}`, - "Content-Type": "application/json", + "Authorization": `Bearer ${process.env["API_WANIKANI"]}`, + "Content-Type": "application.json", }})).json() as {data: Subject[]}; const lessons = addStuffToLearn(subjectIdsLessons, summary.data.lessons, subjects.data); @@ -107,10 +107,7 @@ const handler: Handler = async () => { moreThingsToReviewAt, }; - return { - statusCode: 200, - body: JSON.stringify(info), - }; + return new Response(new Blob([JSON.stringify(info)], { + type: "application/json", + }), {status: 200}); }; - -export {handler}; diff --git a/netlify/functions/media_anilist.ts b/api/media_anilist.ts similarity index 88% rename from netlify/functions/media_anilist.ts rename to api/media_anilist.ts index 233c042..9316e53 100644 --- a/netlify/functions/media_anilist.ts +++ b/api/media_anilist.ts @@ -1,7 +1,7 @@ -import {type Handler} from "@netlify/functions"; -import {type AnilistInfo} from "#Infos/Media/Anilist.js"; +import {type AnilistInfo} from "#Infos/Media/Anilist.tsx"; +import type { Handler } from ".."; -const handler: Handler = async () => { +export const media_anilist: Handler = async () => { const anilist = await fetch("https://graphql.anilist.co", { method: "POST", headers: { @@ -63,10 +63,7 @@ const handler: Handler = async () => { anime.updateDate = anime.updateDate.substring(0, anime.updateDate.indexOf("T")); anime.endDate = anime.endDate.substring(0, anime.endDate.indexOf("T")); - return { - statusCode: 200, - body: JSON.stringify(anime), - }; + return new Response(new Blob([JSON.stringify(anime)], { + type: "application/json", + }), {status: 200}); }; - -export {handler}; diff --git a/netlify/functions/media_lastfm.ts b/api/media_lastfm.ts similarity index 77% rename from netlify/functions/media_lastfm.ts rename to api/media_lastfm.ts index 437988e..3956240 100644 --- a/netlify/functions/media_lastfm.ts +++ b/api/media_lastfm.ts @@ -1,8 +1,8 @@ -import {type Handler} from "@netlify/functions"; -import {type LastfmInfo} from "#Infos/Media/Lastfm.js"; +import {type LastfmInfo} from "#Infos/Media/Lastfm.tsx"; +import type { Handler } from ".."; -const handler: Handler = async () => { - const lastfm = await (await fetch(`https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=TTTaevas&api_key=${process.env.API_LASTFM}&format=json&limit=1`)).json() as { +export const media_lastfm: Handler = async () => { + const lastfm = await (await fetch(`https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=TTTaevas&api_key=${process.env["API_LASTFM"]}&format=json&limit=1`)).json() as { recenttracks: { track: { artist: { @@ -39,10 +39,7 @@ const handler: Handler = async () => { date: lastfm.recenttracks.track[0].date?.uts ?? String(Date.now()), }; - return { - statusCode: 200, - body: JSON.stringify(track), - }; + return new Response(new Blob([JSON.stringify(track)], { + type: "application/json", + }), {status: 200}); }; - -export {handler}; diff --git a/netlify/functions/token.ts b/api/token.ts similarity index 79% rename from netlify/functions/token.ts rename to api/token.ts index 74a34f1..4ae6240 100644 --- a/netlify/functions/token.ts +++ b/api/token.ts @@ -1,18 +1,19 @@ -import {type Handler} from "@netlify/functions"; -import {InsertOneResult, MongoClient} from "mongodb"; - +import {MongoClient, type InsertOneResult} from "mongodb"; import {API} from "osu-api-v2-js"; +import type { Handler } from ".."; export interface Token { access_token: string; expires: Date; } -const handler: Handler = async (req) => { - const service = req.queryStringParameters?.service; - if (!service) {return {statusCode: 400};} +export const token: Handler = async (params) => { + const service = params.get("service"); + if (!service) { + return new Response("Bad Request", {status: 400}); + } - const client = new MongoClient(process.env.URL_MONGODB!); + const client = new MongoClient(process.env["URL_MONGODB"]!); await client.connect(); const db = client.db("tokens"); @@ -27,14 +28,14 @@ const handler: Handler = async (req) => { if (!token) { const collections = await db.listCollections().toArray(); - if (!collections.find((c) => c.name === service)) {client.close(); return {statusCode: 400};} + if (!collections.find((c) => c.name === service)) {client.close(); return new Response("Not Found", {status: 404});} promises.push(new Promise(async (resolve, reject) => { console.log(`Setting a new token for ${service}...`); let insertion: InsertOneResult; if (service === "osu") { - const api = await API.createAsync(11451, process.env.API_OSU!); + const api = await API.createAsync(11451, process.env["API_OSU"]!); insertion = await collection.insertOne({ access_token: api.access_token, expires: api.expires, @@ -47,7 +48,7 @@ const handler: Handler = async (req) => { headers: { "Content-Type": "application/x-www-form-urlencoded" }, - body: `username=${process.env.USERNAME_UMAMI}&password=${process.env.PASSWORD_UMAMI}` + body: `username=${process.env["USERNAME_UMAMI"]}&password=${process.env["PASSWORD_UMAMI"]}` }); const json: {token: string} = await response.json(); @@ -90,9 +91,5 @@ const handler: Handler = async (req) => { await Promise.all(promises); void client.close(); - return { - statusCode: 200, - }; + return new Response(null, {status: 200}); }; - -export {handler}; \ No newline at end of file diff --git a/netlify/functions/website_umami.ts b/api/website_umami.ts similarity index 72% rename from netlify/functions/website_umami.ts rename to api/website_umami.ts index 9fe0b71..2482402 100644 --- a/netlify/functions/website_umami.ts +++ b/api/website_umami.ts @@ -1,10 +1,10 @@ -import { UmamiInfo } from "#Infos/Website/Umami.js"; -import {type Handler} from "@netlify/functions"; import { MongoClient } from "mongodb"; -import { Token } from "./token.js"; +import type { Handler } from "../index.ts"; +import type { UmamiInfo } from "#Infos/Website/Umami.tsx"; +import type { Token } from "./token.ts"; -const handler: Handler = async () => { - const client = new MongoClient(process.env.URL_MONGODB!); +export const website_umami: Handler = async () => { + const client = new MongoClient(process.env["URL_MONGODB"]!); await client.connect(); const db = client.db("tokens"); @@ -17,7 +17,7 @@ const handler: Handler = async () => { const now = new Date(); const response = await fetch(`${api_server}/websites/${website_id}/stats?startAt=${Number(new Date("2025"))}&endAt=${Number(now)}`, { headers: { - "Accept": "application/json", + "Accept": "application.json", "Authorization": `Bearer ${token?.access_token}` }, }); @@ -33,9 +33,7 @@ const handler: Handler = async () => { }; if (!umami) { - return { - statusCode: 404, - }; + return new Response("Not Found", {status: 404}); } const info: UmamiInfo = { @@ -45,10 +43,7 @@ const handler: Handler = async () => { totaltime: umami.totaltime.value }; - return { - statusCode: 200, - body: JSON.stringify(info), - }; + return new Response(new Blob([JSON.stringify(info)], { + type: "application/json", + }), {status: 200}); }; - -export {handler}; diff --git a/public/brittany.jpg b/assets/brittany.jpg similarity index 100% rename from public/brittany.jpg rename to assets/brittany.jpg diff --git a/public/fonts/LexendDeca-Regular.ttf b/assets/fonts/LexendDeca-Regular.ttf similarity index 100% rename from public/fonts/LexendDeca-Regular.ttf rename to assets/fonts/LexendDeca-Regular.ttf diff --git a/public/lain.png b/assets/lain.png similarity index 100% rename from public/lain.png rename to assets/lain.png diff --git a/public/logos/anilist.svg b/assets/logos/anilist.svg similarity index 100% rename from public/logos/anilist.svg rename to assets/logos/anilist.svg diff --git a/public/logos/github.svg b/assets/logos/github.svg similarity index 100% rename from public/logos/github.svg rename to assets/logos/github.svg diff --git a/public/logos/gitlab.svg b/assets/logos/gitlab.svg similarity index 100% rename from public/logos/gitlab.svg rename to assets/logos/gitlab.svg diff --git a/public/logos/lastdotfm.png b/assets/logos/lastdotfm.png similarity index 100% rename from public/logos/lastdotfm.png rename to assets/logos/lastdotfm.png diff --git a/public/logos/matrix.svg b/assets/logos/matrix.svg similarity index 100% rename from public/logos/matrix.svg rename to assets/logos/matrix.svg diff --git a/public/logos/osu.svg b/assets/logos/osu.svg similarity index 100% rename from public/logos/osu.svg rename to assets/logos/osu.svg diff --git a/public/logos/speedrundotcom.png b/assets/logos/speedrundotcom.png similarity index 100% rename from public/logos/speedrundotcom.png rename to assets/logos/speedrundotcom.png diff --git a/public/logos/youtube.svg b/assets/logos/youtube.svg similarity index 100% rename from public/logos/youtube.svg rename to assets/logos/youtube.svg diff --git a/public/osu_rulesets/fruits.png b/assets/osu_rulesets/fruits.png similarity index 100% rename from public/osu_rulesets/fruits.png rename to assets/osu_rulesets/fruits.png diff --git a/public/osu_rulesets/mania.png b/assets/osu_rulesets/mania.png similarity index 100% rename from public/osu_rulesets/mania.png rename to assets/osu_rulesets/mania.png diff --git a/public/osu_rulesets/osu.png b/assets/osu_rulesets/osu.png similarity index 100% rename from public/osu_rulesets/osu.png rename to assets/osu_rulesets/osu.png diff --git a/public/osu_rulesets/taiko.png b/assets/osu_rulesets/taiko.png similarity index 100% rename from public/osu_rulesets/taiko.png rename to assets/osu_rulesets/taiko.png diff --git a/public/swordventure.png b/assets/swordventure.png similarity index 100% rename from public/swordventure.png rename to assets/swordventure.png diff --git a/bun.lockb b/bun.lockb index afd5d0fb7d30492f4301fe94b3e953a108fa3b17..352c549272b030a34979c1ce753f4cf7304d06e8 100755 GIT binary patch delta 55096 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