From 0f9ec29648e1b9840813b24587b8a660f6ab4531 Mon Sep 17 00:00:00 2001 From: nea Date: Wed, 6 Sep 2023 03:10:44 +0200 Subject: Add command for toggling config options --- src/main/kotlin/moe/nea/firmament/commands/dsl.kt | 21 +- src/main/kotlin/moe/nea/firmament/commands/rome.kt | 69 ++++++- .../moe/nea/firmament/gui/config/AllConfigsGui.kt | 21 +- .../moe/nea/firmament/gui/config/ManagedConfig.kt | 4 +- .../resources/assets/firmament/lang/en_us.json | 214 +++++++++++---------- 5 files changed, 196 insertions(+), 133 deletions(-) diff --git a/src/main/kotlin/moe/nea/firmament/commands/dsl.kt b/src/main/kotlin/moe/nea/firmament/commands/dsl.kt index 551f560..60756f4 100644 --- a/src/main/kotlin/moe/nea/firmament/commands/dsl.kt +++ b/src/main/kotlin/moe/nea/firmament/commands/dsl.kt @@ -11,14 +11,14 @@ import com.mojang.brigadier.builder.ArgumentBuilder import com.mojang.brigadier.builder.RequiredArgumentBuilder import com.mojang.brigadier.context.CommandContext import com.mojang.brigadier.suggestion.SuggestionProvider -import java.lang.reflect.ParameterizedType -import java.lang.reflect.Type -import java.lang.reflect.TypeVariable -import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource import kotlinx.coroutines.launch import moe.nea.firmament.Firmament import moe.nea.firmament.util.MinecraftDispatcher import moe.nea.firmament.util.iterate +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource +import java.lang.reflect.ParameterizedType +import java.lang.reflect.Type +import java.lang.reflect.TypeVariable typealias DefaultSource = FabricClientCommandSource @@ -68,7 +68,14 @@ data class TypeSafeArg(val name: String, val argument: ArgumentType) fun get(ctx: CommandContext): T { - return ctx.getArgument(name, argClass) as T + try { + return ctx.getArgument(name, argClass) as T + } catch (e: Exception) { + if (ctx.child != null) { + return get(ctx.child) + } + throw e + } } } @@ -86,9 +93,9 @@ fun , AT : Any> T.thenArgument( block: RequiredArgumentBuilder.(TypeSafeArg) -> Unit ): T = then(argument(name, argument, block)) -fun > T.suggestsList(provider: () -> Iterable) { +fun > T.suggestsList(provider: CommandContext.() -> Iterable) { suggests(SuggestionProvider { context, builder -> - provider() + provider(context) .asSequence() .filter { it.startsWith(builder.remaining, ignoreCase = true) } .forEach { diff --git a/src/main/kotlin/moe/nea/firmament/commands/rome.kt b/src/main/kotlin/moe/nea/firmament/commands/rome.kt index be2aefd..3d62408 100644 --- a/src/main/kotlin/moe/nea/firmament/commands/rome.kt +++ b/src/main/kotlin/moe/nea/firmament/commands/rome.kt @@ -9,21 +9,18 @@ package moe.nea.firmament.commands import com.mojang.brigadier.CommandDispatcher import com.mojang.brigadier.arguments.StringArgumentType.string import io.ktor.client.statement.* -import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource -import net.minecraft.text.Text import moe.nea.firmament.apis.UrsaManager import moe.nea.firmament.features.inventory.storageoverlay.StorageOverlayScreen import moe.nea.firmament.features.world.FairySouls import moe.nea.firmament.gui.config.AllConfigsGui +import moe.nea.firmament.gui.config.BooleanHandler +import moe.nea.firmament.gui.config.ManagedOption import moe.nea.firmament.gui.profileviewer.ProfileViewer import moe.nea.firmament.repo.HypixelStaticData import moe.nea.firmament.repo.RepoManager -import moe.nea.firmament.util.FirmFormatters -import moe.nea.firmament.util.MC -import moe.nea.firmament.util.SBData -import moe.nea.firmament.util.ScreenUtil -import moe.nea.firmament.util.SkyblockId -import moe.nea.firmament.util.unformattedString +import moe.nea.firmament.util.* +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource +import net.minecraft.text.Text fun firmamentCommand() = literal("firmament") { @@ -31,11 +28,65 @@ fun firmamentCommand() = literal("firmament") { thenExecute { AllConfigsGui.showAllGuis() } + thenLiteral("toggle") { + thenArgument("config", string()) { config -> + suggestsList { + AllConfigsGui.allConfigs.asSequence().map { it.name }.asIterable() + } + thenArgument("property", string()) { property -> + suggestsList { + (AllConfigsGui.allConfigs.find { it.name == this[config] }?:return@suggestsList listOf()) + .allOptions.entries.asSequence().filter { it.value.handler is BooleanHandler }.map { it.key } + .asIterable() + } + thenExecute { + val config = this[config] + val property = this[property] + + val configObj = AllConfigsGui.allConfigs.find { it.name == config } + if (configObj == null) { + source.sendFeedback(Text.translatable("firmament.command.toggle.no-config-found", config)) + return@thenExecute + } + val propertyObj = configObj.allOptions[property] + if (propertyObj == null) { + source.sendFeedback( + Text.translatable( + "firmament.command.toggle.no-property-found", + property + ) + ) + return@thenExecute + } + if (propertyObj.handler !is BooleanHandler) { + source.sendFeedback( + Text.translatable( + "firmament.command.toggle.not-a-toggle", + property + ) + ) + return@thenExecute + } + propertyObj as ManagedOption + propertyObj.value = !propertyObj.value + configObj.save() + source.sendFeedback( + Text.translatable( + "firmament.command.toggle.toggled", + configObj.labelText, + propertyObj.labelText, + Text.translatable("firmament.toggle.${propertyObj.value}") + ) + ) + } + } + } + } } thenLiteral("storage") { thenExecute { ScreenUtil.setScreenLater(StorageOverlayScreen()) - MC.player?.networkHandler?.sendChatCommand("ec") + MC.player?.networkHandler?.sendChatCommand("storage") } } thenLiteral("repo") { diff --git a/src/main/kotlin/moe/nea/firmament/gui/config/AllConfigsGui.kt b/src/main/kotlin/moe/nea/firmament/gui/config/AllConfigsGui.kt index b926946..75554c0 100644 --- a/src/main/kotlin/moe/nea/firmament/gui/config/AllConfigsGui.kt +++ b/src/main/kotlin/moe/nea/firmament/gui/config/AllConfigsGui.kt @@ -11,34 +11,31 @@ import io.github.cottonmc.cotton.gui.client.CottonClientScreen import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription import io.github.cottonmc.cotton.gui.widget.WBox import io.github.cottonmc.cotton.gui.widget.WButton -import io.github.cottonmc.cotton.gui.widget.WClippedPanel -import io.github.cottonmc.cotton.gui.widget.WGridPanel import io.github.cottonmc.cotton.gui.widget.WLabel -import io.github.cottonmc.cotton.gui.widget.WPanel -import io.github.cottonmc.cotton.gui.widget.WPanelWithInsets import io.github.cottonmc.cotton.gui.widget.WScrollPanel import io.github.cottonmc.cotton.gui.widget.data.Axis import io.github.cottonmc.cotton.gui.widget.data.Insets -import io.ktor.http.* -import kotlin.streams.asSequence -import net.minecraft.client.gui.screen.Screen -import net.minecraft.text.Text import moe.nea.firmament.features.FeatureManager import moe.nea.firmament.gui.WFixedPanel import moe.nea.firmament.gui.WSplitPanel -import moe.nea.firmament.gui.WTightScrollPanel import moe.nea.firmament.repo.RepoManager import moe.nea.firmament.util.MC import moe.nea.firmament.util.ScreenUtil.setScreenLater +import net.minecraft.client.gui.screen.Screen +import net.minecraft.text.Text +import kotlin.streams.asSequence object AllConfigsGui { + val allConfigs + get() = listOf( + RepoManager.Config + ) + FeatureManager.allFeatures.mapNotNull { it.config } + fun makeScreen(parent: Screen? = null): CottonClientScreen { val lwgd = LightweightGuiDescription() var screen: CottonClientScreen? = null - val configs = listOf( - RepoManager.Config - ) + FeatureManager.allFeatures.mapNotNull { it.config } + val configs = allConfigs val box = WBox(Axis.VERTICAL) configs.forEach { config -> val panel = WSplitPanel( diff --git a/src/main/kotlin/moe/nea/firmament/gui/config/ManagedConfig.kt b/src/main/kotlin/moe/nea/firmament/gui/config/ManagedConfig.kt index d2c4d69..8109aed 100644 --- a/src/main/kotlin/moe/nea/firmament/gui/config/ManagedConfig.kt +++ b/src/main/kotlin/moe/nea/firmament/gui/config/ManagedConfig.kt @@ -148,6 +148,8 @@ abstract class ManagedConfig(override val name: String) : ManagedConfigElement() latestGuiAppender?.reloadables?.forEach { it() } } + val labelText = Text.translatable("firmament.config.${name}") + fun getConfigEditor(parent: Screen? = null): CottonClientScreen { val lwgd = LightweightGuiDescription() var screen: Screen? = null @@ -165,7 +167,7 @@ abstract class ManagedConfig(override val name: String) : ManagedConfigElement() } } }) - it.add(WLabel(Text.translatable("firmament.config.${name}")).also { + it.add(WLabel(labelText).also { it.verticalAlignment = VerticalAlignment.CENTER }) }) diff --git a/src/main/resources/assets/firmament/lang/en_us.json b/src/main/resources/assets/firmament/lang/en_us.json index 380ea87..7640c04 100644 --- a/src/main/resources/assets/firmament/lang/en_us.json +++ b/src/main/resources/assets/firmament/lang/en_us.json @@ -1,106 +1,112 @@ { - "firmament.dev.resourcerebuild.start": "Invoking gradle resource rebuild (./gradlew :processResources)", - "firmament.dev.resourcerebuild.done": "Gradle resource rebuild done in %s", - "firmament.config.developer": "Developer Settings", - "firmament.config.developer.auto-rebuild": "Automatically rebuild resources", - "firmament.price": "Checking price for %s", - "firmament.price.bazaar": "Bazaar stats:", - "firmament.price.bazaar.productid": "Stock id: %s", - "firmament.price.bazaar.buy.price": "Buy Price: %s", - "firmament.price.bazaar.buy.order": "Buy orders: %d", - "firmament.tooltip.bazaar.sell-order": "Bazaar Sell Order: %s", - "firmament.tooltip.bazaar.buy-order": "Bazaar Buy Order: %s", - "firmament.tooltip.ah.lowestbin": "Lowest BIN: %d", - "firmament.pv.pets": "Pets", - "firmament.debug.skyblockid": "SkyBlock ID: %s", - "firmament.debug.skyblockid.copy": "Click to copy SkyBlock ID", - "firmament.price.bazaar.sell.price": "Sell Price: %s", - "firmament.price.bazaar.sell.order": "Sell orders: %d", - "firmament.price.lowestbin": "Lowest BIN: %s", - "firmament.repo.reload.network": "Trying to redownload the repository", - "firmament.repo.reload.disk": "Reloading repository from disk. This may lag a bit.", - "firmament.repo.cache": "Recaching items", - "firmament.repo.brokenitem": "Failed to render item: %s", - "firmanent.config.edit": "Edit", - "firmament.config.repo": "Firmament Repo Settings", - "firmament.config.repo.autoUpdate": "Auto Update", - "firmament.config.repo.username": "Repo Username", - "firmament.config.repo.username.hint": "NotEnoughUpdates", - "firmament.config.repo.reponame": "Repo Name", - "firmament.config.repo.reponame.hint": "NotEnoughUpdates-REPO", - "firmament.config.repo.branch": "Repo Branch", - "firmament.config.repo.branch.hint": "dangerous", - "firmament.config.repo.reset": "Reset", - "firmament.config.repo.disable-item-groups": "Disable Item Groups", - "firmament.config.repo.reload": "Reload Item List", - "firmament.config.repo.redownload": "Redownload Item List", - "firmament.ursa.debugrequest.start": "Ursa request launched", - "firmament.ursa.debugrequest.result": "Ursa request succeeded: %s", - "firmament.sbinfo.nolocraw": "No locraw data available", - "firmament.sbinfo.profile": "Current profile cutename: %s", - "firmament.sbinfo.server": "Locraw Server: %s", - "firmament.sbinfo.gametype": "Locraw Gametype: %s", - "firmament.sbinfo.mode": "Locraw Mode: %s", - "firmament.sbinfo.map": "Locraw Map: %s", - "firmament.config.price-data": "Price data", - "firmament.config.price-data.enable-always": "Enable Item Price", - "firmament.config.price-data.enable-keybind": "Enable only with Keybinding", - "firmament.config.fairy-souls": "Fairy Souls", - "firmament.config.fairy-souls.show": "Show Fairy Soul Waypoints", - "firmament.config.fairy-souls.reset": "Reset Collected Fairy Souls", - "firmament.config.fishing-warning": "Fishing Warning", - "firmament.config.fishing-warning.display-warning": "Display a warning when you are about to hook a fish", - "firmament.config.fishing-warning.highlight-wake-chain": "Highlight fishing particles", - "firmament.key.slotlocking": "Lock Slot / Slot Binding", - "firmament.key.category": "Firmament", - "firmament.protectitem": "Firmament protected your item: ", - "firmament.recipe.forge.time": "Forging Time: %s", - "firmament.pv.skills": "Skills", - "firmament.pv.skills.farming": "Farming", - "firmament.pv.skills.foraging": "Foraging", - "firmament.pv.skills.mining": "Mining", - "firmament.pv.skills.alchemy": "Alchemy", - "firmament.pv.skills.taming": "Taming", - "firmament.pv.skills.fishing": "Fishing", - "firmament.pv.skills.runecrafting": "Runecrafting", - "firmament.pv.skills.carpentry": "Carpentry", - "firmament.pv.skills.combat": "Combat", - "firmament.pv.skills.social": "Social", - "firmament.pv.skills.rift": "Rift", - "firmament.pv.skills.enchanting": "Enchanting", - "firmament.pv.skills.total": "Total Exp: %s", - "firmament.pv.lookingup": "Looking up %s", - "firmament.pv.noprofile": "%s has no SkyBlock profiles", - "firmament.pv.noplayer": "%s is not a Minecraft player", - "firmament.config.save-cursor-position.enable": "Enable", - "firmament.config.save-cursor-position.tolerance": "Tolerance", - "firmament.config.save-cursor-position": "Save Cursor Position", - "firmament.config.storage-overlay": "Storage Overlay", - "firmament.config.storage-overlay.rows": "Rows", - "firmament.config.storage-overlay.padding": "Padding", - "firmament.config.storage-overlay.scroll-speed": "Scroll Speed", - "firmament.config.storage-overlay.inverse-scroll": "Invert Scroll", - "firmament.config.storage-overlay.margin": "Margin", - "firmament.config.chat-links": "Chat Links", - "firmament.config.chat-links.links-enabled": "Enable Clickable Links", - "firmament.config.chat-links.image-enabled": "Enable Image Preview", - "firmament.config.chat-links.allow-all-hosts": "Allow all Image Hosts", - "firmament.config.chat-links.allowed-hosts": "Allowed Image Hosts", - "firmament.config.chat-links.position": "Chat Image Preview", - "firmament.hud.edit": "Edit %s", - "firmament.keybinding.external": "External", - "firmament.config.slot-locking": "Slot Locking", - "firmament.config.slot-locking.lock": "Lock Slot", - "firmament.config.fixes.auto-sprint": "Auto Sprint", - "firmament.config.fixes.auto-sprint-keybinding": "Auto Sprint KeyBinding", - "firmament.config.fixes.auto-sprint-hud": "Sprint State Hud", - "firmament.config.fixes.peek-chat": "Peek Chat", - "firmament.fixes.auto-sprint.on": "Sprint toggled", - "firmament.fixes.auto-sprint.sprinting": "Sprinting", - "firmament.fixes.auto-sprint.not-sprinting": "Not Sprinting", - "firmament.config.custom-skyblock-textures": "Custom SkyBlock Item Textures", - "firmament.config.custom-skyblock-textures.cache-duration": "Model Cache Duration", - "firmament.config.custom-skyblock-textures.enabled": "Enable Custom Item Textures", - "firmament.config.fixes": "Fixes", - "firmament.config.fixes.player-skins": "Fix unsigned Player Skins" + "firmament.dev.resourcerebuild.start": "Invoking gradle resource rebuild (./gradlew :processResources)", + "firmament.dev.resourcerebuild.done": "Gradle resource rebuild done in %s", + "firmament.command.toggle.no-config-found": "Could not find config %s", + "firmament.command.toggle.no-property-found": "Could not find property %s", + "firmament.command.toggle.not-a-toggle": "Property %s is not a toggle", + "firmament.command.toggle.toggled": "Toggled %s / %s %s", + "firmament.toggle.true": "On", + "firmament.toggle.false": "Off", + "firmament.config.developer": "Developer Settings", + "firmament.config.developer.auto-rebuild": "Automatically rebuild resources", + "firmament.price": "Checking price for %s", + "firmament.price.bazaar": "Bazaar stats:", + "firmament.price.bazaar.productid": "Stock id: %s", + "firmament.price.bazaar.buy.price": "Buy Price: %s", + "firmament.price.bazaar.buy.order": "Buy orders: %d", + "firmament.tooltip.bazaar.sell-order": "Bazaar Sell Order: %s", + "firmament.tooltip.bazaar.buy-order": "Bazaar Buy Order: %s", + "firmament.tooltip.ah.lowestbin": "Lowest BIN: %d", + "firmament.pv.pets": "Pets", + "firmament.debug.skyblockid": "SkyBlock ID: %s", + "firmament.debug.skyblockid.copy": "Click to copy SkyBlock ID", + "firmament.price.bazaar.sell.price": "Sell Price: %s", + "firmament.price.bazaar.sell.order": "Sell orders: %d", + "firmament.price.lowestbin": "Lowest BIN: %s", + "firmament.repo.reload.network": "Trying to redownload the repository", + "firmament.repo.reload.disk": "Reloading repository from disk. This may lag a bit.", + "firmament.repo.cache": "Recaching items", + "firmament.repo.brokenitem": "Failed to render item: %s", + "firmanent.config.edit": "Edit", + "firmament.config.repo": "Firmament Repo Settings", + "firmament.config.repo.autoUpdate": "Auto Update", + "firmament.config.repo.username": "Repo Username", + "firmament.config.repo.username.hint": "NotEnoughUpdates", + "firmament.config.repo.reponame": "Repo Name", + "firmament.config.repo.reponame.hint": "NotEnoughUpdates-REPO", + "firmament.config.repo.branch": "Repo Branch", + "firmament.config.repo.branch.hint": "dangerous", + "firmament.config.repo.reset": "Reset", + "firmament.config.repo.disable-item-groups": "Disable Item Groups", + "firmament.config.repo.reload": "Reload Item List", + "firmament.config.repo.redownload": "Redownload Item List", + "firmament.ursa.debugrequest.start": "Ursa request launched", + "firmament.ursa.debugrequest.result": "Ursa request succeeded: %s", + "firmament.sbinfo.nolocraw": "No locraw data available", + "firmament.sbinfo.profile": "Current profile cutename: %s", + "firmament.sbinfo.server": "Locraw Server: %s", + "firmament.sbinfo.gametype": "Locraw Gametype: %s", + "firmament.sbinfo.mode": "Locraw Mode: %s", + "firmament.sbinfo.map": "Locraw Map: %s", + "firmament.config.price-data": "Price data", + "firmament.config.price-data.enable-always": "Enable Item Price", + "firmament.config.price-data.enable-keybind": "Enable only with Keybinding", + "firmament.config.fairy-souls": "Fairy Souls", + "firmament.config.fairy-souls.show": "Show Fairy Soul Waypoints", + "firmament.config.fairy-souls.reset": "Reset Collected Fairy Souls", + "firmament.config.fishing-warning": "Fishing Warning", + "firmament.config.fishing-warning.display-warning": "Display a warning when you are about to hook a fish", + "firmament.config.fishing-warning.highlight-wake-chain": "Highlight fishing particles", + "firmament.key.slotlocking": "Lock Slot / Slot Binding", + "firmament.key.category": "Firmament", + "firmament.protectitem": "Firmament protected your item: ", + "firmament.recipe.forge.time": "Forging Time: %s", + "firmament.pv.skills": "Skills", + "firmament.pv.skills.farming": "Farming", + "firmament.pv.skills.foraging": "Foraging", + "firmament.pv.skills.mining": "Mining", + "firmament.pv.skills.alchemy": "Alchemy", + "firmament.pv.skills.taming": "Taming", + "firmament.pv.skills.fishing": "Fishing", + "firmament.pv.skills.runecrafting": "Runecrafting", + "firmament.pv.skills.carpentry": "Carpentry", + "firmament.pv.skills.combat": "Combat", + "firmament.pv.skills.social": "Social", + "firmament.pv.skills.rift": "Rift", + "firmament.pv.skills.enchanting": "Enchanting", + "firmament.pv.skills.total": "Total Exp: %s", + "firmament.pv.lookingup": "Looking up %s", + "firmament.pv.noprofile": "%s has no SkyBlock profiles", + "firmament.pv.noplayer": "%s is not a Minecraft player", + "firmament.config.save-cursor-position.enable": "Enable", + "firmament.config.save-cursor-position.tolerance": "Tolerance", + "firmament.config.save-cursor-position": "Save Cursor Position", + "firmament.config.storage-overlay": "Storage Overlay", + "firmament.config.storage-overlay.rows": "Rows", + "firmament.config.storage-overlay.padding": "Padding", + "firmament.config.storage-overlay.scroll-speed": "Scroll Speed", + "firmament.config.storage-overlay.inverse-scroll": "Invert Scroll", + "firmament.config.storage-overlay.margin": "Margin", + "firmament.config.chat-links": "Chat Links", + "firmament.config.chat-links.links-enabled": "Enable Clickable Links", + "firmament.config.chat-links.image-enabled": "Enable Image Preview", + "firmament.config.chat-links.allow-all-hosts": "Allow all Image Hosts", + "firmament.config.chat-links.allowed-hosts": "Allowed Image Hosts", + "firmament.config.chat-links.position": "Chat Image Preview", + "firmament.hud.edit": "Edit %s", + "firmament.keybinding.external": "External", + "firmament.config.slot-locking": "Slot Locking", + "firmament.config.slot-locking.lock": "Lock Slot", + "firmament.config.fixes.auto-sprint": "Auto Sprint", + "firmament.config.fixes.auto-sprint-keybinding": "Auto Sprint KeyBinding", + "firmament.config.fixes.auto-sprint-hud": "Sprint State Hud", + "firmament.config.fixes.peek-chat": "Peek Chat", + "firmament.fixes.auto-sprint.on": "Sprint toggled", + "firmament.fixes.auto-sprint.sprinting": "Sprinting", + "firmament.fixes.auto-sprint.not-sprinting": "Not Sprinting", + "firmament.config.custom-skyblock-textures": "Custom SkyBlock Item Textures", + "firmament.config.custom-skyblock-textures.cache-duration": "Model Cache Duration", + "firmament.config.custom-skyblock-textures.enabled": "Enable Custom Item Textures", + "firmament.config.fixes": "Fixes", + "firmament.config.fixes.player-skins": "Fix unsigned Player Skins" } -- cgit