1
0
mirror of https://github.com/Suiranoil/SkinRestorer.git synced 2026-01-16 04:42:12 +00:00

convert config to more modular system

This commit is contained in:
2024-11-28 08:27:13 +03:00
parent 71c826e8b7
commit 8329adc476
14 changed files with 276 additions and 88 deletions

View File

@@ -3,8 +3,8 @@ package net.lionarius.skinrestorer;
import com.mojang.authlib.GameProfile;
import com.mojang.brigadier.CommandDispatcher;
import net.lionarius.skinrestorer.command.SkinCommand;
import net.lionarius.skinrestorer.config.BuiltInProviderConfig;
import net.lionarius.skinrestorer.config.Config;
import net.lionarius.skinrestorer.config.provider.BuiltInProviderConfig;
import net.lionarius.skinrestorer.platform.Services;
import net.lionarius.skinrestorer.skin.SkinIO;
import net.lionarius.skinrestorer.skin.SkinStorage;

View File

@@ -1,7 +0,0 @@
package net.lionarius.skinrestorer.config;
public record BuiltInProviderConfig(boolean enabled, String name, CacheConfig cache) {
public boolean isValid() {
return this.name != null && this.cache != null && !this.name.isEmpty() && this.cache.isValid();
}
}

View File

@@ -1,7 +0,0 @@
package net.lionarius.skinrestorer.config;
public record CacheConfig(boolean enabled, long duration) {
public boolean isValid() {
return this.duration > 0;
}
}

View File

