package io.papermc.paper;
import java.time.Instant;
import java.util.Optional;
import java.util.OptionalInt;
import net.kyori.adventure.key.Key;
import net.kyori.adventure.util.Services;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* Information about the current server build.
*/
@NullMarked
@ApiStatus.NonExtendable
public interface ServerBuildInfo {
/**
* The brand id for Paper.
*/
Key BRAND_PAPER_ID = Key.key("papermc", "paper");
/**
* Gets the {@code ServerBuildInfo}.
*
* @return the {@code ServerBuildInfo}
*/
static ServerBuildInfo buildInfo() {
//
final class Holder {
static final Optional INSTANCE = Services.service(ServerBuildInfo.class);
}
//
return Holder.INSTANCE.orElseThrow();
}
/**
* Gets the brand id of the server.
*
* @return the brand id of the server (e.g. "papermc:paper")
*/
Key brandId();
/**
* Checks if the current server supports the specified brand.
*
* @param brandId the brand to check (e.g. "papermc:folia")
* @return {@code true} if the server supports the specified brand
*/
@ApiStatus.Experimental
boolean isBrandCompatible(final Key brandId);
/**
* Gets the brand name of the server.
*
* @return the brand name of the server (e.g. "Paper")
*/
String brandName();
/**
* Gets the Minecraft version id.
*
* @return the Minecraft version id (e.g. "1.20.4", "1.20.2-pre2", "23w31a")
*/
String minecraftVersionId();
/**
* Gets the Minecraft version name.
*
* @return the Minecraft version name (e.g. "1.20.4", "1.20.2 Pre-release 2", "23w31a")
*/
String minecraftVersionName();
/**
* Gets the build number.
*
* @return the build number
*/
OptionalInt buildNumber();
/**
* Gets the build time.
*
* @return the build time
*/
Instant buildTime();
/**
* Gets the git commit branch.
*
* @return the git commit branch
*/
Optional gitBranch();
/**
* Gets the git commit hash.
*
* @return the git commit hash
*/
Optional gitCommit();
/**
* Creates a string representation of the server build information.
*
* @param representation the type of representation
* @return a string
*/
String asString(final StringRepresentation representation);
/**
* String representation types.
*/
enum StringRepresentation {
/**
* A simple version string, in format {@code --}.
*/
VERSION_SIMPLE,
/**
* A simple version string, in format {@code --@ ()}.
*/
VERSION_FULL,
}
}