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:
parent
c5085bc460
commit
ecec2c9087
Fabric/src/main/java/chylex/customwindowtitle
Forge/src/main/java/chylex/customwindowtitle
@ -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;
|
||||
}
|
||||
}
|
@ -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()));
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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()));
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user