Skip to content

Commit

Permalink
Load config from file
Browse files Browse the repository at this point in the history
  • Loading branch information
Vinrobot committed Aug 9, 2023
1 parent ea17809 commit 7f4d932
Show file tree
Hide file tree
Showing 6 changed files with 139 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import net.vinrobot.mcemote.client.providers.IEmoteProvider;
import net.vinrobot.mcemote.client.text.EmotesManager;
import net.vinrobot.mcemote.config.Configuration;
import net.vinrobot.mcemote.config.impl.ConfigurationImpl;
import net.vinrobot.mcemote.config.ConfigurationService;
import webpdecoderjn.WebPLoader;

import java.io.IOException;
Expand All @@ -27,7 +27,7 @@ public void onInitializeClient() {
MinecraftEmoteMod.LOGGER.error("Failed to initialize WebPDecoder", e);
}

final Configuration config = new ConfigurationImpl();
final Configuration config = loadConfiguration(MinecraftEmoteMod.getConfigService());
final ServiceLoader<IEmoteProvider> serviceLoader = ServiceLoader.load(IEmoteProvider.class);
final List<IEmoteProvider> providers = ListHelper.sort(serviceLoader);

Expand All @@ -52,4 +52,14 @@ public void onInitializeClient() {
}
}
}

private Configuration loadConfiguration(final ConfigurationService service) {
try {
MinecraftEmoteMod.LOGGER.info("Loading config");
return service.load();
} catch (final IOException e) {
MinecraftEmoteMod.LOGGER.error("Failed to load config", e);
return service.create();
}
}
}
19 changes: 19 additions & 0 deletions src/main/java/net/vinrobot/mcemote/MinecraftEmoteMod.java
Original file line number Diff line number Diff line change
@@ -1,21 +1,40 @@
package net.vinrobot.mcemote;

import net.fabricmc.api.ModInitializer;
import net.fabricmc.loader.api.FabricLoader;
import net.vinrobot.mcemote.config.ConfigurationService;
import net.vinrobot.mcemote.config.impl.file.FileConfigurationService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.nio.file.Path;

public class MinecraftEmoteMod implements ModInitializer {
// This logger is used to write text to the console and the log file.
// It is considered best practice to use your mod id as the logger's name.
// That way, it's clear which mod wrote info, warnings, and errors.
public static final Logger LOGGER = LoggerFactory.getLogger("MCEmote");

private static ConfigurationService configService;

public static ConfigurationService getConfigService() {
ConfigurationService ret = configService;
if (ret == null) {
throw new RuntimeException("Configuration service not yet available!");
}
return ret;
}

@Override
public void onInitialize() {
// This code runs as soon as Minecraft is in a mod-load-ready state.
// However, some things (like resources) may still be uninitialized.
// Proceed with mild caution.

LOGGER.info("Hello Fabric world!");

final Path configDir = FabricLoader.getInstance().getConfigDir();
final Path configFile = configDir.resolve("mcemote.json");
configService = new FileConfigurationService(configFile);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package net.vinrobot.mcemote.config;

import java.io.IOException;

public interface ConfigurationService {
Configuration create();

Configuration load() throws IOException;

void save(Configuration config) throws IOException;
}
30 changes: 30 additions & 0 deletions src/main/java/net/vinrobot/mcemote/config/TypedGson.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package net.vinrobot.mcemote.config;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonIOException;
import com.google.gson.JsonSyntaxException;

import java.io.Reader;

public class TypedGson<S> {
private static final Gson DEFAULT_GSON = new GsonBuilder().setPrettyPrinting().create();

private final Gson gson;

public TypedGson() {
this(DEFAULT_GSON);
}

public TypedGson(final Gson gson) {
this.gson = gson;
}

public void toJson(S serializable, Appendable writer) throws JsonIOException {
this.gson.toJson(serializable, writer);
}

public <T extends S> T fromJson(Reader json, Class<T> classOfT) throws JsonSyntaxException, JsonIOException {
return this.gson.fromJson(json, classOfT);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package net.vinrobot.mcemote.config.impl.file;

import net.vinrobot.mcemote.config.Configuration;

import java.util.Optional;

class FileConfiguration {
public String twitchId;

public void copyFrom(final Configuration domain) {
this.twitchId = domain.twitchId().get();
}

public void copyTo(final Configuration configuration) {
configuration.twitchId().set(Optional.ofNullable(this.twitchId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package net.vinrobot.mcemote.config.impl.file;

import net.vinrobot.mcemote.config.Configuration;
import net.vinrobot.mcemote.config.ConfigurationService;
import net.vinrobot.mcemote.config.TypedGson;
import net.vinrobot.mcemote.config.impl.ConfigurationImpl;

import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Path;

public class FileConfigurationService implements ConfigurationService {
private final TypedGson<FileConfiguration> gson = new TypedGson<>();
private final Path configFile;

public FileConfigurationService(final Path configFile) {
this.configFile = configFile;
}

@Override
public Configuration create() {
return new ConfigurationImpl();
}

@Override
public Configuration load() throws IOException {
FileConfiguration fileConfiguration;
try (final Reader reader = Files.newBufferedReader(this.configFile)) {
fileConfiguration = this.gson.fromJson(reader, FileConfiguration.class);
}

final Configuration config = this.create();
if (fileConfiguration != null) {
fileConfiguration.copyTo(config);
}
return config;
}

@Override
public void save(final Configuration configuration) throws IOException {
final FileConfiguration fileConfiguration = new FileConfiguration();
fileConfiguration.copyFrom(configuration);

try (final Writer writer = Files.newBufferedWriter(this.configFile)) {
this.gson.toJson(fileConfiguration, writer);
}
}
}

0 comments on commit 7f4d932

Please sign in to comment.