@@ -1,13 +1,15 @@
package net.lionarius.skinrestorer.config;
import net.lionarius.skinrestorer.SkinRestorer;
import net.lionarius.skinrestorer.config.provider.ProvidersConfig;
import net.lionarius.skinrestorer.util.FileUtils;
import net.lionarius.skinrestorer.util.JsonUtils;
import net.lionarius.skinrestorer.util.gson.GsonPostProcessable;
import java.nio.file.Path;
import java.util.Optional;
public final class Config {
public final class Config implements GsonPostProcessable {
public static final String CONFIG_FILENAME = "config.json";
@@ -68,14 +70,13 @@ public final class Config {
if (config == null)
config = new Config();
config.verifyAndFix();
FileUtils.writeFile(path.resolve(Config.CONFIG_FILENAME), JsonUtils.toJson(config));
return config;
}
private void verifyAndFix() {
@Override
public void gsonPostProcess() {
if (this.language == null || this.language.isEmpty()) {
SkinRestorer.LOGGER.warn("Language config is null or empty, defaulting to 'en_us'");
this.language = "en_us";
@@ -95,7 +96,7 @@ public final class Config {
try {
this.parsedProxy = Proxy.parse(this.proxy);
} catch (Exception e) {
SkinRestorer.LOGGER.warn("Could not parse proxy config", e);
SkinRestorer.LOGGER.warn("Could not parse proxy config: {}", e.getMessage());
this.parsedProxy = null;
}
}
@@ -109,8 +110,5 @@ public final class Config {
SkinRestorer.LOGGER.warn("Providers config is null, using default");
this.providers = ProvidersConfig.DEFAULT;
}
if (!this.providers.isValid())
this.providers.fix();
}
}

View File

@@ -1,65 +0,0 @@
package net.lionarius.skinrestorer.config;
import net.lionarius.skinrestorer.SkinRestorer;
import net.lionarius.skinrestorer.skin.provider.ElyBySkinProvider;
import net.lionarius.skinrestorer.skin.provider.MineskinSkinProvider;
import net.lionarius.skinrestorer.skin.provider.MojangSkinProvider;
public final class ProvidersConfig {
public static final ProvidersConfig DEFAULT = new ProvidersConfig(
new BuiltInProviderConfig(true, MojangSkinProvider.PROVIDER_NAME, new CacheConfig(true, 60)),
new BuiltInProviderConfig(true, ElyBySkinProvider.PROVIDER_NAME, new CacheConfig(true, 60)),
new BuiltInProviderConfig(true, MineskinSkinProvider.PROVIDER_NAME, new CacheConfig(true, 300))
);
private BuiltInProviderConfig mojang;
private BuiltInProviderConfig ely_by;
private BuiltInProviderConfig mineskin;
public ProvidersConfig(BuiltInProviderConfig mojang, BuiltInProviderConfig ely_by, BuiltInProviderConfig mineskin) {
this.mojang = mojang;
this.ely_by = ely_by;
this.mineskin = mineskin;
}
public boolean isValid() {
if (this == ProvidersConfig.DEFAULT)
return true;
return (this.mojang != null && this.mojang.isValid())
&& (this.ely_by != null && this.ely_by.isValid())
&& (this.mineskin != null && this.mineskin.isValid());
}
public void fix() {
if (this == ProvidersConfig.DEFAULT)
return;
if (this.mojang == null || !this.mojang.isValid()) {
SkinRestorer.LOGGER.warn("Mojang provider config is invalid, using default");
this.mojang = ProvidersConfig.DEFAULT.mojang();
}
if (this.ely_by == null || !this.ely_by.isValid()) {
SkinRestorer.LOGGER.warn("Ely.By provider config is invalid, using default");
this.ely_by = ProvidersConfig.DEFAULT.ely_by();
}
if (this.mineskin == null || !this.mineskin.isValid()) {
SkinRestorer.LOGGER.warn("Mineskin provider config is invalid, using default");
this.mineskin = ProvidersConfig.DEFAULT.mineskin();
}
}
public BuiltInProviderConfig mojang() {
return this.mojang;
}
public BuiltInProviderConfig ely_by() {
return this.ely_by;
}
public BuiltInProviderConfig mineskin() {
return this.mineskin;
}
}

View File

@@ -0,0 +1,10 @@
package net.lionarius.skinrestorer.config.provider;
public interface BuiltInProviderConfig {
boolean enabled();
String name();
CacheConfig cache();
}

View File

@@ -0,0 +1,28 @@
package net.lionarius.skinrestorer.config.provider;
import net.lionarius.skinrestorer.SkinRestorer;
public final class CacheConfig {
private boolean enabled;
private long duration;
public CacheConfig(boolean enabled, long duration) {
this.enabled = enabled;
this.duration = duration;
}
public boolean enabled() {
return enabled;
}
public long duration() {
return duration;
}
void validate(CacheConfig defaultValue) {
if (this.duration <= 0) {
SkinRestorer.LOGGER.warn("Cache duration is less than or equal to zero, defaulting to {}", defaultValue.duration());
this.duration = defaultValue.duration();
}
}
}

View File

@@ -0,0 +1,46 @@
package net.lionarius.skinrestorer.config.provider;
import net.lionarius.skinrestorer.SkinRestorer;
import net.lionarius.skinrestorer.skin.provider.ElyBySkinProvider;
import net.lionarius.skinrestorer.util.gson.GsonPostProcessable;
public class ElyByProviderConfig implements BuiltInProviderConfig, GsonPostProcessable {
private static final CacheConfig DEFAULT_CACHE_VALUE = new CacheConfig(true, 60);
private boolean enabled;
private String name;
private CacheConfig cache;
public ElyByProviderConfig() {
this.enabled = true;
this.name = ElyBySkinProvider.PROVIDER_NAME;
this.cache = DEFAULT_CACHE_VALUE;
}
public boolean enabled() {
return enabled;
}
public String name() {
return name;
}
public CacheConfig cache() {
return cache;
}
@Override
public void gsonPostProcess() {
if (this.name == null || this.name.isEmpty()) {
SkinRestorer.LOGGER.warn("Ely.By provider name is null or empty, defaulting to '{}'", ElyBySkinProvider.PROVIDER_NAME);
this.name = ElyBySkinProvider.PROVIDER_NAME;
}
if (this.cache == null) {
SkinRestorer.LOGGER.warn("Ely.By provider cache is null, using default");
this.cache = DEFAULT_CACHE_VALUE;
} else {
this.cache.validate(DEFAULT_CACHE_VALUE);
}
}
}

View File

@@ -0,0 +1,46 @@
package net.lionarius.skinrestorer.config.provider;
import net.lionarius.skinrestorer.SkinRestorer;
import net.lionarius.skinrestorer.skin.provider.MineskinSkinProvider;
import net.lionarius.skinrestorer.util.gson.GsonPostProcessable;
public class MineskinProviderConfig implements BuiltInProviderConfig, GsonPostProcessable {
private static final CacheConfig DEFAULT_CACHE_VALUE = new CacheConfig(true, 300);
private boolean enabled;
private String name;
private CacheConfig cache;
public MineskinProviderConfig() {
this.enabled = true;
this.name = MineskinSkinProvider.PROVIDER_NAME;
this.cache = DEFAULT_CACHE_VALUE;
}
public boolean enabled() {
return enabled;
}
public String name() {
return name;
}
public CacheConfig cache() {
return cache;
}
@Override
public void gsonPostProcess() {
if (this.name == null || this.name.isEmpty()) {
SkinRestorer.LOGGER.warn("Mineskin provider name is null or empty, defaulting to '{}'", MineskinSkinProvider.PROVIDER_NAME);
this.name = MineskinSkinProvider.PROVIDER_NAME;
}
if (this.cache == null) {
SkinRestorer.LOGGER.warn("Mineskin cache is null, using default");
this.cache = DEFAULT_CACHE_VALUE;
} else {
this.cache.validate(DEFAULT_CACHE_VALUE);
}
}
}

View File

@@ -0,0 +1,46 @@
package net.lionarius.skinrestorer.config.provider;
import net.lionarius.skinrestorer.SkinRestorer;
import net.lionarius.skinrestorer.skin.provider.MojangSkinProvider;
import net.lionarius.skinrestorer.util.gson.GsonPostProcessable;
public class MojangProviderConfig implements BuiltInProviderConfig, GsonPostProcessable {
private static final CacheConfig DEFAULT_CACHE_VALUE = new CacheConfig(true, 60);
private boolean enabled;
private String name;
private CacheConfig cache;
public MojangProviderConfig() {
this.enabled = true;
this.name = MojangSkinProvider.PROVIDER_NAME;
this.cache = DEFAULT_CACHE_VALUE;
}
public boolean enabled() {
return enabled;
}
public String name() {
return name;
}
public CacheConfig cache() {
return cache;
}
@Override
public void gsonPostProcess() {
if (this.name == null || this.name.isEmpty()) {
SkinRestorer.LOGGER.warn("Mojang provider name is null or empty, defaulting to '{}'", MojangSkinProvider.PROVIDER_NAME);
this.name = MojangSkinProvider.PROVIDER_NAME;
}
if (this.cache == null) {
SkinRestorer.LOGGER.warn("Mojang provider cache is null, using default");
this.cache = DEFAULT_CACHE_VALUE;
} else {
this.cache.validate(DEFAULT_CACHE_VALUE);
}
}
}

View File

@@ -0,0 +1,52 @@
package net.lionarius.skinrestorer.config.provider;
import net.lionarius.skinrestorer.SkinRestorer;
import net.lionarius.skinrestorer.util.gson.GsonPostProcessable;
public final class ProvidersConfig implements GsonPostProcessable {
public static final ProvidersConfig DEFAULT = new ProvidersConfig(
new MojangProviderConfig(),
new ElyByProviderConfig(),
new MineskinProviderConfig()
);
private MojangProviderConfig mojang;
private ElyByProviderConfig ely_by;
private MineskinProviderConfig mineskin;
public ProvidersConfig(MojangProviderConfig mojang, ElyByProviderConfig ely_by, MineskinProviderConfig mineskin) {
this.mojang = mojang;
this.ely_by = ely_by;
this.mineskin = mineskin;
}
public MojangProviderConfig mojang() {
return this.mojang;
}
public ElyByProviderConfig ely_by() {
return this.ely_by;
}
public MineskinProviderConfig mineskin() {
return this.mineskin;
}
@Override
public void gsonPostProcess() {
if (this.mojang == null) {
SkinRestorer.LOGGER.warn("Mojang provider config is null, using default");
this.mojang = ProvidersConfig.DEFAULT.mojang();
}
if (this.ely_by == null) {
SkinRestorer.LOGGER.warn("Ely.By provider config is null, using default");
this.ely_by = ProvidersConfig.DEFAULT.ely_by();
}
if (this.mineskin == null) {
SkinRestorer.LOGGER.warn("Mineskin provider config is null, using default");
this.mineskin = ProvidersConfig.DEFAULT.mineskin();
}
}
}

View File

@@ -9,6 +9,7 @@ import com.mojang.authlib.properties.Property;
import com.mojang.authlib.properties.PropertyMap;
import com.mojang.util.UUIDTypeAdapter;
import net.lionarius.skinrestorer.SkinRestorer;
import net.lionarius.skinrestorer.util.gson.PostProcessingEnabler;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
@@ -18,6 +19,7 @@ import java.util.UUID;
public final class JsonUtils {
public static final Gson GSON = new GsonBuilder()
.registerTypeAdapterFactory(new PostProcessingEnabler())
.registerTypeAdapter(UUID.class, new UUIDTypeAdapter())
.registerTypeAdapter(PropertyMap.class, new PropertyMap.Serializer())
.registerTypeAdapter(GameProfile.class, new GameProfile.Serializer())

View File

@@ -0,0 +1,5 @@
package net.lionarius.skinrestorer.util.gson;
public interface GsonPostProcessable {
void gsonPostProcess();
}

View File

@@ -0,0 +1,34 @@
package net.lionarius.skinrestorer.util.gson;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
public class PostProcessingEnabler implements TypeAdapterFactory {
@Override
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
var adapter = gson.getDelegateAdapter(this, type);
return new TypeAdapter<>() {
@Override
public void write(JsonWriter out, T value) throws IOException {
adapter.write(out, value);
}
@Override
public T read(JsonReader in) throws IOException {
var value = adapter.read(in);
if (value instanceof GsonPostProcessable postProcessable)
postProcessable.gsonPostProcess();
return value;
}
};
}
}