1
0
mirror of https://github.com/chylex/Minecraft-Window-Title.git synced 2025-05-07 19:34:04 +02:00

Unify configuration parsing in Forge & Fabric

This commit is contained in:
chylex 2020-09-16 15:00:42 +02:00
parent c5085bc460
commit ecec2c9087
4 changed files with 170 additions and 44 deletions
Fabric/src/main/java/chylex/customwindowtitle
Forge/src/main/java/chylex/customwindowtitle

View File

@ -0,0 +1,79 @@
package chylex.customwindowtitle;
import com.google.common.collect.ImmutableMap;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
public final class TitleConfig{
private static final Map<String, String> DEFAULTS = ImmutableMap.<String, String>builder()
.put("title", "Minecraft {mcversion}")
.build();
public static TitleConfig read(final String folder){
final Path configFile = Paths.get(folder, "customwindowtitle-client.toml");
final Map<String, String> config = new HashMap<>(DEFAULTS);
try{
if (!Files.exists(configFile)){
Files.write(configFile, config.entrySet().stream().map(entry -> String.format("%s = '%s'", entry.getKey(), entry.getValue())).collect(Collectors.toList()), StandardCharsets.UTF_8);
}
else{
Files.readAllLines(configFile, StandardCharsets.UTF_8).stream().map(String::trim).filter(line -> !line.isEmpty()).forEach(line -> {
final String[] split = line.split("=", 2);
if (split.length != 2){
throw new RuntimeException("CustomWindowTitle configuration has an invalid line: " + line);
}
final String key = split[0].trim();
final String value = parseTrimmedValue(split[1].trim());
if (config.containsKey(key)){
config.put(key, value);
}
else{
throw new RuntimeException("CustomWindowTitle configuration has an invalid key: " + key);
}
});
}
}catch(final IOException e){
throw new RuntimeException("CustomWindowTitle configuration error", e);
}
return new TitleConfig(config.get("title"));
}
private static String parseTrimmedValue(String value){
if (value.isEmpty()){
return value;
}
final char surrounding = value.charAt(0);
final int length = value.length();
if (value.charAt(length - 1) == surrounding){
value = value.substring(1, length - 1);
if (surrounding == '"'){
value = value.replace("\\\"", "\"").replace("\\\\", "\\");
}
}
return value;
}
private final String title;
private TitleConfig(final String title){
this.title = title;
}
public String getTitle(){
return title;
}
}

View File

@ -1,49 +1,24 @@
package chylex.customwindowtitle.fabric;
import chylex.customwindowtitle.TitleConfig;
import chylex.customwindowtitle.TitleParser;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.MinecraftClient;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collections;
public class CustomWindowTitle implements ClientModInitializer{
private static final String defaultTitle = "Minecraft {mcversion}";
private String configTitle;
private final TitleConfig config;
public CustomWindowTitle(){
config = TitleConfig.read(FabricLoader.getInstance().getConfigDirectory().getAbsolutePath());
}
@Override
public void onInitializeClient(){
final Path configFile = Paths.get(FabricLoader.getInstance().getConfigDirectory().getAbsolutePath(), "customwindowtitle-client.toml");
try{
final String prefix = "title = ";
if (!Files.exists(configFile)){
Files.write(configFile, Collections.singletonList(prefix + '"' + defaultTitle + '"'), StandardCharsets.UTF_8);
configTitle = defaultTitle;
}
else{
configTitle = Files
.readAllLines(configFile, StandardCharsets.UTF_8)
.stream()
.filter(line -> line.startsWith(prefix))
.map(line -> StringUtils.strip(StringUtils.removeStart(line, prefix).trim(), "\""))
.findFirst()
.orElse(defaultTitle);
}
}catch(final IOException e){
throw new RuntimeException("CustomWindowTitle configuration error", e);
}
TokenData.register();
MinecraftClient.getInstance().execute(this::updateTitle);
}
private void updateTitle(){
MinecraftClient.getInstance().getWindow().setTitle(TitleParser.parse(configTitle));
MinecraftClient.getInstance().getWindow().setTitle(TitleParser.parse(config.getTitle()));
}
}

View File

@ -0,0 +1,79 @@
package chylex.customwindowtitle;
import com.google.common.collect.ImmutableMap;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
public final class TitleConfig{
private static final Map<String, String> DEFAULTS = ImmutableMap.<String, String>builder()
.put("title", "Minecraft {mcversion}")
.build();
public static TitleConfig read(final String folder){
final Path configFile = Paths.get(folder, "customwindowtitle-client.toml");
final Map<String, String> config = new HashMap<>(DEFAULTS);
try{
if (!Files.exists(configFile)){
Files.write(configFile, config.entrySet().stream().map(entry -> String.format("%s = '%s'", entry.getKey(), entry.getValue())).collect(Collectors.toList()), StandardCharsets.UTF_8);
}
else{
Files.readAllLines(configFile, StandardCharsets.UTF_8).stream().map(String::trim).filter(line -> !line.isEmpty()).forEach(line -> {
final String[] split = line.split("=", 2);
if (split.length != 2){
throw new RuntimeException("CustomWindowTitle configuration has an invalid line: " + line);
}
final String key = split[0].trim();
final String value = parseTrimmedValue(split[1].trim());
if (config.containsKey(key)){
config.put(key, value);
}
else{
throw new RuntimeException("CustomWindowTitle configuration has an invalid key: " + key);
}
});
}
}catch(final IOException e){
throw new RuntimeException("CustomWindowTitle configuration error", e);
}
return new TitleConfig(config.get("title"));
}
private static String parseTrimmedValue(String value){
if (value.isEmpty()){
return value;
}
final char surrounding = value.charAt(0);
final int length = value.length();
if (value.charAt(length - 1) == surrounding){
value = value.substring(1, length - 1);
if (surrounding == '"'){
value = value.replace("\\\"", "\"").replace("\\\\", "\\");
}
}
return value;
}
private final String title;
private TitleConfig(final String title){
this.title = title;
}
public String getTitle(){
return title;
}
}

View File

@ -1,27 +1,20 @@
package chylex.customwindowtitle.forge;
import chylex.customwindowtitle.TitleConfig;
import chylex.customwindowtitle.TitleParser;
import net.minecraft.client.Minecraft;
import net.minecraftforge.common.ForgeConfigSpec;
import net.minecraftforge.common.ForgeConfigSpec.ConfigValue;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.config.ModConfig.Type;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.fml.loading.FMLPaths;
@Mod("customwindowtitle")
public class CustomWindowTitle{
private final ConfigValue<String> configTitle;
private final TitleConfig config;
public CustomWindowTitle(){
final ForgeConfigSpec.Builder configBuilder = new ForgeConfigSpec.Builder();
configTitle = configBuilder.define("title", "Minecraft {mcversion}");
ModLoadingContext.get().registerConfig(Type.CLIENT, configBuilder.build());
config = TitleConfig.read(FMLPaths.CONFIGDIR.get().toString());
FMLJavaModLoadingContext.get().getModEventBus().register(this);
TokenData.register();
}
@ -31,6 +24,6 @@ public class CustomWindowTitle{
}
private void updateTitle(){
Minecraft.getInstance().getMainWindow().func_230148_b_(TitleParser.parse(configTitle.get()));
Minecraft.getInstance().getMainWindow().func_230148_b_(TitleParser.parse(config.getTitle()));
}
}