373 lines
11 KiB
Java
373 lines
11 KiB
Java
package world.bentobox.bentobox.versions;
|
|
|
|
import java.util.Arrays;
|
|
import java.util.LinkedList;
|
|
import java.util.List;
|
|
import java.util.Locale;
|
|
|
|
import org.bukkit.Bukkit;
|
|
import org.eclipse.jdt.annotation.NonNull;
|
|
import org.eclipse.jdt.annotation.Nullable;
|
|
|
|
/**
|
|
* Checks and ensures the current server software is compatible with BentoBox.
|
|
* @author Poslovitch
|
|
*/
|
|
public class ServerCompatibility {
|
|
|
|
// ---- SINGLETON ----
|
|
|
|
private static final ServerCompatibility instance = new ServerCompatibility();
|
|
|
|
public static ServerCompatibility getInstance() {
|
|
return instance;
|
|
}
|
|
|
|
private ServerCompatibility() {
|
|
}
|
|
|
|
// ---- CONTENT ----
|
|
|
|
private Compatibility result;
|
|
|
|
public enum Compatibility {
|
|
/**
|
|
* The server software is compatible with the current version of BentoBox.
|
|
* There shouldn't be any issues.
|
|
*/
|
|
COMPATIBLE(true),
|
|
|
|
/**
|
|
* The server software might not be compatible but is supported.
|
|
* Issues might occur.
|
|
*/
|
|
SUPPORTED(true),
|
|
|
|
/**
|
|
* The server software is not supported, even though BentoBox may work fine.
|
|
* Issues are likely and will receive limited support.
|
|
*/
|
|
NOT_SUPPORTED(true),
|
|
|
|
/**
|
|
* The server software is explicitly not supported and incompatible.
|
|
* BentoBox won't run on it: that's pointless to try to run it.
|
|
*/
|
|
INCOMPATIBLE(false);
|
|
|
|
private final boolean canLaunch;
|
|
|
|
Compatibility(boolean canLaunch) {
|
|
this.canLaunch = canLaunch;
|
|
}
|
|
|
|
public boolean isCanLaunch() {
|
|
return canLaunch;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Provides a list of server software.
|
|
* Any software that is not listed here is implicitly considered as "INCOMPATIBLE".
|
|
*/
|
|
public enum ServerSoftware {
|
|
CRAFTBUKKIT(Compatibility.INCOMPATIBLE), BUKKIT(Compatibility.INCOMPATIBLE),
|
|
GLOWSTONE(Compatibility.INCOMPATIBLE), SPIGOT(Compatibility.COMPATIBLE), PAPER(Compatibility.SUPPORTED),
|
|
PURPUR(Compatibility.SUPPORTED), TACOSPIGOT(Compatibility.NOT_SUPPORTED), AKARIN(Compatibility.NOT_SUPPORTED),
|
|
/**
|
|
* @since 1.14.0
|
|
*/
|
|
UNKNOWN(Compatibility.INCOMPATIBLE);
|
|
|
|
private final Compatibility compatibility;
|
|
/**
|
|
* @since 1.14.0
|
|
*/
|
|
private String name;
|
|
|
|
ServerSoftware(Compatibility compatibility) {
|
|
this.compatibility = compatibility;
|
|
}
|
|
|
|
/**
|
|
* @return the name
|
|
* @since 1.14.0
|
|
*/
|
|
public String getName() {
|
|
return name;
|
|
}
|
|
|
|
/**
|
|
* @param name the name to set
|
|
* @since 1.14.0
|
|
*/
|
|
public ServerSoftware setName(String name) {
|
|
this.name = name;
|
|
return this;
|
|
}
|
|
|
|
public Compatibility getCompatibility() {
|
|
return compatibility;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Provides a list of server versions.
|
|
* Any version that is not listed here is implicitly considered as "INCOMPATIBLE".
|
|
*/
|
|
public enum ServerVersion {
|
|
V1_13(Compatibility.INCOMPATIBLE), V1_13_1(Compatibility.INCOMPATIBLE), V1_13_2(Compatibility.INCOMPATIBLE),
|
|
/**
|
|
* @since 1.5.0
|
|
*/
|
|
V1_14(Compatibility.INCOMPATIBLE),
|
|
/**
|
|
* @since 1.5.0
|
|
*/
|
|
V1_14_1(Compatibility.INCOMPATIBLE),
|
|
/**
|
|
* @since 1.5.0
|
|
*/
|
|
V1_14_2(Compatibility.INCOMPATIBLE),
|
|
/**
|
|
* @since 1.6.0
|
|
*/
|
|
V1_14_3(Compatibility.INCOMPATIBLE),
|
|
/**
|
|
* @since 1.6.0
|
|
*/
|
|
V1_14_4(Compatibility.INCOMPATIBLE),
|
|
/**
|
|
* @since 1.9.2
|
|
*/
|
|
V1_15(Compatibility.INCOMPATIBLE),
|
|
/**
|
|
* @since 1.10.0
|
|
*/
|
|
V1_15_1(Compatibility.INCOMPATIBLE),
|
|
/**
|
|
* @since 1.11.0
|
|
*/
|
|
V1_15_2(Compatibility.INCOMPATIBLE),
|
|
/**
|
|
* @since 1.14.0
|
|
*/
|
|
V1_16_1(Compatibility.INCOMPATIBLE),
|
|
/**
|
|
* @since 1.15.0
|
|
*/
|
|
V1_16_2(Compatibility.INCOMPATIBLE),
|
|
/**
|
|
* @since 1.15.1
|
|
*/
|
|
V1_16_3(Compatibility.INCOMPATIBLE),
|
|
|
|
/**
|
|
* @since 1.15.3
|
|
*/
|
|
V1_16_4(Compatibility.INCOMPATIBLE),
|
|
|
|
/**
|
|
* @since 1.16.0
|
|
*/
|
|
V1_16_5(Compatibility.INCOMPATIBLE),
|
|
|
|
/**
|
|
* @since 1.17.0
|
|
*/
|
|
V1_17(Compatibility.INCOMPATIBLE),
|
|
/**
|
|
* @since 1.17.1
|
|
*/
|
|
V1_17_1(Compatibility.INCOMPATIBLE),
|
|
/**
|
|
* @since 1.19.0
|
|
*/
|
|
V1_18(Compatibility.INCOMPATIBLE),
|
|
/**
|
|
* @since 1.19.0
|
|
*/
|
|
V1_18_1(Compatibility.INCOMPATIBLE),
|
|
/**
|
|
* @since 1.20.1
|
|
*/
|
|
V1_18_2(Compatibility.INCOMPATIBLE),
|
|
/**
|
|
* @since 1.21.0
|
|
*/
|
|
V1_19(Compatibility.COMPATIBLE),
|
|
/**
|
|
* @since 1.21.0
|
|
*/
|
|
V1_19_1(Compatibility.COMPATIBLE),
|
|
/**
|
|
* @since 1.21.0
|
|
*/
|
|
V1_19_2(Compatibility.COMPATIBLE),
|
|
/**
|
|
* @since 1.22.0
|
|
*/
|
|
V1_19_3(Compatibility.COMPATIBLE),
|
|
/**
|
|
* @since 1.22.1
|
|
*/
|
|
V1_19_4(Compatibility.COMPATIBLE),
|
|
/**
|
|
* @since 1.24.0
|
|
*/
|
|
V1_20(Compatibility.INCOMPATIBLE),
|
|
/**
|
|
* @since 1.24.0
|
|
*/
|
|
V1_20_1(Compatibility.COMPATIBLE),
|
|
/**
|
|
* @since 2.0.0
|
|
*/
|
|
V1_20_2(Compatibility.COMPATIBLE),
|
|
/**
|
|
* @since 2.0.0
|
|
*/
|
|
V1_20_3(Compatibility.COMPATIBLE),
|
|
/**
|
|
* @since 2.0.0
|
|
*/
|
|
V1_20_4(Compatibility.COMPATIBLE),
|
|
/**
|
|
* @since 2.4.0
|
|
*/
|
|
V1_20_5(Compatibility.COMPATIBLE),
|
|
/**
|
|
* @since 2.4.0
|
|
*/
|
|
V1_20_6(Compatibility.COMPATIBLE);
|
|
|
|
private final Compatibility compatibility;
|
|
|
|
ServerVersion(Compatibility compatibility) {
|
|
this.compatibility = compatibility;
|
|
}
|
|
|
|
public Compatibility getCompatibility() {
|
|
return compatibility;
|
|
}
|
|
|
|
@Override
|
|
@NonNull
|
|
public String toString() {
|
|
return super.toString().substring(1).replace("_", ".");
|
|
}
|
|
|
|
/**
|
|
* @since 1.5.0
|
|
*/
|
|
@NonNull
|
|
public static List<ServerVersion> getVersions(@NonNull Compatibility... compatibility) {
|
|
List<ServerVersion> versions = new LinkedList<>();
|
|
for (ServerVersion version : values()) {
|
|
if (Arrays.asList(compatibility).contains(version.getCompatibility())) {
|
|
versions.add(version);
|
|
}
|
|
}
|
|
return versions;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Checks the compatibility with the current server software and returns the {@link Compatibility}.
|
|
* Note this is a one-time calculation: further calls won't change the result.
|
|
* @return the {@link Compatibility}.
|
|
*/
|
|
public Compatibility checkCompatibility() {
|
|
if (result == null) {
|
|
// Check the server version first
|
|
ServerVersion version = getServerVersion();
|
|
|
|
if (version == null || version.getCompatibility().equals(Compatibility.INCOMPATIBLE)) {
|
|
// 'Version = null' means that it's not listed. And therefore, it's implicitly incompatible.
|
|
result = Compatibility.INCOMPATIBLE;
|
|
return result;
|
|
}
|
|
|
|
// Now, check the server software
|
|
ServerSoftware software = getServerSoftware();
|
|
|
|
if (software.getCompatibility().equals(Compatibility.INCOMPATIBLE)) {
|
|
result = Compatibility.INCOMPATIBLE;
|
|
return result;
|
|
}
|
|
|
|
if (software.getCompatibility().equals(Compatibility.NOT_SUPPORTED)
|
|
|| version.getCompatibility().equals(Compatibility.NOT_SUPPORTED)) {
|
|
result = Compatibility.NOT_SUPPORTED;
|
|
return result;
|
|
}
|
|
|
|
if (software.getCompatibility().equals(Compatibility.SUPPORTED)
|
|
|| version.getCompatibility().equals(Compatibility.SUPPORTED)) {
|
|
result = Compatibility.SUPPORTED;
|
|
return result;
|
|
}
|
|
|
|
// Nothing's wrong, the server is compatible.
|
|
result = Compatibility.COMPATIBLE;
|
|
return result;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Returns the {@link ServerSoftware} entry corresponding to the current server software, may be null.
|
|
* @return the {@link ServerSoftware} run by this server or null.
|
|
* @since 1.3.0
|
|
*/
|
|
@NonNull
|
|
public ServerSoftware getServerSoftware() {
|
|
String[] parts = Bukkit.getServer().getVersion().split("-");
|
|
if (parts.length < 2) {
|
|
return ServerSoftware.UNKNOWN.setName(Bukkit.getServer().getVersion().toUpperCase(Locale.ENGLISH));
|
|
}
|
|
String serverSoftware = Bukkit.getServer().getVersion().split("-")[1];
|
|
try {
|
|
return ServerSoftware.valueOf(serverSoftware.toUpperCase(Locale.ENGLISH));
|
|
} catch (IllegalArgumentException e) {
|
|
return ServerSoftware.UNKNOWN.setName(serverSoftware.toUpperCase(Locale.ENGLISH));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns the {@link ServerVersion} entry corresponding to the current server software, may be null.
|
|
* @return the {@link ServerVersion} run by this server or null.
|
|
* @since 1.3.0
|
|
*/
|
|
@Nullable
|
|
public ServerVersion getServerVersion() {
|
|
String serverVersion = Bukkit.getServer().getBukkitVersion().split("-")[0].replace(".", "_");
|
|
try {
|
|
return ServerVersion.valueOf("V" + serverVersion.toUpperCase(Locale.ENGLISH));
|
|
} catch (IllegalArgumentException e) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns whether the server runs on the specified versions.
|
|
* @param versions the {@link ServerVersion}s to check.
|
|
* @return {@code true} if the server runs on one of the specified versions, {@code false} otherwise.
|
|
* @since 1.5.0
|
|
*/
|
|
public boolean isVersion(@NonNull ServerVersion... versions) {
|
|
return Arrays.asList(versions).contains(getServerVersion());
|
|
}
|
|
|
|
/**
|
|
* Returns whether the server runs on the specified software.
|
|
* @param softwares the {@link ServerSoftware}s to check.
|
|
* @return {@code true} if the server runs on on of these software, {@code false} otherwise.
|
|
* @since 1.5.0
|
|
*/
|
|
public boolean isSoftware(@NonNull ServerSoftware... softwares) {
|
|
return Arrays.asList(softwares).contains(getServerSoftware());
|
|
}
|
|
}
|