[libjf-config-v0] extend /libjf config command to allow specific reloading, viewing and editing configs

This commit is contained in:
Johannes Frohnmeyer 2022-02-17 18:35:07 +01:00
parent 558e6bd363
commit 71a382ee76
Signed by: Johannes
GPG Key ID: E76429612C2929F4
14 changed files with 100 additions and 54 deletions

View File

@ -5,7 +5,6 @@ import io.gitlab.jfronny.libjf.config.api.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.Entry;
import io.gitlab.jfronny.libjf.config.api.Preset;
import io.gitlab.jfronny.libjf.config.api.Verifier;
import io.gitlab.jfronny.libjf.config.impl.entrypoint.JfConfigWatchService;
import net.fabricmc.loader.api.FabricLoader;
import java.lang.reflect.Field;

View File

@ -0,0 +1,82 @@
package io.gitlab.jfronny.libjf.config.impl;
import com.mojang.brigadier.Command;
import com.mojang.brigadier.arguments.*;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.ConfigHolder;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.text.LiteralText;
import static net.minecraft.server.command.CommandManager.argument;
import static net.minecraft.server.command.CommandManager.literal;
public class JfConfigCommand implements ModInitializer {
@Override
public void onInitialize() {
CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> {
LiteralArgumentBuilder<ServerCommandSource> c_libjf = literal(LibJf.MOD_ID).requires((serverCommandSource) -> serverCommandSource.hasPermissionLevel(4));
LiteralArgumentBuilder<ServerCommandSource> c_config = literal("config").executes(context -> {
context.getSource().sendFeedback(new LiteralText("[libjf-config-v0] Loaded configs for:"), false);
ConfigHolder.getInstance().getRegistered().forEach((s, config) -> {
context.getSource().sendFeedback(new LiteralText("- " + s), false);
});
return Command.SINGLE_SUCCESS;
});
LiteralArgumentBuilder<ServerCommandSource> c_reload = literal("reload").executes(context -> {
ConfigHolder.getInstance().getRegistered().forEach((mod, config) -> config.load());
context.getSource().sendFeedback(new LiteralText("[libjf-config-v0] Reloaded configs"), true);
return Command.SINGLE_SUCCESS;
});
ConfigHolder.getInstance().getRegistered().forEach((id, config) -> {
LiteralArgumentBuilder<ServerCommandSource> c_instance = literal(id);
for (EntryInfo entry : config.getEntries()) {
LiteralArgumentBuilder<ServerCommandSource> c_entry = literal(entry.field.getName()).executes(context -> {
context.getSource().sendFeedback(new LiteralText("[libjf-config-v0] The value of " + entry.field.getName() + " is " + entry.value), false);
return Command.SINGLE_SUCCESS;
});
ArgumentType<?> type = getType(entry);
if (type != null) {
c_entry.then(argument("value", type).executes(context -> {
Object value = context.getArgument("value", entry.field.getType());
entry.value = value;
config.syncToClass();
context.getSource().sendFeedback(new LiteralText("[libjf-config-v0] Set " + entry.field.getName() + " to " + value), true);
return Command.SINGLE_SUCCESS;
}));
}
else if (entry.field.getType().isEnum()) {
for (Object enumConstant : entry.field.getType().getEnumConstants()) {
c_entry.then(literal(enumConstant.toString()).executes(context -> {
entry.value = enumConstant;
config.syncToClass();
context.getSource().sendFeedback(new LiteralText("[libjf-config-v0] Set " + entry.field.getName() + " to " + enumConstant), true);
return Command.SINGLE_SUCCESS;
}));
}
}
c_instance.then(c_entry);
}
c_config.then(c_instance);
c_reload.then(literal(id).executes(context -> {
config.load();
context.getSource().sendFeedback(new LiteralText("[libjf-config-v0] Reloaded config for " + id), true);
return Command.SINGLE_SUCCESS;
}));
});
dispatcher.register(c_libjf.then(c_config.then(c_reload)));
});
}
private ArgumentType<?> getType(EntryInfo info) {
Class<?> type = info.field.getType();
if (type == int.class || type == Integer.class) return IntegerArgumentType.integer((int) info.entry.min(), (int) info.entry.max());
else if (type == float.class || type == Float.class) return FloatArgumentType.floatArg((float) info.entry.min(), (float) info.entry.max());
else if (type == double.class || type == Double.class) return DoubleArgumentType.doubleArg(info.entry.min(), info.entry.max());
else if (type == String.class) return StringArgumentType.greedyString();
else if (type == boolean.class || type == Boolean.class) return BoolArgumentType.bool();
else return null;
}
}

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.libjf.config.impl.entrypoint;
package io.gitlab.jfronny.libjf.config.impl;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.ConfigHolder;

View File

