ModReleaser/src/services/meta.ts

107 lines
3.4 KiB
TypeScript
Raw Normal View History

"use server";
import { modrinthClient, curseforgeClient } from "./clients";
import { getLoaders, getGameVersions as getModrinthGameVersions } from "@/lib/modrinth";
import { getVersionTypes, getGameVersions, getMinecraftVersions } from "@/lib/curseforge";
import { SemVer } from "@/lib/utils/templates/semver";
import { EnvironmentSchema } from "@/types";
const ENVIRONMENT_LABELS: Record<string, string> = {
unknown: "Unknown environment",
client_only: "Client-side only",
server_only: "Server-side only (singleplayer compatible)",
dedicated_server_only: "Dedicated server only",
client_and_server: "Required on both",
server_only_client_optional: "Optional on client",
client_only_server_optional: "Optional on server",
client_or_server_prefers_both: "Optional on both (prefers both)",
client_or_server: "Optional on both (either side)",
singleplayer_only: "Singleplayer only",
};
/**
* Modrinth
* ConfigModal loaders
*/
export async function getModrinthLoaders(): Promise<string[]> {
const loaders = await getLoaders(modrinthClient);
return loaders.map((l) => l.name);
}
/**
* Modrinth Minecraft
* ConfigModal game_versions
*/
export async function getModrinthMcVersions(): Promise<string[]> {
const versions = await getModrinthGameVersions(modrinthClient);
return versions
.filter((v) => v.version_type === "release")
.map((v) => v.version);
}
/**
* Modrinth Ant Design Select
* 使 OptGroup Client / Server / Both / Other
*/
export async function getModrinthEnvironments(): Promise<
{ value: string; label: string }[]
> {
return EnvironmentSchema.options.map((value) => ({
value,
label: ENVIRONMENT_LABELS[value] ?? value,
}));
}
/**
* CurseForge
* Game Version Types Environment / Modloader ID
* Game Versions gameVersionTypeID
*/
export async function getCurseForgeMeta(): Promise<{
environments: string[];
loaders: string[];
}> {
const [versionTypes, gameVersions] = await Promise.all([
getVersionTypes(curseforgeClient),
getGameVersions(curseforgeClient),
]);
const environmentTypeId = versionTypes.find(
(t) => t.name === "Environment",
)?.id;
const modloaderTypeId = versionTypes.find(
(t) => t.name === "Modloader",
)?.id;
const environments =
environmentTypeId != null
? gameVersions
.filter((v) => v.gameVersionTypeID === environmentTypeId)
.map((v) => v.name)
: [];
const loaders =
modloaderTypeId != null
? gameVersions
.filter((v) => v.gameVersionTypeID === modloaderTypeId)
.map((v) => v.name)
: [];
return { environments, loaders };
}
/**
* CurseForge Minecraft
* /v1/minecraft/version
* versionString "preRelease"
*/
export async function getCurseForgeMcVersions(): Promise<string[]> {
const versions = await getMinecraftVersions(curseforgeClient);
return versions
.filter((v) => {
const sv = SemVer.parse(v.versionString);
return sv.preRelease === null;
})
.map((v) => v.versionString);
}