From 6c5a381903447c64ee80f1855a2764e04c9bcb38 Mon Sep 17 00:00:00 2001 From: DaMachinator Date: Sun, 18 Feb 2018 23:58:13 +0100 Subject: [PATCH] finished loading custom commands and permissions from file --- .../src/main/kotlin/matterlink/MatterLink.kt | 11 +++----- ...ndSender.kt => MatterLinkCommandSender.kt} | 13 ++++------ .../src/main/kotlin/matterlink/MatterLink.kt | 11 +++----- ...ndSender.kt => MatterLinkCommandSender.kt} | 12 ++++----- .../src/main/kotlin/matterlink/MatterLink.kt | 12 +++------ ...ndSender.kt => MatterLinkCommandSender.kt} | 13 ++++++---- .../src/main/kotlin/matterlink/MatterLink.kt | 9 ++----- ...ndSender.kt => MatterLinkCommandSender.kt} | 16 ++++++------ .../src/main/kotlin/matterlink/IMatterLink.kt | 23 ++++++++--------- core/src/main/kotlin/matterlink/Util.kt | 10 ++++++++ .../bridge/command/BridgeCommandRegistry.kt | 22 ++++++++++------ .../bridge/command/CustomCommand.kt | 25 +++++++++++++------ .../bridge/command/IBridgeCommand.kt | 14 ++++++----- .../bridge/command/IMinecraftCommandSender.kt | 15 +++++++++-- .../kotlin/matterlink/config/BaseConfig.kt | 23 ++--------------- .../kotlin/matterlink/config/CommandConfig.kt | 22 ++++++++++++---- .../matterlink/config/PermissionConfig.kt | 23 ++++++++++++----- gradle.properties | 2 +- 18 files changed, 148 insertions(+), 128 deletions(-) rename 1.10.2/src/main/kotlin/matterlink/command/{MatterlinkCommandSender.kt => MatterLinkCommandSender.kt} (87%) rename 1.11.2/src/main/kotlin/matterlink/command/{MatterlinkCommandSender.kt => MatterLinkCommandSender.kt} (87%) rename 1.12.2/src/main/kotlin/matterlink/command/{MatterlinkCommandSender.kt => MatterLinkCommandSender.kt} (78%) rename 1.7.10/src/main/kotlin/matterlink/command/{MatterlinkCommandSender.kt => MatterLinkCommandSender.kt} (79%) diff --git a/1.10.2/src/main/kotlin/matterlink/MatterLink.kt b/1.10.2/src/main/kotlin/matterlink/MatterLink.kt index 81ab8c7..68bf4b6 100644 --- a/1.10.2/src/main/kotlin/matterlink/MatterLink.kt +++ b/1.10.2/src/main/kotlin/matterlink/MatterLink.kt @@ -1,8 +1,8 @@ package matterlink -import matterlink.command.CommandMatterlink import matterlink.bridge.command.IMinecraftCommandSender -import matterlink.command.MatterlinkCommandSender +import matterlink.command.CommandMatterlink +import matterlink.command.MatterLinkCommandSender import matterlink.config.cfg import net.minecraft.util.text.TextComponentString import net.minecraftforge.fml.common.FMLCommonHandler @@ -58,15 +58,10 @@ object MatterLink : IMatterLink() { FMLCommonHandler.instance().minecraftServerInstance.playerList.sendChatMsg(TextComponentString(msg)) } - //FORGE-DEPENDENT - override fun wrappedPlayerList(): Array { - return FMLCommonHandler.instance().minecraftServerInstance.playerList.onlinePlayerNames - } - override fun log(level: String, formatString: String, vararg data: Any) = logger.log(Level.toLevel(level, Level.INFO), formatString, *data) - override var commandSender: IMinecraftCommandSender = MatterlinkCommandSender + override fun commandSenderFor(user: String, userId: String, server: String) = MatterLinkCommandSender(user, userId, server) override val mcVersion: String = MCVERSION override val modVersion: String = MODVERSION diff --git a/1.10.2/src/main/kotlin/matterlink/command/MatterlinkCommandSender.kt b/1.10.2/src/main/kotlin/matterlink/command/MatterLinkCommandSender.kt similarity index 87% rename from 1.10.2/src/main/kotlin/matterlink/command/MatterlinkCommandSender.kt rename to 1.10.2/src/main/kotlin/matterlink/command/MatterLinkCommandSender.kt index 3315cd9..8e712bb 100644 --- a/1.10.2/src/main/kotlin/matterlink/command/MatterlinkCommandSender.kt +++ b/1.10.2/src/main/kotlin/matterlink/command/MatterLinkCommandSender.kt @@ -16,7 +16,7 @@ import net.minecraft.world.World import net.minecraftforge.fml.common.FMLCommonHandler import javax.annotation.Nonnull -object MatterlinkCommandSender : IMinecraftCommandSender, ICommandSender { +class MatterLinkCommandSender(user: String, userId: String, server: String) : IMinecraftCommandSender(user, userId, server), ICommandSender { private var level: Int = 0 override fun execute(cmdString: String): Boolean { @@ -27,20 +27,18 @@ object MatterlinkCommandSender : IMinecraftCommandSender, ICommandSender { } override fun getDisplayName(): ITextComponent { - return TextComponentString("MatterLink") + return TextComponentString(user) } - override fun getName(): String { - return "MatterLink" - } + override fun getName() = accountName override fun getEntityWorld(): World { return FMLCommonHandler.instance().minecraftServerInstance.worldServerForDimension(0) } - override fun canUseCommand(permLevel: Int, commandName: String?): Boolean { + override fun canUseCommand(permLevel: Int, commandName: String): Boolean { //we check user on our end - return true + return canExecute(commandName) } override fun getServer(): MinecraftServer? { @@ -59,7 +57,6 @@ object MatterlinkCommandSender : IMinecraftCommandSender, ICommandSender { return true } - //WtfMojangWhy override fun getPosition(): BlockPos = BlockPos.ORIGIN override fun setCommandStat(type: CommandResultStats.Type?, amount: Int) {} diff --git a/1.11.2/src/main/kotlin/matterlink/MatterLink.kt b/1.11.2/src/main/kotlin/matterlink/MatterLink.kt index e9ef466..2aee026 100644 --- a/1.11.2/src/main/kotlin/matterlink/MatterLink.kt +++ b/1.11.2/src/main/kotlin/matterlink/MatterLink.kt @@ -1,8 +1,8 @@ package matterlink -import matterlink.command.CommandMatterlink import matterlink.bridge.command.IMinecraftCommandSender -import matterlink.command.MatterlinkCommandSender +import matterlink.command.CommandMatterlink +import matterlink.command.MatterLinkCommandSender import matterlink.config.cfg import net.minecraft.util.text.TextComponentString import net.minecraftforge.fml.common.FMLCommonHandler @@ -58,15 +58,10 @@ object MatterLink : IMatterLink() { FMLCommonHandler.instance().minecraftServerInstance.playerList.sendMessage(TextComponentString(msg)) } - //FORGE-DEPENDENT - override fun wrappedPlayerList(): Array { - return FMLCommonHandler.instance().minecraftServerInstance.playerList.onlinePlayerNames - } - override fun log(level: String, formatString: String, vararg data: Any) = logger.log(Level.toLevel(level, Level.INFO), formatString, *data) - override var commandSender: IMinecraftCommandSender = MatterlinkCommandSender + override fun commandSenderFor(user: String, userId: String, server: String) = MatterLinkCommandSender(user, userId, server) override val mcVersion: String = MCVERSION override val modVersion: String = MODVERSION diff --git a/1.11.2/src/main/kotlin/matterlink/command/MatterlinkCommandSender.kt b/1.11.2/src/main/kotlin/matterlink/command/MatterLinkCommandSender.kt similarity index 87% rename from 1.11.2/src/main/kotlin/matterlink/command/MatterlinkCommandSender.kt rename to 1.11.2/src/main/kotlin/matterlink/command/MatterLinkCommandSender.kt index 815ee84..7b51451 100644 --- a/1.11.2/src/main/kotlin/matterlink/command/MatterlinkCommandSender.kt +++ b/1.11.2/src/main/kotlin/matterlink/command/MatterLinkCommandSender.kt @@ -16,7 +16,7 @@ import net.minecraft.world.World import net.minecraftforge.fml.common.FMLCommonHandler import javax.annotation.Nonnull -object MatterlinkCommandSender : IMinecraftCommandSender, ICommandSender { +class MatterLinkCommandSender(user: String, userId: String, server: String) : IMinecraftCommandSender(user, userId, server), ICommandSender { override fun execute(cmdString: String): Boolean { return 0 < FMLCommonHandler.instance().minecraftServerInstance.commandManager.executeCommand( @@ -26,20 +26,18 @@ object MatterlinkCommandSender : IMinecraftCommandSender, ICommandSender { } override fun getDisplayName(): ITextComponent { - return TextComponentString("MatterLink") + return TextComponentString(user) } - override fun getName(): String { - return "MatterLink" - } + override fun getName() = accountName override fun getEntityWorld(): World { return FMLCommonHandler.instance().minecraftServerInstance.getWorld(0) } - override fun canUseCommand(permLevel: Int, commandName: String?): Boolean { + override fun canUseCommand(permLevel: Int, commandName: String): Boolean { //we now do permissions checking on our end - return true + return canExecute(commandName) } override fun getServer(): MinecraftServer? { diff --git a/1.12.2/src/main/kotlin/matterlink/MatterLink.kt b/1.12.2/src/main/kotlin/matterlink/MatterLink.kt index 2dcc7a6..2a7a07a 100644 --- a/1.12.2/src/main/kotlin/matterlink/MatterLink.kt +++ b/1.12.2/src/main/kotlin/matterlink/MatterLink.kt @@ -1,8 +1,8 @@ package matterlink -import matterlink.command.CommandMatterlink import matterlink.bridge.command.IMinecraftCommandSender -import matterlink.command.MatterlinkCommandSender +import matterlink.command.CommandMatterlink +import matterlink.command.MatterLinkCommandSender import matterlink.config.cfg import net.minecraft.util.text.TextComponentString import net.minecraftforge.fml.common.FMLCommonHandler @@ -63,15 +63,11 @@ object MatterLink : IMatterLink() { FMLCommonHandler.instance().minecraftServerInstance.playerList.sendMessage(TextComponentString(msg)) } - //FORGE-DEPENDENT - override fun wrappedPlayerList(): Array { - return FMLCommonHandler.instance().minecraftServerInstance.playerList.onlinePlayerNames - } - override fun log(level: String, formatString: String, vararg data: Any) = logger.log(Level.toLevel(level, Level.INFO), formatString, *data) - override var commandSender: IMinecraftCommandSender = MatterlinkCommandSender + override fun commandSenderFor(user: String, userId: String, server: String) = MatterLinkCommandSender(user, userId, server) + override val mcVersion: String = MCVERSION override val modVersion: String = MODVERSION } diff --git a/1.12.2/src/main/kotlin/matterlink/command/MatterlinkCommandSender.kt b/1.12.2/src/main/kotlin/matterlink/command/MatterLinkCommandSender.kt similarity index 78% rename from 1.12.2/src/main/kotlin/matterlink/command/MatterlinkCommandSender.kt rename to 1.12.2/src/main/kotlin/matterlink/command/MatterLinkCommandSender.kt index 99e0026..cad043e 100644 --- a/1.12.2/src/main/kotlin/matterlink/command/MatterlinkCommandSender.kt +++ b/1.12.2/src/main/kotlin/matterlink/command/MatterLinkCommandSender.kt @@ -7,11 +7,12 @@ import matterlink.config.cfg import net.minecraft.command.ICommandSender import net.minecraft.server.MinecraftServer import net.minecraft.util.text.ITextComponent +import net.minecraft.util.text.TextComponentString import net.minecraft.world.World import net.minecraftforge.fml.common.FMLCommonHandler import javax.annotation.Nonnull -object MatterlinkCommandSender : IMinecraftCommandSender, ICommandSender { +class MatterLinkCommandSender(user: String, userId: String, server: String) : IMinecraftCommandSender(user, userId, server), ICommandSender { override fun execute(cmdString: String): Boolean { return 0 < FMLCommonHandler.instance().minecraftServerInstance.commandManager.executeCommand( @@ -20,17 +21,19 @@ object MatterlinkCommandSender : IMinecraftCommandSender, ICommandSender { ) } - override fun getName(): String { - return "MatterLink" + override fun getDisplayName(): ITextComponent { + return TextComponentString(user) } + override fun getName() = accountName + override fun getEntityWorld(): World { return FMLCommonHandler.instance().minecraftServerInstance.getWorld(0) } - override fun canUseCommand(permLevel: Int, commandName: String?): Boolean { + override fun canUseCommand(permLevel: Int, commandName: String): Boolean { //permissions are checked on our end - return true + return canExecute(commandName) } override fun getServer(): MinecraftServer? { diff --git a/1.7.10/src/main/kotlin/matterlink/MatterLink.kt b/1.7.10/src/main/kotlin/matterlink/MatterLink.kt index f11648b..8a38962 100644 --- a/1.7.10/src/main/kotlin/matterlink/MatterLink.kt +++ b/1.7.10/src/main/kotlin/matterlink/MatterLink.kt @@ -5,7 +5,7 @@ import cpw.mods.fml.common.Mod import cpw.mods.fml.common.event.* import matterlink.command.CommandMatterlink import matterlink.bridge.command.IMinecraftCommandSender -import matterlink.command.MatterlinkCommandSender +import matterlink.command.MatterLinkCommandSender import matterlink.config.cfg import net.minecraft.server.MinecraftServer import net.minecraft.util.ChatComponentText @@ -60,15 +60,10 @@ class MatterLink : IMatterLink() { MinecraftServer.getServer().addChatMessage(ChatComponentText(msg)); } - //FORGE-DEPENDENT - override fun wrappedPlayerList(): Array { - return MinecraftServer.getServer().allUsernames - } - override fun log(level: String, formatString: String, vararg data: Any) = logger.log(Level.toLevel(level, Level.INFO), formatString, *data) - override var commandSender: IMinecraftCommandSender = MatterlinkCommandSender + override fun commandSenderFor(user: String, userId: String, server: String) = MatterLinkCommandSender(user, userId, server) override val mcVersion: String = MCVERSION override val modVersion: String = MODVERSION diff --git a/1.7.10/src/main/kotlin/matterlink/command/MatterlinkCommandSender.kt b/1.7.10/src/main/kotlin/matterlink/command/MatterLinkCommandSender.kt similarity index 79% rename from 1.7.10/src/main/kotlin/matterlink/command/MatterlinkCommandSender.kt rename to 1.7.10/src/main/kotlin/matterlink/command/MatterLinkCommandSender.kt index adcf393..02d94fc 100644 --- a/1.7.10/src/main/kotlin/matterlink/command/MatterlinkCommandSender.kt +++ b/1.7.10/src/main/kotlin/matterlink/command/MatterLinkCommandSender.kt @@ -11,7 +11,7 @@ import net.minecraft.util.ChunkCoordinates import net.minecraft.util.IChatComponent import net.minecraft.world.World -object MatterlinkCommandSender : IMinecraftCommandSender, ICommandSender { +class MatterLinkCommandSender(user: String, userId: String, server: String) : IMinecraftCommandSender(user, userId, server), ICommandSender { private var level: Int = 0 @@ -23,20 +23,18 @@ object MatterlinkCommandSender : IMinecraftCommandSender, ICommandSender { } override fun getFormattedCommandSenderName(): IChatComponent { - return ChatComponentText(commandSenderName) - } - - override fun getCommandSenderName(): String { - return "MatterLink" + return ChatComponentText(user) } + override fun getCommandSenderName() = accountName + override fun getEntityWorld(): World { return MinecraftServer.getServer().worldServerForDimension(0) } - override fun canCommandSenderUseCommand(permLevel: Int, commandName: String?): Boolean { + override fun canCommandSenderUseCommand(permLevel: Int, commandName: String): Boolean { //we do permission - return true + return canExecute(commandName) } override fun addChatMessage(component: IChatComponent) { @@ -46,5 +44,5 @@ object MatterlinkCommandSender : IMinecraftCommandSender, ICommandSender { )) } - override fun getCommandSenderPosition(): ChunkCoordinates = ChunkCoordinates(0,0,0) + override fun getCommandSenderPosition(): ChunkCoordinates = ChunkCoordinates(0, 0, 0) } \ No newline at end of file diff --git a/core/src/main/kotlin/matterlink/IMatterLink.kt b/core/src/main/kotlin/matterlink/IMatterLink.kt index 7563cc4..81886f2 100644 --- a/core/src/main/kotlin/matterlink/IMatterLink.kt +++ b/core/src/main/kotlin/matterlink/IMatterLink.kt @@ -6,6 +6,7 @@ import matterlink.bridge.command.IMinecraftCommandSender import matterlink.config.cfg import matterlink.update.UpdateChecker import java.io.File +import java.time.Duration lateinit var instance: IMatterLink @@ -13,14 +14,10 @@ abstract class IMatterLink { abstract val mcVersion: String abstract val modVersion: String - lateinit var cfgDir: File - - abstract var commandSender: IMinecraftCommandSender + abstract fun commandSenderFor(user: String, userid: String, server: String): IMinecraftCommandSender abstract fun wrappedSendToPlayers(msg: String) - abstract fun wrappedPlayerList(): Array - private var firstRun: Boolean = true fun connect() { @@ -63,13 +60,15 @@ abstract class IMatterLink { } fun getUptimeAsString(): String { - val total = this.getUptimeInSeconds() - val sec = total % 60 - val min = (total / 60) % 60 - val hr = (total / 3600) % 24 - val day = total / 86400 - - return "${day}d ${hr}hr ${min}m ${sec}s" + val duration = Duration.ofSeconds((System.currentTimeMillis() - serverStartTime) / 1000) + return duration.toString() +// val total = this.getUptimeInSeconds() +// val sec = total % 60 +// val min = (total / 60) % 60 +// val hr = (total / 3600) % 24 +// val day = total / 86400 +// +// return "${day}d ${hr}hr ${min}m ${sec}s" } fun registerBridgeCommands() { diff --git a/core/src/main/kotlin/matterlink/Util.kt b/core/src/main/kotlin/matterlink/Util.kt index b97da9a..f4aa63c 100644 --- a/core/src/main/kotlin/matterlink/Util.kt +++ b/core/src/main/kotlin/matterlink/Util.kt @@ -22,6 +22,16 @@ fun String.mapFormat(env: Map): String { return result } +fun String.lazyFormat(env: Map String>): String { + var result = this + env.forEach { key, value -> + if (result.contains(key)) { + result = result.replace(key, value()) + } + } + return result +} + val Exception.stackTraceString: String get() { val sw = StringWriter() diff --git a/core/src/main/kotlin/matterlink/bridge/command/BridgeCommandRegistry.kt b/core/src/main/kotlin/matterlink/bridge/command/BridgeCommandRegistry.kt index 1b4e5f2..0780acf 100644 --- a/core/src/main/kotlin/matterlink/bridge/command/BridgeCommandRegistry.kt +++ b/core/src/main/kotlin/matterlink/bridge/command/BridgeCommandRegistry.kt @@ -9,7 +9,7 @@ import java.util.* object BridgeCommandRegistry { - private val commandMap: HashMap = HashMap() + private val commandMap: HashMap = hashMapOf() fun handleCommand(input: ApiMessage): Boolean { if (!cfg.command.enable) return false @@ -28,7 +28,7 @@ object BridgeCommandRegistry { instance.error("Failed to register command: '${cmd.alias}'") return false } - if(!cmd.validate()) { + if (!cmd.validate()) { instance.error("Failed to validate command: '${cmd.alias}'") return false } @@ -48,16 +48,22 @@ object BridgeCommandRegistry { return if (help.isNotBlank()) help else "No help for '$cmd'" } - fun getCommandList (permLvl : Int) : String { - return commandMap.filter { (key, value) -> - value.permLevel <= permLvl - }.map {it.key}.joinToString(" ") + fun getCommandList(permLvl: Int): String { + return commandMap + .filterValues { + it.permLevel <= permLvl + } + .keys + .joinToString(" ") } fun reloadCommands() { commandMap.clear() - PermissionConfig.loadPermFile() + val permStatus = PermissionConfig.loadPermFile() register(HelpCommand) - registerAll(*CommandConfig.readConfig()) + val cmdStatus = CommandConfig.readConfig() + registerAll(*CommandConfig.commands) } + + operator fun get(command: String) = commandMap[command] } \ No newline at end of file diff --git a/core/src/main/kotlin/matterlink/bridge/command/CustomCommand.kt b/core/src/main/kotlin/matterlink/bridge/command/CustomCommand.kt index 53d26cb..37c5a89 100644 --- a/core/src/main/kotlin/matterlink/bridge/command/CustomCommand.kt +++ b/core/src/main/kotlin/matterlink/bridge/command/CustomCommand.kt @@ -3,6 +3,7 @@ package matterlink.bridge.command import matterlink.bridge.ApiMessage import matterlink.bridge.MessageHandler import matterlink.instance +import matterlink.lazyFormat data class CustomCommand( override val alias: String, @@ -11,23 +12,23 @@ data class CustomCommand( val response: String = "", override val permLevel: Int = 0, override val help: String = "", - val allowArgs : Boolean = true + val allowArgs: Boolean = true ) : IBridgeCommand { override fun execute(user: String, userId: String, server: String, args: String): Boolean { if (!allowArgs && args.isNotBlank()) return false - if (IBridgeCommand.getPermLevel(userId,server) < permLevel) { + if (!canExecute(userId, server)) { MessageHandler.transmit(ApiMessage(text = "$user is not permitted to perform command: $alias")) return false } return when (type) { CommandType.PASSTHROUGH -> { - //TODO: use a new commandSender for each user - instance.commandSender.execute("$execute $args") + //uses a new commandsender for each user + // TODO: cache CommandSenders + instance.commandSenderFor(user, userId, server).execute("$execute $args") } CommandType.RESPONSE -> { - //TODO: replace format variables, use arguments - MessageHandler.transmit(ApiMessage(text = response)) + MessageHandler.transmit(ApiMessage(text = response.lazyFormat(getReplacements(user, args)))) true } } @@ -37,10 +38,20 @@ data class CustomCommand( * */ override fun validate(): Boolean { - + val typeCheck = when (type) { + CommandType.PASSTHROUGH -> execute.isNotBlank() + CommandType.RESPONSE -> response.isNotBlank() + } + if (!typeCheck) return false return true } + + fun getReplacements(user: String, args: String): Map String> = mapOf( + "{UPTIME}" to instance::getUptimeAsString, + "{USER}" to { user }, + "{ARGS}" to { args } + ) } enum class CommandType { diff --git a/core/src/main/kotlin/matterlink/bridge/command/IBridgeCommand.kt b/core/src/main/kotlin/matterlink/bridge/command/IBridgeCommand.kt index 8eeca7f..80e28ca 100644 --- a/core/src/main/kotlin/matterlink/bridge/command/IBridgeCommand.kt +++ b/core/src/main/kotlin/matterlink/bridge/command/IBridgeCommand.kt @@ -3,17 +3,19 @@ package matterlink.bridge.command import matterlink.config.PermissionConfig interface IBridgeCommand { - val alias : String - val help : String - val permLevel : Int + val alias: String + val help: String + val permLevel: Int - fun execute(user:String, userId:String, server:String, args:String) : Boolean + fun execute(user: String, userId: String, server: String, args: String): Boolean + + fun canExecute(userId: String, server: String): Boolean { + return getPermLevel(userId, server) >= permLevel + } fun validate() = true companion object { - - fun getPermLevel(userId: String, server: String): Int { if (PermissionConfig.perms[server] == null) return 0 return PermissionConfig.perms[server]?.get(userId) ?: 0 diff --git a/core/src/main/kotlin/matterlink/bridge/command/IMinecraftCommandSender.kt b/core/src/main/kotlin/matterlink/bridge/command/IMinecraftCommandSender.kt index c5f0409..e330e5a 100644 --- a/core/src/main/kotlin/matterlink/bridge/command/IMinecraftCommandSender.kt +++ b/core/src/main/kotlin/matterlink/bridge/command/IMinecraftCommandSender.kt @@ -1,10 +1,21 @@ package matterlink.bridge.command -interface IMinecraftCommandSender { +import matterlink.instance + +abstract class IMinecraftCommandSender(val user: String, val userId: String, val server: String) { /** * @param cmdString The command to execute with its arguments * * @return True for success, or false for failure */ - fun execute(cmdString: String) : Boolean + abstract fun execute(cmdString: String): Boolean + + val accountName = "$user (id=$userId server=$server)" + + fun canExecute(commandName: String) : Boolean { + instance.info("testing $commandName") + val command = BridgeCommandRegistry[commandName] ?: return false + + return command.canExecute(userId, server) + } } \ No newline at end of file diff --git a/core/src/main/kotlin/matterlink/config/BaseConfig.kt b/core/src/main/kotlin/matterlink/config/BaseConfig.kt index 52520d7..4eac746 100644 --- a/core/src/main/kotlin/matterlink/config/BaseConfig.kt +++ b/core/src/main/kotlin/matterlink/config/BaseConfig.kt @@ -52,12 +52,7 @@ abstract class BaseConfig(rootDir: File) { data class CommandOptions( var prefix: String = "$", - var enable: Boolean = true, - var commandMapping: Map = mapOf( - "tps" to "forge tps", - "list" to "list", - "seed" to "seed" - ) + var enable: Boolean = true ) data class UpdateOptions( @@ -147,21 +142,7 @@ abstract class BaseConfig(rootDir: File) { command.prefix, "Prefix for MC bridge commands. Accepts a single character (not alphanumeric or /)", Pattern.compile("^[^0-9A-Za-z/]$") - ), - commandMapping = getStringList( - "commandMapping", - category, - command.commandMapping.map { entry -> - "${entry.key}=${entry.value}" - } - .toTypedArray(), - "MC commands that can be executed through the bridge" + - "\nSeparate bridge command and MC command with '='." - ).associate { - val key = it.substringBefore('=') - val value = it.substringAfter('=') - Pair(key, value) - } + ) ) category = "formatting" diff --git a/core/src/main/kotlin/matterlink/config/CommandConfig.kt b/core/src/main/kotlin/matterlink/config/CommandConfig.kt index 22e5fcb..67ff33b 100644 --- a/core/src/main/kotlin/matterlink/config/CommandConfig.kt +++ b/core/src/main/kotlin/matterlink/config/CommandConfig.kt @@ -2,14 +2,18 @@ package matterlink.config import com.google.gson.Gson import com.google.gson.GsonBuilder +import com.google.gson.JsonSyntaxException +import com.google.gson.stream.MalformedJsonException import matterlink.bridge.command.CommandType import matterlink.bridge.command.CustomCommand +import matterlink.bridge.command.IBridgeCommand +import matterlink.instance import java.io.File object CommandConfig { private val gson: Gson = GsonBuilder().setPrettyPrinting().create() private val configFile: File = cfg.cfgDirectory.resolve("commands.json") - private val default = arrayOf( + private val default = arrayOf( CustomCommand( alias = "tps", type = CommandType.PASSTHROUGH, @@ -32,16 +36,24 @@ object CommandConfig { allowArgs = false ) ) + var commands: Array = default + private set - fun readConfig() : Array { - if(!configFile.exists()) { + fun readConfig(): Boolean { + if (!configFile.exists()) { configFile.createNewFile() configFile.writeText(gson.toJson(default)) - return default + return true } val text = configFile.readText() - return gson.fromJson(text, Array::class.java) + try { + commands = gson.fromJson(text, Array::class.java) + } catch (e: JsonSyntaxException) { + instance.fatal("failed to parse $configFile using last good values as fallback") + return false + } + return true } diff --git a/core/src/main/kotlin/matterlink/config/PermissionConfig.kt b/core/src/main/kotlin/matterlink/config/PermissionConfig.kt index a328a64..2383b41 100644 --- a/core/src/main/kotlin/matterlink/config/PermissionConfig.kt +++ b/core/src/main/kotlin/matterlink/config/PermissionConfig.kt @@ -2,26 +2,37 @@ package matterlink.config import com.google.gson.Gson import com.google.gson.GsonBuilder +import com.google.gson.JsonSyntaxException import com.google.gson.reflect.TypeToken +import com.google.gson.stream.MalformedJsonException +import matterlink.instance import java.io.File +typealias PermissionMap = HashMap> + object PermissionConfig { private val gson: Gson = GsonBuilder().setPrettyPrinting().create() private val configFile: File = cfg.cfgDirectory.resolve("permissions.json") - private val default = hashMapOf>() + private val default = PermissionMap() - var perms : HashMap> = default + var perms: PermissionMap = default - fun loadPermFile() { - if(!configFile.exists()) { + fun loadPermFile(): Boolean { + if (!configFile.exists()) { configFile.createNewFile() perms = default configFile.writeText(gson.toJson(default)) - return + return true } val text = configFile.readText() - perms = gson.fromJson(text, object : TypeToken >>(){}.type) + try { + perms = gson.fromJson(text, object : TypeToken() {}.type) + } catch (e: JsonSyntaxException) { + instance.fatal("failed to parse $configFile using last good values as fallback") + return false + } + return true } } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 0fe3ea8..3ae1080 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ mod_name = MatterLink -mod_version = 1.4.1 +mod_version = 1.4.2 forgelin_version = 1.6.0 \ No newline at end of file