2024-04-16 22:50:42 +01:00
|
|
|
import { Card } from "@/app/components/card";
|
|
|
|
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/app/components/ui/table";
|
2024-04-16 22:53:57 +01:00
|
|
|
import { generateEmbed } from "@/common/embed";
|
2024-04-16 22:55:45 +01:00
|
|
|
import { capitalizeFirstLetter } from "@/common/string-utils";
|
2024-04-16 22:50:42 +01:00
|
|
|
import { cn } from "@/common/utils";
|
|
|
|
import { getMojangEndpointStatus } from "mcutils-library";
|
|
|
|
import { CachedEndpointStatus } from "mcutils-library/dist/types/cache/cachedEndpointStatus";
|
2024-04-16 22:53:57 +01:00
|
|
|
import { Metadata } from "next";
|
2024-04-16 22:50:42 +01:00
|
|
|
import Link from "next/link";
|
|
|
|
|
2024-04-16 23:53:10 +01:00
|
|
|
/**
|
|
|
|
* Force the page to be dynamic, so it will be regenerated on every request
|
|
|
|
*/
|
|
|
|
export const dynamic = "force-dynamic";
|
|
|
|
|
2024-04-16 22:50:42 +01:00
|
|
|
/**
|
|
|
|
* Gets the color of the status
|
|
|
|
*
|
|
|
|
* @param status the status of the endpoint
|
|
|
|
* @returns the color of the status
|
|
|
|
*/
|
|
|
|
function getColor(status: any): string {
|
|
|
|
switch (status) {
|
|
|
|
case "ONLINE":
|
|
|
|
return "text-green-500";
|
|
|
|
case "DEGRADED":
|
|
|
|
return "text-yellow-500";
|
|
|
|
case "OFFLINE":
|
|
|
|
return "text-red-500";
|
|
|
|
default:
|
|
|
|
return "text-gray-500";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-04-16 22:55:45 +01:00
|
|
|
/**
|
|
|
|
* Formats the status
|
|
|
|
*
|
|
|
|
* @param status the status of the endpoint
|
|
|
|
* @returns the formatted status
|
|
|
|
*/
|
|
|
|
function formatStatus(status: any): string {
|
|
|
|
return capitalizeFirstLetter(status.toLowerCase());
|
|
|
|
}
|
|
|
|
|
2024-04-16 22:53:57 +01:00
|
|
|
async function getData(): Promise<CachedEndpointStatus> {
|
|
|
|
const status = await getMojangEndpointStatus();
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
|
|
|
export async function generateMetadata(): Promise<Metadata> {
|
|
|
|
const { endpoints } = await getData();
|
|
|
|
|
2024-04-16 23:04:55 +01:00
|
|
|
let description = "The current status of Mojang Services";
|
2024-04-16 22:56:30 +01:00
|
|
|
description += Object.entries(endpoints)
|
2024-04-16 22:53:57 +01:00
|
|
|
.map(([url, status]) => {
|
2024-04-16 23:04:55 +01:00
|
|
|
return `**${url}**: ${formatStatus(status)}`;
|
2024-04-16 22:53:57 +01:00
|
|
|
})
|
|
|
|
.join("\n");
|
|
|
|
|
|
|
|
return generateEmbed({
|
|
|
|
title: "Mojang Status",
|
|
|
|
description: description,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2024-04-16 22:50:42 +01:00
|
|
|
export default async function Page(): Promise<JSX.Element> {
|
|
|
|
const { endpoints } = await getData();
|
|
|
|
const endpointsSize = Object.entries(endpoints).length;
|
|
|
|
|
|
|
|
return (
|
|
|
|
<div className="flex justify-center text-center">
|
|
|
|
<Card className="w-max xs:w-fit">
|
|
|
|
<h1 className="text-xl">Mojang Status</h1>
|
|
|
|
<p>The current status of Mojang Services</p>
|
|
|
|
|
|
|
|
<div>
|
|
|
|
{endpointsSize === 0 && <p>Unable to fetch endpoint statuses</p>}
|
|
|
|
{endpointsSize > 0 && (
|
|
|
|
<Table className="mt-4 md:w-[500px] text-start">
|
|
|
|
<TableHeader>
|
|
|
|
<TableRow>
|
|
|
|
<TableHead className="pl-1">Service</TableHead>
|
|
|
|
<TableHead className="pl-1 text-center">Status</TableHead>
|
|
|
|
</TableRow>
|
|
|
|
</TableHeader>
|
|
|
|
<TableBody>
|
|
|
|
{Object.entries(endpoints).map(([url, status]) => {
|
|
|
|
return (
|
|
|
|
<TableRow key={url}>
|
|
|
|
<TableCell className="p-[0.3rem]">
|
|
|
|
<Link className="hover:text-primary transition-all" href={url} target="_blank">
|
|
|
|
{url}
|
|
|
|
</Link>
|
|
|
|
</TableCell>
|
2024-04-16 22:55:45 +01:00
|
|
|
<TableCell className={cn(getColor(status), "p-[0.3rem] text-center")}>
|
|
|
|
{formatStatus(status)}
|
|
|
|
</TableCell>
|
2024-04-16 22:50:42 +01:00
|
|
|
</TableRow>
|
|
|
|
);
|
|
|
|
})}
|
|
|
|
</TableBody>
|
|
|
|
</Table>
|
|
|
|
)}
|
|
|
|
</div>
|
|
|
|
</Card>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|