@ -1,9 +1,9 @@
package io.gitlab.jfronny.libjf.config.impl.entrypoint;
package io.gitlab.jfronny.libjf.config.impl.client;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.ConfigHolder;
import io.gitlab.jfronny.libjf.config.api.ConfigInstance;
import io.gitlab.jfronny.libjf.config.impl.gui.EntryInfoWidgetBuilder;
import io.gitlab.jfronny.libjf.config.impl.client.screen.EntryInfoWidgetBuilder;
import net.fabricmc.api.ClientModInitializer;
public class JfConfigClient implements ClientModInitializer {

View File

@ -1,10 +1,10 @@
package io.gitlab.jfronny.libjf.config.impl;
package io.gitlab.jfronny.libjf.config.impl.client;
import com.terraformersmc.modmenu.api.ConfigScreenFactory;
import com.terraformersmc.modmenu.api.ModMenuApi;
import io.gitlab.jfronny.libjf.config.api.ConfigHolder;
import io.gitlab.jfronny.libjf.config.api.ConfigInstance;
import io.gitlab.jfronny.libjf.config.impl.gui.TinyConfigScreen;
import io.gitlab.jfronny.libjf.config.impl.client.screen.TinyConfigScreen;
import io.gitlab.jfronny.libjf.LibJf;
import java.util.HashMap;

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.libjf.config.impl.gui;
package io.gitlab.jfronny.libjf.config.impl.client.screen;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.libjf.config.impl.gui;
package io.gitlab.jfronny.libjf.config.impl.client.screen;
import io.gitlab.jfronny.libjf.config.api.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.Entry;

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.libjf.config.impl.gui;
package io.gitlab.jfronny.libjf.config.impl.client.screen;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;

View File

@ -1,10 +1,8 @@
package io.gitlab.jfronny.libjf.config.impl.gui;
package io.gitlab.jfronny.libjf.config.impl.client.screen;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.Entry;
import io.gitlab.jfronny.libjf.config.impl.EntryInfo;
import io.gitlab.jfronny.libjf.config.impl.gui.presets.PresetsScreen;
import io.gitlab.jfronny.libjf.config.impl.client.screen.presets.PresetsScreen;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient;
@ -20,7 +18,6 @@ import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Formatting;
import java.nio.file.Files;
import java.util.*;
import java.util.function.BiFunction;
import java.util.function.Function;

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.libjf.config.impl.gui.presets;
package io.gitlab.jfronny.libjf.config.impl.client.screen.presets;
import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.Selectable;

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.libjf.config.impl.gui.presets;
package io.gitlab.jfronny.libjf.config.impl.client.screen.presets;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.widget.ClickableWidget;

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.libjf.config.impl.gui.presets;
package io.gitlab.jfronny.libjf.config.impl.client.screen.presets;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.ConfigInstance;

View File

@ -1,30 +0,0 @@
package io.gitlab.jfronny.libjf.config.impl.entrypoint;
import com.mojang.brigadier.Command;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.ConfigHolder;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback;
import net.minecraft.text.LiteralText;
import static net.minecraft.server.command.CommandManager.literal;
public class JfConfigCommand implements ModInitializer {
@Override
public void onInitialize() {
CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> {
dispatcher.register(literal(LibJf.MOD_ID).requires((serverCommandSource) -> serverCommandSource.hasPermissionLevel(4))
.then(literal("config").executes(context -> {
context.getSource().sendFeedback(new LiteralText("[libjf-config-v0] Loaded configs for:"), false);
ConfigHolder.getInstance().getRegistered().forEach((s, config) -> {
context.getSource().sendFeedback(new LiteralText("- " + s), false);
});
return Command.SINGLE_SUCCESS;
}).then(literal("reload").executes(context -> {
ConfigHolder.getInstance().getRegistered().forEach((mod, config) -> config.load());
context.getSource().sendFeedback(new LiteralText("[libjf-config-v0] Reloaded configs"), true);
return Command.SINGLE_SUCCESS;
}))));
});
}
}

View File

@ -3,9 +3,7 @@
"id": "libjf-config-v0",
"name": "LibJF Config",
"version": "${version}",
"authors": [
"JFronny"
],
"authors": ["JFronny"],
"contact": {
"website": "https://jfronny.gitlab.io",
"repo": "https://gitlab.com/jfmods/libjf"
@ -13,12 +11,12 @@
"license": "MIT",
"environment": "*",
"entrypoints": {
"modmenu": ["io.gitlab.jfronny.libjf.config.impl.ModMenu"],
"client": ["io.gitlab.jfronny.libjf.config.impl.entrypoint.JfConfigClient"],
"modmenu": ["io.gitlab.jfronny.libjf.config.impl.client.ModMenu"],
"client": ["io.gitlab.jfronny.libjf.config.impl.client.JfConfigClient"],
"libjf:preEarly": ["io.gitlab.jfronny.libjf.config.impl.entrypoint.JfConfigUnsafe"],
"preLaunch": ["io.gitlab.jfronny.libjf.config.impl.entrypoint.JfConfigSafe"],
"main": ["io.gitlab.jfronny.libjf.config.impl.entrypoint.JfConfigCommand"],
"libjf:coprocess": ["io.gitlab.jfronny.libjf.config.impl.entrypoint.JfConfigWatchService"]
"main": ["io.gitlab.jfronny.libjf.config.impl.JfConfigCommand"],
"libjf:coprocess": ["io.gitlab.jfronny.libjf.config.impl.JfConfigWatchService"]
},
"depends": {
"fabricloader": ">=0.12.0",