From ef6c58e93dad61ed693bc7dfd3fd00637b367eed Mon Sep 17 00:00:00 2001 From: JFronny Date: Sun, 8 Oct 2023 17:51:13 +0200 Subject: [PATCH] feat(config-network): integrate with ModMenu --- .../config/impl/ui/PlaceholderScreen.java | 13 +++++-- libjf-config-network-v0/build.gradle.kts | 2 ++ .../client/JfConfigNetworkModMenu.java | 35 +++++++++++++++++++ .../libjf-config-network-v0/lang/en_us.json | 7 ++++ .../impl/network/PMResponseHandler.java | 2 +- .../network/PermissionDeniedException.java | 18 ++++++++++ .../src/main/resources/fabric.mod.json | 3 +- 7 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 libjf-config-network-v0/src/client/java/io/gitlab/jfronny/libjf/config/impl/network/client/JfConfigNetworkModMenu.java create mode 100644 libjf-config-network-v0/src/client/resources/assets/libjf-config-network-v0/lang/en_us.json create mode 100644 libjf-config-network-v0/src/main/java/io/gitlab/jfronny/libjf/config/impl/network/PermissionDeniedException.java diff --git a/libjf-config-core-v2/src/client/java/io/gitlab/jfronny/libjf/config/impl/ui/PlaceholderScreen.java b/libjf-config-core-v2/src/client/java/io/gitlab/jfronny/libjf/config/impl/ui/PlaceholderScreen.java index 406c466..a3b4177 100644 --- a/libjf-config-core-v2/src/client/java/io/gitlab/jfronny/libjf/config/impl/ui/PlaceholderScreen.java +++ b/libjf-config-core-v2/src/client/java/io/gitlab/jfronny/libjf/config/impl/ui/PlaceholderScreen.java @@ -7,10 +7,17 @@ import java.util.Objects; public class PlaceholderScreen extends Screen { private final Screen parent; - private final Text description = Text.translatable("libjf-config-core-v2.no-screen.description"); - protected PlaceholderScreen(Screen parent) { - super(Text.translatable("libjf-config-core-v2.no-screen")); + public PlaceholderScreen(Screen parent) { + this( + parent, + Text.translatable("libjf-config-core-v2.no-screen"), + Text.translatable("libjf-config-core-v2.no-screen.description") + ); + } + + public PlaceholderScreen(Screen parent, Text title, Text description) { + super(title); this.parent = parent; addDrawable((context, mouseX, mouseY, delta) -> { context.drawCenteredTextWithShadow(textRenderer, description, width / 2, (height - textRenderer.fontHeight) / 2, 0xFFFFFF); diff --git a/libjf-config-network-v0/build.gradle.kts b/libjf-config-network-v0/build.gradle.kts index 641d02e..710c308 100644 --- a/libjf-config-network-v0/build.gradle.kts +++ b/libjf-config-network-v0/build.gradle.kts @@ -10,8 +10,10 @@ base { dependencies { val fabricVersion: String by rootProject.extra + val modmenuVersion: String by rootProject.extra api(devProject(":libjf-base")) api(devProject(":libjf-config-core-v2")) + modCompileOnly("com.terraformersmc:modmenu:$modmenuVersion") include(modImplementation(fabricApi.module("fabric-networking-api-v1", fabricVersion))!!) include(modImplementation(fabricApi.module("fabric-command-api-v2", fabricVersion))!!) } diff --git a/libjf-config-network-v0/src/client/java/io/gitlab/jfronny/libjf/config/impl/network/client/JfConfigNetworkModMenu.java b/libjf-config-network-v0/src/client/java/io/gitlab/jfronny/libjf/config/impl/network/client/JfConfigNetworkModMenu.java new file mode 100644 index 0000000..3c48844 --- /dev/null +++ b/libjf-config-network-v0/src/client/java/io/gitlab/jfronny/libjf/config/impl/network/client/JfConfigNetworkModMenu.java @@ -0,0 +1,35 @@ +package io.gitlab.jfronny.libjf.config.impl.network.client; + +import com.terraformersmc.modmenu.api.ModMenuApi; +import io.gitlab.jfronny.libjf.config.api.v2.ConfigHolder; +import io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory; +import io.gitlab.jfronny.libjf.config.impl.network.PermissionDeniedException; +import io.gitlab.jfronny.libjf.config.impl.network.RequestRouter; +import io.gitlab.jfronny.libjf.config.impl.network.rci.MirrorConfigHolder; +import io.gitlab.jfronny.libjf.config.impl.ui.PlaceholderScreen; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.minecraft.text.Text; + +public class JfConfigNetworkModMenu implements ModMenuApi { + @Override + public com.terraformersmc.modmenu.api.ConfigScreenFactory getModConfigScreenFactory() { + return parent -> { + if (!JfConfigNetworkClient.isAvailable) return new PlaceholderScreen( + parent, + Text.translatable(RequestRouter.MOD_ID + ".modmenu.unavailable.title"), + Text.translatable(RequestRouter.MOD_ID + ".modmenu.unavailable.description") + ); + try { + ConfigHolder ch = new MirrorConfigHolder(ClientPlayNetworking.getSender()); + ch.getRegistered(); + return ConfigScreenFactory.getInstance().createOverview(ch, parent); + } catch (PermissionDeniedException pe) { + return new PlaceholderScreen( + parent, + Text.translatable(RequestRouter.MOD_ID + ".modmenu.denied.title"), + Text.translatable(RequestRouter.MOD_ID + ".modmenu.denied.description") + ); + } + }; + } +} diff --git a/libjf-config-network-v0/src/client/resources/assets/libjf-config-network-v0/lang/en_us.json b/libjf-config-network-v0/src/client/resources/assets/libjf-config-network-v0/lang/en_us.json new file mode 100644 index 0000000..3bd20c1 --- /dev/null +++ b/libjf-config-network-v0/src/client/resources/assets/libjf-config-network-v0/lang/en_us.json @@ -0,0 +1,7 @@ +{ + "libjf-config-network-v0.modmenu.unavailable.title": "Unavailable", + "libjf-config-network-v0.modmenu.unavailable.description": "libjf-config-network-v0 server is unavailable", + "libjf-config-network-v0.modmenu.denied.title": "Permission denied", + "libjf-config-network-v0.modmenu.denied.description": "You do not have permission to edit configs on this server", + "overview.jfconfig.title": "Serverside Mods Overview" +} \ No newline at end of file diff --git a/libjf-config-network-v0/src/main/java/io/gitlab/jfronny/libjf/config/impl/network/PMResponseHandler.java b/libjf-config-network-v0/src/main/java/io/gitlab/jfronny/libjf/config/impl/network/PMResponseHandler.java index ea43c0c..159094f 100644 --- a/libjf-config-network-v0/src/main/java/io/gitlab/jfronny/libjf/config/impl/network/PMResponseHandler.java +++ b/libjf-config-network-v0/src/main/java/io/gitlab/jfronny/libjf/config/impl/network/PMResponseHandler.java @@ -45,7 +45,7 @@ public record PMResponseHandler(Consumer handler) implements ResponseH @Override public PacketByteBuf get() { - if (this == DENY) throw new RuntimeException("Access not allowed"); + if (this == DENY) throw new PermissionDeniedException("Access not allowed"); else throw new UnsupportedOperationException("Method not found"); } } diff --git a/libjf-config-network-v0/src/main/java/io/gitlab/jfronny/libjf/config/impl/network/PermissionDeniedException.java b/libjf-config-network-v0/src/main/java/io/gitlab/jfronny/libjf/config/impl/network/PermissionDeniedException.java new file mode 100644 index 0000000..26f763e --- /dev/null +++ b/libjf-config-network-v0/src/main/java/io/gitlab/jfronny/libjf/config/impl/network/PermissionDeniedException.java @@ -0,0 +1,18 @@ +package io.gitlab.jfronny.libjf.config.impl.network; + +public class PermissionDeniedException extends RuntimeException { + public PermissionDeniedException() { + } + + public PermissionDeniedException(String message) { + super(message); + } + + public PermissionDeniedException(String message, Throwable cause) { + super(message, cause); + } + + public PermissionDeniedException(Throwable cause) { + super(cause); + } +} diff --git a/libjf-config-network-v0/src/main/resources/fabric.mod.json b/libjf-config-network-v0/src/main/resources/fabric.mod.json index 1ddad2b..a2cdf8a 100644 --- a/libjf-config-network-v0/src/main/resources/fabric.mod.json +++ b/libjf-config-network-v0/src/main/resources/fabric.mod.json @@ -14,7 +14,8 @@ "environment": "*", "entrypoints": { "server": ["io.gitlab.jfronny.libjf.config.impl.network.server.JfConfigNetworkServer::initialize"], - "client": ["io.gitlab.jfronny.libjf.config.impl.network.client.JfConfigNetworkClient::initialize"] + "client": ["io.gitlab.jfronny.libjf.config.impl.network.client.JfConfigNetworkClient::initialize"], + "modmenu": ["io.gitlab.jfronny.libjf.config.impl.network.client.JfConfigNetworkModMenu"] }, "depends": { "fabricloader": ">=0.12.0",