Add the GameDev Info and Alakajam!

Felt hugely necessary, actually
This commit is contained in:
Taevas 2025-04-14 14:29:11 +02:00
parent 7f6cb1ef3d
commit 35274fbe80
Signed by: Taevas
SSH key fingerprint: SHA256:Y5Hv18xwPvUKSlgkx1sPnRO3L2mc03ehC7BzrnZVEyY
5 changed files with 140 additions and 0 deletions

View file

@ -5,6 +5,7 @@ import { kitsudev } from "./infos/coding/kitsudev";
import { kitsuclub } from "./infos/fediverse/kitsuclub";
// import { osu } from "./infos/gaming/osu";
import { speedruncom } from "./infos/gaming/speedruncom";
import { alakajam } from "./infos/gamedev/alakajam";
// import { hackthebox } from "./infos/hacking/hackthebox";
// import { wanikani } from "./infos/japanese/wanikani";
import { anilist } from "./infos/media/anilist";
@ -16,6 +17,7 @@ const info_routes: Record<string, Handler[]> = {
coding: [github, gitlab, kitsudev],
fediverse: [kitsuclub],
gaming: [speedruncom],
gamedev: [alakajam],
// hacking: [hackthebox],
// japanese: [wanikani],
media: [anilist, lastfm],

View file

@ -0,0 +1,55 @@
import type { AlakajamInfo } from "#Infos/GameDev/Alakajam.tsx";
import type { Handler } from "../..";
const username = "Taevas";
export const alakajam: Handler = async () => {
/** https://alakajam.com/api */
const response = await (await fetch(`https://alakajam.com/api/user/${username}/latestEntry`)).json() as {
name: string
latest_entry: {
event_name: string
division: string
title: string
description: string
url: string
results: {
rating_1: string | null
rating_2: string | null
rating_3: string | null
rating_4: string | null
rating_5: string | null
rating_6: string | null
ranking_1: number | null
ranking_2: number | null
ranking_3: number | null
ranking_4: number | null
ranking_5: number | null
ranking_6: number | null
}
}
};
const activity: AlakajamInfo = {
username: response.name,
event: {
name: response.latest_entry.event_name,
division: response.latest_entry.division
},
entry: {
name: response.latest_entry.title,
description: response.latest_entry.description,
url: response.latest_entry.url
},
results: {
overall: {rating: response.latest_entry.results.rating_1, ranking: response.latest_entry.results.ranking_1},
graphics: {rating: response.latest_entry.results.rating_2, ranking: response.latest_entry.results.ranking_2},
audio: {rating: response.latest_entry.results.rating_3, ranking: response.latest_entry.results.ranking_3},
gameplay: {rating: response.latest_entry.results.rating_4, ranking: response.latest_entry.results.ranking_4},
originality: {rating: response.latest_entry.results.rating_5, ranking: response.latest_entry.results.ranking_5},
theme: {rating: response.latest_entry.results.rating_6, ranking: response.latest_entry.results.ranking_6},
}
};
return Response.json(activity, {status: 200});
};

View file

@ -0,0 +1,65 @@
import React, {useState, useEffect} from "react";
import Website from "../Website.tsx";
import ButtonLink from "#parts/ButtonLink.tsx";
import DataHandler from "#parts/DataHandler.tsx";
import Link from "#parts/Link.tsx";
export type AlakajamInfo = {
username: string
event: {
name: string
division: string
}
entry: {
name: string
description: string
url: string
}
results: {
overall: {rating: string | null, ranking: number | null}
graphics: {rating: string | null, ranking: number | null}
audio: {rating: string | null, ranking: number | null}
gameplay: {rating: string | null, ranking: number | null}
originality: {rating: string | null, ranking: number | null}
theme: {rating: string | null, ranking: number | null}
}
} | undefined;
export default function Alakajam() {
const {data, error, setError} = DataHandler<AlakajamInfo>("infos/gamedev/alakajam", 60 * 120);
const [elements, setElements] = useState([] as React.JSX.Element[]);
useEffect(() => {
if (data) {
try {
setElements([
<Link
key="presentation"
classes="p-2 inline-block bg-white font-bold text-blue-800"
link={data.entry.url}
text={
<>
<h2 className="text-2xl mb-2">{data.entry.name}</h2>
<p className="leading-[1.3]">{data.entry.description}</p>
<i className="text-xs">{data.event.name} ({data.event.division})</i>
</>
}
/>,
<>{data.results.overall.rating ? <p key="results" className="text-left mt-2">With an overall rating of <b>{data.results.overall.rating.substring(0, 3)}/10</b>, this game <b>was ranked #{data.results.overall.ranking}</b> when the gamejam ended!</p> : <></>}</>
]);
} catch {
setError(true);
}
}
}, [data]);
return (
<Website
name="Alakajam!"
link={data?.username ? `https://alakajam.com/user/${data.username}` : "https://alakajam.com/user/Taevas"}
elements={elements}
error={error}
/>
);
}

View file

@ -0,0 +1,16 @@
import React from "react";
import Info from "../Info.tsx";
import Alakajam from "./Alakajam.tsx";
export default function GameDev() {
const alakajam = <Alakajam key="alakajam"/>;
return (
<Info
type="Game Dev"
websites={[
alakajam
]}
/>
);
}

View file

@ -3,6 +3,7 @@ import Media from "./Media/index.tsx";
// import Hacking from "./Hacking/index.tsx";
import Coding from "./Coding/index.tsx";
import Gaming from "./Gaming/index.tsx";
import GameDev from "./GameDev/index.tsx";
// import Japanese from "./Japanese/index.tsx";
import Fediverse from "./Fediverse/index.tsx";
import Website from "./Website/index.tsx";
@ -19,6 +20,7 @@ export default class Infos extends Component {
<Media/>
<Fediverse/>
<Coding/>
<GameDev/>
{/*<Japanese/>*/}
<Gaming/>
{/*<Hacking/>*/}