79 lines
2.1 KiB
Bash
79 lines
2.1 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
required_variables=(
|
|
CHANGELOG_FILE
|
|
CURSEFORGE_API_TOKEN
|
|
CURSEFORGE_PROJECT_ID
|
|
DISPLAY_NAME
|
|
JAR_PATH
|
|
MINECRAFT_VERSION
|
|
RELEASE_TYPE
|
|
)
|
|
|
|
for variable in "${required_variables[@]}"; do
|
|
if [[ -z "${!variable:-}" ]]; then
|
|
echo "::error::$variable is required for the CurseForge upload."
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
if [[ ! "$CURSEFORGE_PROJECT_ID" =~ ^[0-9]+$ ]]; then
|
|
echo "::error::CURSEFORGE_PROJECT_ID must be the numeric project ID from the CurseForge project page."
|
|
exit 1
|
|
fi
|
|
if [[ ! -f "$JAR_PATH" || ! -f "$CHANGELOG_FILE" ]]; then
|
|
echo "::error::The release JAR or changelog file is missing."
|
|
exit 1
|
|
fi
|
|
if [[ "$RELEASE_TYPE" != "alpha" && "$RELEASE_TYPE" != "beta" && "$RELEASE_TYPE" != "release" ]]; then
|
|
echo "::error::RELEASE_TYPE must be alpha, beta, or release."
|
|
exit 1
|
|
fi
|
|
|
|
metadata_file="$(mktemp)"
|
|
response_file="$(mktemp)"
|
|
trap 'rm -f "$metadata_file" "$response_file"' EXIT
|
|
|
|
jq -n \
|
|
--rawfile changelog "$CHANGELOG_FILE" \
|
|
--arg display_name "$DISPLAY_NAME" \
|
|
--arg minecraft_version "$MINECRAFT_VERSION" \
|
|
--arg release_type "$RELEASE_TYPE" \
|
|
'{
|
|
changelog: $changelog,
|
|
changelogType: "markdown",
|
|
displayName: $display_name,
|
|
gameVersionNames: [$minecraft_version, "Forge", "Client", "Server"],
|
|
releaseType: $release_type,
|
|
relations: {
|
|
projects: [
|
|
{
|
|
slug: "ascend",
|
|
projectID: "1383429",
|
|
type: "optionalDependency"
|
|
}
|
|
]
|
|
}
|
|
}' > "$metadata_file"
|
|
|
|
upload_url="https://minecraft.curseforge.com/api/projects/${CURSEFORGE_PROJECT_ID}/upload-file"
|
|
if ! curl \
|
|
--silent \
|
|
--show-error \
|
|
--fail-with-body \
|
|
--retry 3 \
|
|
--retry-delay 2 \
|
|
--header "X-Api-Token: ${CURSEFORGE_API_TOKEN}" \
|
|
--form "metadata=<${metadata_file};type=application/json" \
|
|
--form "file=@${JAR_PATH};type=application/java-archive" \
|
|
--output "$response_file" \
|
|
"$upload_url"; then
|
|
echo "::error::CurseForge rejected the upload. Response:"
|
|
cat "$response_file" >&2
|
|
exit 1
|
|
fi
|
|
|
|
file_id="$(jq -er '.id' "$response_file")"
|
|
echo "Uploaded $(basename "$JAR_PATH") to CurseForge as file ID $file_id."
|