feat: config version and improvements

This commit is contained in:
ineanto 2023-12-19 19:57:08 +01:00
parent 29e50966fd
commit a064352492
17 changed files with 198 additions and 53 deletions

View file

@ -24,6 +24,8 @@ import xyz.xenondevs.invui.item.builder.ItemBuilder;
import xyz.xenondevs.invui.item.impl.SimpleItem;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
public class NickoBukkit extends JavaPlugin {
private static NickoBukkit plugin;
@ -67,7 +69,6 @@ public class NickoBukkit extends JavaPlugin {
getLogger().warning("Issues regarding Nicko being used in offline mode will be ignored for now.");
}
if (!MinecraftVersion.WILD_UPDATE.atOrAbove()) {
getLogger().severe("This version (" + MinecraftVersion.getCurrentVersion().getVersion() + ") is not supported by Nicko!");
dataStore.getStorage().setError(true);
@ -91,6 +92,20 @@ public class NickoBukkit extends JavaPlugin {
}
if (!unitTesting) {
// Migrate configuration (1.0.8-RC1)
if (configuration.getVersion() == null
|| configuration.getVersion().isEmpty()
|| configuration.getVersionObject().compareTo(Configuration.VERSION) != 0) {
getLogger().info("Migrating configuration file from older version...");
try {
Files.copy(configurationManager.getFile().toPath(), configurationManager.getBackupFile().toPath(), StandardCopyOption.REPLACE_EXISTING);
Files.delete(configurationManager.getFile().toPath());
configurationManager.saveDefaultConfig();
} catch (IOException e) {
getLogger().severe("Failed to migrate your configuration!");
}
}
try {
Class.forName("io.papermc.paper.threadedregions.RegionizedServerInitEvent");
getLogger().warning("Nicko has not been tested against Folia and might not work at all!");
@ -139,7 +154,7 @@ public class NickoBukkit extends JavaPlugin {
}
}
if(!unitTesting) metrics.shutdown();
if (!unitTesting) metrics.shutdown();
getLogger().info("Nicko (Bukkit) has been disabled.");
}
@ -149,7 +164,10 @@ public class NickoBukkit extends JavaPlugin {
public Configuration getNickoConfig() {
try {
if (configuration == null) { return configuration = configurationManager.load(); }
if (configuration == null) {
configuration = configurationManager.load();
getLogger().info("Configuration file loaded.");
}
return configuration;
} catch (IOException e) {
getLogger().severe("Failed to load the configuration file!");

View file

@ -1,29 +1,48 @@
package xyz.ineanto.nicko.config;
import com.fasterxml.jackson.annotation.JsonProperty;
import xyz.ineanto.nicko.version.Version;
public class Configuration {
public static final Version VERSION = new Version(1, 0, 8);
public static final Configuration DEFAULT = new Configuration(VERSION.toString(),
DefaultDataSources.SQL_EMPTY,
DefaultDataSources.REDIS_EMPTY,
"§6Nicko §8§l| §r",
false);
private final transient Version versionObject;
@JsonProperty("version")
private final String version;
@JsonProperty("sql")
private final SQLDataSourceConfiguration sqlConfiguration;
@JsonProperty("redis")
private final DataSourceConfiguration redisConfiguration;
@JsonProperty("prefix")
private final String prefix;
@JsonProperty("customLocale")
private final Boolean customLocale;
public Configuration(SQLDataSourceConfiguration sqlConfiguration, DataSourceConfiguration redisConfiguration, String prefix, Boolean customLocale) {
public Configuration(@JsonProperty("version") String version,
@JsonProperty("sql") SQLDataSourceConfiguration sqlConfiguration,
@JsonProperty("redis") DataSourceConfiguration redisConfiguration,
@JsonProperty("prefix") String prefix,
@JsonProperty("customLocale") Boolean customLocale) {
this.version = version;
this.versionObject = Version.fromString(version);
this.sqlConfiguration = sqlConfiguration;
this.redisConfiguration = redisConfiguration;
this.prefix = prefix;
this.customLocale = customLocale;
}
public Configuration() {
this(
new SQLDataSourceConfiguration(false, "", 3306, "", "", true),
new DataSourceConfiguration(false, "", 6379, "", ""),
"",
false
);
public String getVersion() {
return version;
}
public Version getVersionObject() {
return versionObject;
}
public SQLDataSourceConfiguration getSqlConfiguration() {

View file

@ -7,16 +7,25 @@ import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.logging.Logger;
public class ConfigurationManager {
private final Logger logger = Logger.getLogger("ConfigurationManager");
private final ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
private final File file;
private final File backupFile;
public ConfigurationManager(File directory) {
final String date = Instant.now()
.atZone(ZoneId.systemDefault())
.format(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
this.file = new File(directory, "config.yml");
this.backupFile = new File(directory, "config.old-" + date + ".yml");
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
}
public void save(Configuration configuration) throws IOException {
@ -47,4 +56,12 @@ public class ConfigurationManager {
return mapper.readValue(reader, Configuration.class);
}
}
public File getFile() {
return file;
}
public File getBackupFile() {
return backupFile;
}
}

View file

@ -15,6 +15,7 @@ import xyz.ineanto.nicko.gui.items.common.choice.ChoiceCallback;
import xyz.ineanto.nicko.i18n.I18N;
import xyz.ineanto.nicko.i18n.I18NDict;
import xyz.ineanto.nicko.profile.NickoProfile;
import xyz.xenondevs.invui.item.builder.AbstractItemBuilder;
import xyz.xenondevs.invui.item.builder.ItemBuilder;
import xyz.xenondevs.invui.item.builder.SkullBuilder;
import xyz.xenondevs.invui.item.impl.AsyncItem;
@ -27,6 +28,7 @@ import java.util.Optional;
public class PlayerInformationItem extends AsyncItem {
private final Player target;
private final NickoProfile profile;
private final I18N i18n;
public PlayerInformationItem(I18N i18n, Player target) {
super(new SuppliedItem(() -> {
@ -39,11 +41,19 @@ public class PlayerInformationItem extends AsyncItem {
if (optionalProfile.isPresent()) {
final NickoProfile profile = optionalProfile.get();
return i18n.translateItem(skull, I18NDict.GUI.Admin.CHECK,
final AbstractItemBuilder<?> headItem = i18n.translateItem(skull, I18NDict.GUI.Admin.CHECK,
target.getName(),
(profile.hasData() ? "§a✔" : "§c❌"),
(profile.getName() == null ? "§7N/A" : profile.getName()),
(profile.getSkin() == null ? "§7N/A" : profile.getSkin()));
if (!profile.hasData()) {
// Remove the last 2 lines of the lore.
headItem.removeLoreLine(headItem.getLore().size() - 1);
headItem.removeLoreLine(headItem.getLore().size() - 1);
}
return headItem;
}
} catch (MojangApiUtils.MojangApiException | IOException e) {
NickoBukkit.getInstance().getLogger().severe("Unable to get head for specified UUID ( " + target.getUniqueId() + ")! (GUI/PlayerCheck)");
@ -53,6 +63,7 @@ public class PlayerInformationItem extends AsyncItem {
"§c§l?!?", "§7N/A", "§7N/A", "§7N/A"
);
});
this.i18n = i18n;
this.target = target;
this.profile = NickoBukkit.getInstance().getDataStore().getData(target.getUniqueId()).orElse(NickoProfile.EMPTY_PROFILE);
}
@ -67,7 +78,6 @@ public class PlayerInformationItem extends AsyncItem {
public void onConfirm() {
final AppearanceManager appearanceManager = new AppearanceManager(target);
appearanceManager.reset();
final I18N i18n = new I18N(player);
player.sendMessage(i18n.translate(I18NDict.Event.Admin.Check.REMOVE_SKIN, target.getName()));
}

View file

@ -0,0 +1,33 @@
package xyz.ineanto.nicko.version;
import org.jetbrains.annotations.NotNull;
import java.util.Comparator;
public record Version(int major, int minor, int patch) implements Comparable<Version> {
@Override
public int compareTo(@NotNull Version otherVersion) {
final Comparator<Version> comparator = Comparator
.comparingInt(Version::major)
.thenComparingInt(Version::minor)
.thenComparingInt(Version::patch);
return comparator.compare(this, otherVersion);
}
@Override
public String toString() {
return major + "." + minor + "." + patch;
}
public static Version fromString(String versionString) {
if (versionString == null || versionString.isEmpty()) { return new Version(0, 0, 0); }
final String[] split = versionString.split("\\.");
try {
return new Version(Integer.parseInt(split[0]),
Integer.parseInt(split[1]),
Integer.parseInt(split[2]));
} catch (NumberFormatException exception) {
return new Version(0, 0, 0);
}
}
}

View file

@ -1,7 +1,7 @@
# Nicko ${project.version} - Config:
# Nicko ${version} - Config:
# Don't modify this.
# No, like... really.
# Specifies the configuration version.
# Do NOT modify this field.
version: "1.0.8"
############

View file

@ -1,5 +1,3 @@
version: "1.0.8"
error:
generic: "An unknown error occurred."
permission: "§cYou do not have the required permission."

View file

@ -1,5 +1,3 @@
version: "1.0.8"
error:
generic: "Une erreur inconnue c'est produite."
permission: "§cVous ne possédez pas la permission."