From 855050c2d14f92c4c293a7c18c35f89f7c0b38b5 Mon Sep 17 00:00:00 2001 From: kento2 Date: Sat, 29 Aug 2026 20:51:28 +0200 Subject: [PATCH] . --- .../configurator/ConfiguratorPlugin.java | 23 ++++++++-- .../action/GlobalSetJsonAction.java | 43 +++++++++++++++++++ .../configurator/action/GlobalShowAction.java | 4 +- .../scrow/configurator/action/PickAction.java | 5 --- .../configurator/command/ConfigCommand.java | 1 + .../configurator/command/ShowLiteral.java | 2 +- .../scrow/configurator/config/Config.java | 8 ++++ .../scrow/configurator/config/ConfigImpl.java | 39 ++++++++++++++--- .../configurator/config/ConfigRegistry.java | 10 ++--- .../scrow/configurator/type/ConfigType.java | 8 ++-- .../type/list/ConfigListType.java | 2 +- .../type/location/LocationConfigType.java | 10 ++++- .../command/type/JsonArgumentType.java | 24 +++++++++++ .../convention/ScrowMessageStyle.java | 5 ++- .../economy/InMemoryEconomyService.java | 1 + .../friendship/InMemoryFriendshipService.java | 1 + .../request/InMemoryFriendRequestService.java | 1 + 17 files changed, 158 insertions(+), 29 deletions(-) create mode 100644 buildserver/configurator/main/java/site/lab0x13/scrow/configurator/action/GlobalSetJsonAction.java create mode 100644 core/common/src/main/java/de/kentoj/scrowlib/command/type/JsonArgumentType.java diff --git a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/ConfiguratorPlugin.java b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/ConfiguratorPlugin.java index 29828b1..daf237c 100644 --- a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/ConfiguratorPlugin.java +++ b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/ConfiguratorPlugin.java @@ -9,21 +9,38 @@ import site.lab0x13.scrow.configurator.config.ConfigRegistry; import site.lab0x13.scrow.configurator.type.list.ConfigListType; import site.lab0x13.scrow.configurator.type.location.LocationConfigType; +import java.io.IOException; import java.util.ArrayList; public class ConfiguratorPlugin extends JavaPlugin { + private final ConfigRegistry configRegistry = new ConfigRegistry(); + @Override public void onEnable() { - ConfigRegistry configRegistry = new ConfigRegistry(); + Config hotPotatoConfig = new ConfigImpl(this.getDataPath().resolve("config.json")); + configRegistry.register(hotPotatoConfig); - Config hotPotatoConfig = new ConfigImpl(); - configRegistry.register("hot-potato", hotPotatoConfig); var centerLocation = new ConfigKey<>("centerLocation", new LocationConfigType()); var spawnLocations = new ConfigKey<>("spawnLocations", new ConfigListType<>(new LocationConfigType())); hotPotatoConfig.register(centerLocation); hotPotatoConfig.register(spawnLocations, new ArrayList<>()); + try { + hotPotatoConfig.load(); + } catch (IOException e) { + throw new RuntimeException(e); + } ScrowAPI.commands().register(new ConfigCommand(configRegistry).rootLiteral()); } + + @Override + public void onDisable() { + try { + for (var cfg : configRegistry.allConfigs().values()) + cfg.save(); + } catch (IOException e) { + throw new RuntimeException("Failed saving config", e); + } + } } \ No newline at end of file diff --git a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/action/GlobalSetJsonAction.java b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/action/GlobalSetJsonAction.java new file mode 100644 index 0000000..7650ac8 --- /dev/null +++ b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/action/GlobalSetJsonAction.java @@ -0,0 +1,43 @@ +package site.lab0x13.scrow.configurator.action; + +import com.google.gson.JsonElement; +import de.kentoj.scrow.bukkit.command.ScrowBukkitCC; +import de.kentoj.scrowlib.command.type.JsonArgumentType; +import site.lab0x13.scrow.commands.model.argument.Argument; +import site.lab0x13.scrow.configurator.ConfigNode; + +import java.util.List; + +public final class GlobalSetJsonAction implements ConfigAction { + + private final Argument valueArg = + Argument.builder("jsonValue", new JsonArgumentType()).build(); + + @Override + public String name() { + return "set-json"; + } + + @Override + public List> arguments(ConfigNode __) { + return List.of(valueArg); + } + + @Override + public boolean requiresValue() { + return false; + } + + @Override + public void execute(ConfigNode node, ScrowBukkitCC ctx) { + Object value; + try { + value = node.type().deserialize(ctx.getArg(valueArg)); + } catch (Exception ex) { + ctx.sender().sendMessage(ctx.style().err("Failed serializing: " + ex.getMessage())); + return; + } + node.value(value); + ctx.sender().sendMessage(ctx.style().ok("Value set.")); + } +} diff --git a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/action/GlobalShowAction.java b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/action/GlobalShowAction.java index 9aa75c4..bc1f46a 100644 --- a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/action/GlobalShowAction.java +++ b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/action/GlobalShowAction.java @@ -13,11 +13,11 @@ import java.util.List; public final class GlobalShowAction implements ConfigAction { - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().serializeNulls().create(); @Override public String name() { - return "show"; + return "show-json"; } @Override diff --git a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/action/PickAction.java b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/action/PickAction.java index 8173fba..290c785 100644 --- a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/action/PickAction.java +++ b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/action/PickAction.java @@ -16,11 +16,6 @@ public abstract class PickAction implements ConfigAction { protected abstract CompletableFuture pick(Player player); - @Override - public String name() { - return "pick"; - } - @Override public List> arguments(ConfigNode __) { return Collections.emptyList(); diff --git a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/command/ConfigCommand.java b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/command/ConfigCommand.java index 28c539e..1ccc0f3 100644 --- a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/command/ConfigCommand.java +++ b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/command/ConfigCommand.java @@ -18,6 +18,7 @@ public final class ConfigCommand { public ConfigCommand(ConfigRegistry configRegistry) { this.configRegistry = configRegistry; + // TODO undo literal that undoes the last set command this.rootLiteral = Literal.dynamic("cfg") .withSubLiteralMetas(this::subLiteralMetas) .withSubLiteralProvider(this::configLiteral) diff --git a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/command/ShowLiteral.java b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/command/ShowLiteral.java index c078dff..7f16590 100644 --- a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/command/ShowLiteral.java +++ b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/command/ShowLiteral.java @@ -11,7 +11,7 @@ import site.lab0x13.scrow.configurator.config.Config; final class ShowLiteral { - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().serializeNulls().create(); private final Literal literal; private final Config cfg; diff --git a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/config/Config.java b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/config/Config.java index 1396178..f4ce0e3 100644 --- a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/config/Config.java +++ b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/config/Config.java @@ -5,10 +5,16 @@ import org.jetbrains.annotations.Nullable; import site.lab0x13.scrow.configurator.ConfigKey; import site.lab0x13.scrow.configurator.ConfigNode; +import java.io.IOException; +import java.nio.file.Path; import java.util.Map; public interface Config { + void save() throws IOException; + + Path path(); + void register(ConfigKey key, @Nullable V defaultValue); default void register(ConfigKey key) { @@ -32,4 +38,6 @@ public interface Config { JsonElement toJson(); void loadJson(JsonElement json); + + void load() throws IOException; } diff --git a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/config/ConfigImpl.java b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/config/ConfigImpl.java index 6498235..65dd37b 100644 --- a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/config/ConfigImpl.java +++ b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/config/ConfigImpl.java @@ -2,21 +2,30 @@ package site.lab0x13.scrow.configurator.config; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import site.lab0x13.scrow.configurator.ConfigKey; import site.lab0x13.scrow.configurator.ConfigNode; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.ArrayDeque; import java.util.HashMap; import java.util.Map; -public class ConfigImpl implements Config { +public final class ConfigImpl implements Config { - private final Logger log = LoggerFactory.getLogger(ConfigImpl.class); + private static final Logger log = LoggerFactory.getLogger(ConfigImpl.class); private final Map> nodes = new HashMap<>(); + private final Path path; + + public ConfigImpl(Path path) { + this.path = path; + } @Override public void register(ConfigKey key, @Nullable V defaultValue) { @@ -78,8 +87,8 @@ public class ConfigImpl implements Config { @Override public void loadJson(JsonElement json) { var obj = json.getAsJsonObject(); - allNodes().forEach((key, _node) -> { - var node = (ConfigNode)_node; + nodes.forEach((key, _node) -> { + var node = (ConfigNode) _node; var nodeValue = obj.get(key); node.value(node.type().deserialize(nodeValue)); }); @@ -88,11 +97,29 @@ public class ConfigImpl implements Config { @Override public JsonElement toJson() { var obj = new JsonObject(); - allNodes().forEach((key, _node) -> { - var node = (ConfigNode)_node; + nodes.forEach((key, _node) -> { + var node = (ConfigNode) _node; var nodeValue = node.type().serialize(node.value()); obj.add(key, nodeValue); }); return obj; } + + @Override + public void load() throws IOException { + if (!Files.exists(this.path)) return; + var json = Files.readString(this.path()); + this.loadJson(JsonParser.parseString(json)); + } + + @Override + public void save() throws IOException { + Files.createDirectories(this.path().getParent()); + Files.writeString(this.path(), this.toJson().toString()); + } + + @Override + public Path path() { + return path; + } } diff --git a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/config/ConfigRegistry.java b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/config/ConfigRegistry.java index 664e9b3..dab1bf0 100644 --- a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/config/ConfigRegistry.java +++ b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/config/ConfigRegistry.java @@ -12,17 +12,17 @@ public class ConfigRegistry { private static final Logger log = LoggerFactory.getLogger(ConfigRegistry.class); private final Map configs = new HashMap<>(); - public void register(String name, Config config) { - var oldValue = configs.put(name, config); + public void register(Config config) { + var oldValue = configs.put(config.path().toString(), config); if (oldValue != null) - log.warn("Overwriting old config with same name '{}'", name); + log.warn("Overwriting old config with same path '{}'", config.path()); } public Map allConfigs() { return new HashMap<>(configs); } - public @Nullable Config getConfig(String name) { - return configs.get(name); + public @Nullable Config getConfig(String path) { + return configs.get(path); } } diff --git a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/type/ConfigType.java b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/type/ConfigType.java index 49b3851..b1edb2a 100644 --- a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/type/ConfigType.java +++ b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/type/ConfigType.java @@ -2,9 +2,10 @@ package site.lab0x13.scrow.configurator.type; import de.kentoj.scrowlib.utils.Serializer; import org.jetbrains.annotations.Nullable; -import site.lab0x13.scrow.configurator.action.ConfigAction; -import site.lab0x13.scrow.configurator.action.GlobalShowAction; import site.lab0x13.scrow.configurator.ConfigNode; +import site.lab0x13.scrow.configurator.action.ConfigAction; +import site.lab0x13.scrow.configurator.action.GlobalSetJsonAction; +import site.lab0x13.scrow.configurator.action.GlobalShowAction; import java.util.ArrayList; import java.util.Collections; @@ -17,7 +18,8 @@ public interface ConfigType extends Serializer { default List> actions() { return new ArrayList<>(List.of( - new GlobalShowAction() + new GlobalShowAction(), + new GlobalSetJsonAction() )); } diff --git a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/type/list/ConfigListType.java b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/type/list/ConfigListType.java index 8bfbdf7..4e8f5fd 100644 --- a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/type/list/ConfigListType.java +++ b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/type/list/ConfigListType.java @@ -35,7 +35,7 @@ public final class ConfigListType implements ConfigType>> for (int i = 0; i < array.asList().size(); i++) { var subNode = new ConfigNode<>(elementType, null); subNode.value(elementType.deserialize(array.get(i))); - result.set(i, subNode); + result.add(i, subNode); } return result; } diff --git a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/type/location/LocationConfigType.java b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/type/location/LocationConfigType.java index 43bf23f..4c861f6 100644 --- a/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/type/location/LocationConfigType.java +++ b/buildserver/configurator/main/java/site/lab0x13/scrow/configurator/type/location/LocationConfigType.java @@ -5,14 +5,18 @@ import org.bukkit.Location; import site.lab0x13.scrow.configurator.action.ConfigAction; import site.lab0x13.scrow.configurator.type.ConfigComplexType; import site.lab0x13.scrow.configurator.type.ConfigPrimitiveType; +import site.lab0x13.scrow.configurator.type.ConfigType; import site.lab0x13.scrow.configurator.type.world.WorldConfigType; +import java.util.ArrayList; import java.util.List; public class LocationConfigType extends ConfigComplexType { public static final LocationConfigType INSTANCE = new LocationConfigType(); + private final List> actions; + public LocationConfigType() { addField("world", WorldConfigType.INSTANCE, Location::getWorld); addField("x", ConfigPrimitiveType.DOUBLE, Location::getX); @@ -20,11 +24,15 @@ public class LocationConfigType extends ConfigComplexType { addField("z", ConfigPrimitiveType.DOUBLE, Location::getZ); addField("yaw", ConfigPrimitiveType.FLOAT, Location::getYaw); addField("pitch", ConfigPrimitiveType.FLOAT, Location::getPitch); + + actions = new ArrayList<>(super.actions()); + actions.add(new LocationPickCurrentAction()); + actions.add(new LocationTeleportAction()); } @Override public List> actions() { - return List.of(new LocationTeleportAction(), new LocationPickCurrentAction()); + return actions; } @Override diff --git a/core/common/src/main/java/de/kentoj/scrowlib/command/type/JsonArgumentType.java b/core/common/src/main/java/de/kentoj/scrowlib/command/type/JsonArgumentType.java new file mode 100644 index 0000000..e3bbb78 --- /dev/null +++ b/core/common/src/main/java/de/kentoj/scrowlib/command/type/JsonArgumentType.java @@ -0,0 +1,24 @@ +package de.kentoj.scrowlib.command.type; + +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import com.leakyabstractions.result.api.Result; +import com.leakyabstractions.result.core.Results; +import site.lab0x13.scrow.commands.model.CommandContext; +import site.lab0x13.scrow.commands.model.SuggestionProvider; +import site.lab0x13.scrow.commands.model.argument.ArgumentType; + +import java.util.List; + +public class JsonArgumentType> implements ArgumentType { + @Override + public Result parseInput(String input) { + return Results.ofCallable(() -> JsonParser.parseString(input)) + .mapFailure(Throwable::getMessage); + } + + @Override + public SuggestionProvider defaultSuggestionProvider() { + return (_, _) -> List.of("{}"); + } +} diff --git a/core/common/src/main/java/de/kentoj/scrowlib/convention/ScrowMessageStyle.java b/core/common/src/main/java/de/kentoj/scrowlib/convention/ScrowMessageStyle.java index 89c8a74..e58b376 100644 --- a/core/common/src/main/java/de/kentoj/scrowlib/convention/ScrowMessageStyle.java +++ b/core/common/src/main/java/de/kentoj/scrowlib/convention/ScrowMessageStyle.java @@ -1,5 +1,6 @@ package de.kentoj.scrowlib.convention; +import de.kentoj.scrowlib.utils.ComponentUtils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextColor; @@ -20,8 +21,8 @@ public record ScrowMessageStyle( @Override public Component ok(Component msg) { - return prefix.append(Component.text(" ☆ ").color(NamedTextColor.GRAY)) - .append(msg.colorIfAbsent(NamedTextColor.GRAY)); + return ComponentUtils.resolveURLS(prefix.append(Component.text(" ☆ ").color(NamedTextColor.GRAY)) + .append(msg.colorIfAbsent(NamedTextColor.GRAY))); } @Override diff --git a/core/common/src/main/java/de/kentoj/scrowlib/economy/InMemoryEconomyService.java b/core/common/src/main/java/de/kentoj/scrowlib/economy/InMemoryEconomyService.java index 3af992d..deaabef 100644 --- a/core/common/src/main/java/de/kentoj/scrowlib/economy/InMemoryEconomyService.java +++ b/core/common/src/main/java/de/kentoj/scrowlib/economy/InMemoryEconomyService.java @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; +@Deprecated public class InMemoryEconomyService implements EconomyService { private final Map coins = new HashMap<>(); diff --git a/core/common/src/main/java/de/kentoj/scrowlib/friends/friendship/InMemoryFriendshipService.java b/core/common/src/main/java/de/kentoj/scrowlib/friends/friendship/InMemoryFriendshipService.java index 36a81b9..7bfcb61 100644 --- a/core/common/src/main/java/de/kentoj/scrowlib/friends/friendship/InMemoryFriendshipService.java +++ b/core/common/src/main/java/de/kentoj/scrowlib/friends/friendship/InMemoryFriendshipService.java @@ -9,6 +9,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; +@Deprecated public class InMemoryFriendshipService implements FriendshipService { private final Map friendships = new HashMap<>(); diff --git a/core/common/src/main/java/de/kentoj/scrowlib/friends/request/InMemoryFriendRequestService.java b/core/common/src/main/java/de/kentoj/scrowlib/friends/request/InMemoryFriendRequestService.java index 005e30d..a052a0c 100644 --- a/core/common/src/main/java/de/kentoj/scrowlib/friends/request/InMemoryFriendRequestService.java +++ b/core/common/src/main/java/de/kentoj/scrowlib/friends/request/InMemoryFriendRequestService.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Set; import java.util.UUID; +@Deprecated public class InMemoryFriendRequestService implements FriendRequestService { private final Set requests = new HashSet<>();