finished loading custom commands and permissions from file
This commit is contained in:
parent
968ff1aacc
commit
6c5a381903
|
@ -1,8 +1,8 @@
|
||||||
package matterlink
|
package matterlink
|
||||||
|
|
||||||
import matterlink.command.CommandMatterlink
|
|
||||||
import matterlink.bridge.command.IMinecraftCommandSender
|
import matterlink.bridge.command.IMinecraftCommandSender
|
||||||
import matterlink.command.MatterlinkCommandSender
|
import matterlink.command.CommandMatterlink
|
||||||
|
import matterlink.command.MatterLinkCommandSender
|
||||||
import matterlink.config.cfg
|
import matterlink.config.cfg
|
||||||
import net.minecraft.util.text.TextComponentString
|
import net.minecraft.util.text.TextComponentString
|
||||||
import net.minecraftforge.fml.common.FMLCommonHandler
|
import net.minecraftforge.fml.common.FMLCommonHandler
|
||||||
|
@ -58,15 +58,10 @@ object MatterLink : IMatterLink() {
|
||||||
FMLCommonHandler.instance().minecraftServerInstance.playerList.sendChatMsg(TextComponentString(msg))
|
FMLCommonHandler.instance().minecraftServerInstance.playerList.sendChatMsg(TextComponentString(msg))
|
||||||
}
|
}
|
||||||
|
|
||||||
//FORGE-DEPENDENT
|
|
||||||
override fun wrappedPlayerList(): Array<String> {
|
|
||||||
return FMLCommonHandler.instance().minecraftServerInstance.playerList.onlinePlayerNames
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun log(level: String, formatString: String, vararg data: Any) =
|
override fun log(level: String, formatString: String, vararg data: Any) =
|
||||||
logger.log(Level.toLevel(level, Level.INFO), formatString, *data)
|
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 mcVersion: String = MCVERSION
|
||||||
override val modVersion: String = MODVERSION
|
override val modVersion: String = MODVERSION
|
||||||
|
|
|
@ -16,7 +16,7 @@ import net.minecraft.world.World
|
||||||
import net.minecraftforge.fml.common.FMLCommonHandler
|
import net.minecraftforge.fml.common.FMLCommonHandler
|
||||||
import javax.annotation.Nonnull
|
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
|
private var level: Int = 0
|
||||||
|
|
||||||
override fun execute(cmdString: String): Boolean {
|
override fun execute(cmdString: String): Boolean {
|
||||||
|
@ -27,20 +27,18 @@ object MatterlinkCommandSender : IMinecraftCommandSender, ICommandSender {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getDisplayName(): ITextComponent {
|
override fun getDisplayName(): ITextComponent {
|
||||||
return TextComponentString("MatterLink")
|
return TextComponentString(user)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getName(): String {
|
override fun getName() = accountName
|
||||||
return "MatterLink"
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getEntityWorld(): World {
|
override fun getEntityWorld(): World {
|
||||||
return FMLCommonHandler.instance().minecraftServerInstance.worldServerForDimension(0)
|
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
|
//we check user on our end
|
||||||
return true
|
return canExecute(commandName)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getServer(): MinecraftServer? {
|
override fun getServer(): MinecraftServer? {
|
||||||
|
@ -59,7 +57,6 @@ object MatterlinkCommandSender : IMinecraftCommandSender, ICommandSender {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
//WtfMojangWhy
|
|
||||||
override fun getPosition(): BlockPos = BlockPos.ORIGIN
|
override fun getPosition(): BlockPos = BlockPos.ORIGIN
|
||||||
|
|
||||||
override fun setCommandStat(type: CommandResultStats.Type?, amount: Int) {}
|
override fun setCommandStat(type: CommandResultStats.Type?, amount: Int) {}
|
|
@ -1,8 +1,8 @@
|
||||||
package matterlink
|
package matterlink
|
||||||
|
|
||||||
import matterlink.command.CommandMatterlink
|
|
||||||
import matterlink.bridge.command.IMinecraftCommandSender
|
import matterlink.bridge.command.IMinecraftCommandSender
|
||||||
import matterlink.command.MatterlinkCommandSender
|
import matterlink.command.CommandMatterlink
|
||||||
|
import matterlink.command.MatterLinkCommandSender
|
||||||
import matterlink.config.cfg
|
import matterlink.config.cfg
|
||||||
import net.minecraft.util.text.TextComponentString
|
import net.minecraft.util.text.TextComponentString
|
||||||
import net.minecraftforge.fml.common.FMLCommonHandler
|
import net.minecraftforge.fml.common.FMLCommonHandler
|
||||||
|
@ -58,15 +58,10 @@ object MatterLink : IMatterLink() {
|
||||||
FMLCommonHandler.instance().minecraftServerInstance.playerList.sendMessage(TextComponentString(msg))
|
FMLCommonHandler.instance().minecraftServerInstance.playerList.sendMessage(TextComponentString(msg))
|
||||||
}
|
}
|
||||||
|
|
||||||
//FORGE-DEPENDENT
|
|
||||||
override fun wrappedPlayerList(): Array<String> {
|
|
||||||
return FMLCommonHandler.instance().minecraftServerInstance.playerList.onlinePlayerNames
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun log(level: String, formatString: String, vararg data: Any) =
|
override fun log(level: String, formatString: String, vararg data: Any) =
|
||||||
logger.log(Level.toLevel(level, Level.INFO), formatString, *data)
|
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 mcVersion: String = MCVERSION
|
||||||
override val modVersion: String = MODVERSION
|
override val modVersion: String = MODVERSION
|
||||||
|
|
|
@ -16,7 +16,7 @@ import net.minecraft.world.World
|
||||||
import net.minecraftforge.fml.common.FMLCommonHandler
|
import net.minecraftforge.fml.common.FMLCommonHandler
|
||||||
import javax.annotation.Nonnull
|
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 {
|
override fun execute(cmdString: String): Boolean {
|
||||||
return 0 < FMLCommonHandler.instance().minecraftServerInstance.commandManager.executeCommand(
|
return 0 < FMLCommonHandler.instance().minecraftServerInstance.commandManager.executeCommand(
|
||||||
|
@ -26,20 +26,18 @@ object MatterlinkCommandSender : IMinecraftCommandSender, ICommandSender {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getDisplayName(): ITextComponent {
|
override fun getDisplayName(): ITextComponent {
|
||||||
return TextComponentString("MatterLink")
|
return TextComponentString(user)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getName(): String {
|
override fun getName() = accountName
|
||||||
return "MatterLink"
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getEntityWorld(): World {
|
override fun getEntityWorld(): World {
|
||||||
return FMLCommonHandler.instance().minecraftServerInstance.getWorld(0)
|
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
|
//we now do permissions checking on our end
|
||||||
return true
|
return canExecute(commandName)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getServer(): MinecraftServer? {
|
override fun getServer(): MinecraftServer? {
|
|
@ -1,8 +1,8 @@
|
||||||
package matterlink
|
package matterlink
|
||||||
|
|
||||||
import matterlink.command.CommandMatterlink
|
|
||||||
import matterlink.bridge.command.IMinecraftCommandSender
|
import matterlink.bridge.command.IMinecraftCommandSender
|
||||||
import matterlink.command.MatterlinkCommandSender
|
import matterlink.command.CommandMatterlink
|
||||||
|
import matterlink.command.MatterLinkCommandSender
|
||||||
import matterlink.config.cfg
|
import matterlink.config.cfg
|
||||||
import net.minecraft.util.text.TextComponentString
|
import net.minecraft.util.text.TextComponentString
|
||||||
import net.minecraftforge.fml.common.FMLCommonHandler
|
import net.minecraftforge.fml.common.FMLCommonHandler
|
||||||
|
@ -63,15 +63,11 @@ object MatterLink : IMatterLink() {
|
||||||
FMLCommonHandler.instance().minecraftServerInstance.playerList.sendMessage(TextComponentString(msg))
|
FMLCommonHandler.instance().minecraftServerInstance.playerList.sendMessage(TextComponentString(msg))
|
||||||
}
|
}
|
||||||
|
|
||||||
//FORGE-DEPENDENT
|
|
||||||
override fun wrappedPlayerList(): Array<String> {
|
|
||||||
return FMLCommonHandler.instance().minecraftServerInstance.playerList.onlinePlayerNames
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun log(level: String, formatString: String, vararg data: Any) =
|
override fun log(level: String, formatString: String, vararg data: Any) =
|
||||||
logger.log(Level.toLevel(level, Level.INFO), formatString, *data)
|
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 mcVersion: String = MCVERSION
|
||||||
override val modVersion: String = MODVERSION
|
override val modVersion: String = MODVERSION
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,11 +7,12 @@ import matterlink.config.cfg
|
||||||
import net.minecraft.command.ICommandSender
|
import net.minecraft.command.ICommandSender
|
||||||
import net.minecraft.server.MinecraftServer
|
import net.minecraft.server.MinecraftServer
|
||||||
import net.minecraft.util.text.ITextComponent
|
import net.minecraft.util.text.ITextComponent
|
||||||
|
import net.minecraft.util.text.TextComponentString
|
||||||
import net.minecraft.world.World
|
import net.minecraft.world.World
|
||||||
import net.minecraftforge.fml.common.FMLCommonHandler
|
import net.minecraftforge.fml.common.FMLCommonHandler
|
||||||
import javax.annotation.Nonnull
|
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 {
|
override fun execute(cmdString: String): Boolean {
|
||||||
return 0 < FMLCommonHandler.instance().minecraftServerInstance.commandManager.executeCommand(
|
return 0 < FMLCommonHandler.instance().minecraftServerInstance.commandManager.executeCommand(
|
||||||
|
@ -20,17 +21,19 @@ object MatterlinkCommandSender : IMinecraftCommandSender, ICommandSender {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getName(): String {
|
override fun getDisplayName(): ITextComponent {
|
||||||
return "MatterLink"
|
return TextComponentString(user)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getName() = accountName
|
||||||
|
|
||||||
override fun getEntityWorld(): World {
|
override fun getEntityWorld(): World {
|
||||||
return FMLCommonHandler.instance().minecraftServerInstance.getWorld(0)
|
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
|
//permissions are checked on our end
|
||||||
return true
|
return canExecute(commandName)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getServer(): MinecraftServer? {
|
override fun getServer(): MinecraftServer? {
|
|
@ -5,7 +5,7 @@ import cpw.mods.fml.common.Mod
|
||||||
import cpw.mods.fml.common.event.*
|
import cpw.mods.fml.common.event.*
|
||||||
import matterlink.command.CommandMatterlink
|
import matterlink.command.CommandMatterlink
|
||||||
import matterlink.bridge.command.IMinecraftCommandSender
|
import matterlink.bridge.command.IMinecraftCommandSender
|
||||||
import matterlink.command.MatterlinkCommandSender
|
import matterlink.command.MatterLinkCommandSender
|
||||||
import matterlink.config.cfg
|
import matterlink.config.cfg
|
||||||
import net.minecraft.server.MinecraftServer
|
import net.minecraft.server.MinecraftServer
|
||||||
import net.minecraft.util.ChatComponentText
|
import net.minecraft.util.ChatComponentText
|
||||||
|
@ -60,15 +60,10 @@ class MatterLink : IMatterLink() {
|
||||||
MinecraftServer.getServer().addChatMessage(ChatComponentText(msg));
|
MinecraftServer.getServer().addChatMessage(ChatComponentText(msg));
|
||||||
}
|
}
|
||||||
|
|
||||||
//FORGE-DEPENDENT
|
|
||||||
override fun wrappedPlayerList(): Array<String> {
|
|
||||||
return MinecraftServer.getServer().allUsernames
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun log(level: String, formatString: String, vararg data: Any) =
|
override fun log(level: String, formatString: String, vararg data: Any) =
|
||||||
logger.log(Level.toLevel(level, Level.INFO), formatString, *data)
|
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 mcVersion: String = MCVERSION
|
||||||
override val modVersion: String = MODVERSION
|
override val modVersion: String = MODVERSION
|
||||||
|
|
|
@ -11,7 +11,7 @@ import net.minecraft.util.ChunkCoordinates
|
||||||
import net.minecraft.util.IChatComponent
|
import net.minecraft.util.IChatComponent
|
||||||
import net.minecraft.world.World
|
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
|
private var level: Int = 0
|
||||||
|
|
||||||
|
@ -23,20 +23,18 @@ object MatterlinkCommandSender : IMinecraftCommandSender, ICommandSender {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getFormattedCommandSenderName(): IChatComponent {
|
override fun getFormattedCommandSenderName(): IChatComponent {
|
||||||
return ChatComponentText(commandSenderName)
|
return ChatComponentText(user)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getCommandSenderName(): String {
|
override fun getCommandSenderName() = accountName
|
||||||
return "MatterLink"
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getEntityWorld(): World {
|
override fun getEntityWorld(): World {
|
||||||
return MinecraftServer.getServer().worldServerForDimension(0)
|
return MinecraftServer.getServer().worldServerForDimension(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun canCommandSenderUseCommand(permLevel: Int, commandName: String?): Boolean {
|
override fun canCommandSenderUseCommand(permLevel: Int, commandName: String): Boolean {
|
||||||
//we do permission
|
//we do permission
|
||||||
return true
|
return canExecute(commandName)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun addChatMessage(component: IChatComponent) {
|
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)
|
||||||
}
|
}
|
|
@ -6,6 +6,7 @@ import matterlink.bridge.command.IMinecraftCommandSender
|
||||||
import matterlink.config.cfg
|
import matterlink.config.cfg
|
||||||
import matterlink.update.UpdateChecker
|
import matterlink.update.UpdateChecker
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.time.Duration
|
||||||
|
|
||||||
lateinit var instance: IMatterLink
|
lateinit var instance: IMatterLink
|
||||||
|
|
||||||
|
@ -13,14 +14,10 @@ abstract class IMatterLink {
|
||||||
abstract val mcVersion: String
|
abstract val mcVersion: String
|
||||||
abstract val modVersion: String
|
abstract val modVersion: String
|
||||||
|
|
||||||
lateinit var cfgDir: File
|
abstract fun commandSenderFor(user: String, userid: String, server: String): IMinecraftCommandSender
|
||||||
|
|
||||||
abstract var commandSender: IMinecraftCommandSender
|
|
||||||
|
|
||||||
abstract fun wrappedSendToPlayers(msg: String)
|
abstract fun wrappedSendToPlayers(msg: String)
|
||||||
|
|
||||||
abstract fun wrappedPlayerList(): Array<String>
|
|
||||||
|
|
||||||
private var firstRun: Boolean = true
|
private var firstRun: Boolean = true
|
||||||
|
|
||||||
fun connect() {
|
fun connect() {
|
||||||
|
@ -63,13 +60,15 @@ abstract class IMatterLink {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getUptimeAsString(): String {
|
fun getUptimeAsString(): String {
|
||||||
val total = this.getUptimeInSeconds()
|
val duration = Duration.ofSeconds((System.currentTimeMillis() - serverStartTime) / 1000)
|
||||||
val sec = total % 60
|
return duration.toString()
|
||||||
val min = (total / 60) % 60
|
// val total = this.getUptimeInSeconds()
|
||||||
val hr = (total / 3600) % 24
|
// val sec = total % 60
|
||||||
val day = total / 86400
|
// val min = (total / 60) % 60
|
||||||
|
// val hr = (total / 3600) % 24
|
||||||
return "${day}d ${hr}hr ${min}m ${sec}s"
|
// val day = total / 86400
|
||||||
|
//
|
||||||
|
// return "${day}d ${hr}hr ${min}m ${sec}s"
|
||||||
}
|
}
|
||||||
|
|
||||||
fun registerBridgeCommands() {
|
fun registerBridgeCommands() {
|
||||||
|
|
|
@ -22,6 +22,16 @@ fun String.mapFormat(env: Map<String, String>): String {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun String.lazyFormat(env: Map<String, () -> String>): String {
|
||||||
|
var result = this
|
||||||
|
env.forEach { key, value ->
|
||||||
|
if (result.contains(key)) {
|
||||||
|
result = result.replace(key, value())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
val Exception.stackTraceString: String
|
val Exception.stackTraceString: String
|
||||||
get() {
|
get() {
|
||||||
val sw = StringWriter()
|
val sw = StringWriter()
|
||||||
|
|
|
@ -9,7 +9,7 @@ import java.util.*
|
||||||
|
|
||||||
object BridgeCommandRegistry {
|
object BridgeCommandRegistry {
|
||||||
|
|
||||||
private val commandMap: HashMap<String, IBridgeCommand> = HashMap()
|
private val commandMap: HashMap<String, IBridgeCommand> = hashMapOf()
|
||||||
|
|
||||||
fun handleCommand(input: ApiMessage): Boolean {
|
fun handleCommand(input: ApiMessage): Boolean {
|
||||||
if (!cfg.command.enable) return false
|
if (!cfg.command.enable) return false
|
||||||
|
@ -28,7 +28,7 @@ object BridgeCommandRegistry {
|
||||||
instance.error("Failed to register command: '${cmd.alias}'")
|
instance.error("Failed to register command: '${cmd.alias}'")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if(!cmd.validate()) {
|
if (!cmd.validate()) {
|
||||||
instance.error("Failed to validate command: '${cmd.alias}'")
|
instance.error("Failed to validate command: '${cmd.alias}'")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -48,16 +48,22 @@ object BridgeCommandRegistry {
|
||||||
return if (help.isNotBlank()) help else "No help for '$cmd'"
|
return if (help.isNotBlank()) help else "No help for '$cmd'"
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getCommandList (permLvl : Int) : String {
|
fun getCommandList(permLvl: Int): String {
|
||||||
return commandMap.filter { (key, value) ->
|
return commandMap
|
||||||
value.permLevel <= permLvl
|
.filterValues {
|
||||||
}.map {it.key}.joinToString(" ")
|
it.permLevel <= permLvl
|
||||||
|
}
|
||||||
|
.keys
|
||||||
|
.joinToString(" ")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun reloadCommands() {
|
fun reloadCommands() {
|
||||||
commandMap.clear()
|
commandMap.clear()
|
||||||
PermissionConfig.loadPermFile()
|
val permStatus = PermissionConfig.loadPermFile()
|
||||||
register(HelpCommand)
|
register(HelpCommand)
|
||||||
registerAll(*CommandConfig.readConfig())
|
val cmdStatus = CommandConfig.readConfig()
|
||||||
|
registerAll(*CommandConfig.commands)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
operator fun get(command: String) = commandMap[command]
|
||||||
}
|
}
|
|
@ -3,6 +3,7 @@ package matterlink.bridge.command
|
||||||
import matterlink.bridge.ApiMessage
|
import matterlink.bridge.ApiMessage
|
||||||
import matterlink.bridge.MessageHandler
|
import matterlink.bridge.MessageHandler
|
||||||
import matterlink.instance
|
import matterlink.instance
|
||||||
|
import matterlink.lazyFormat
|
||||||
|
|
||||||
data class CustomCommand(
|
data class CustomCommand(
|
||||||
override val alias: String,
|
override val alias: String,
|
||||||
|
@ -11,23 +12,23 @@ data class CustomCommand(
|
||||||
val response: String = "",
|
val response: String = "",
|
||||||
override val permLevel: Int = 0,
|
override val permLevel: Int = 0,
|
||||||
override val help: String = "",
|
override val help: String = "",
|
||||||
val allowArgs : Boolean = true
|
val allowArgs: Boolean = true
|
||||||
) : IBridgeCommand {
|
) : IBridgeCommand {
|
||||||
override fun execute(user: String, userId: String, server: String, args: String): Boolean {
|
override fun execute(user: String, userId: String, server: String, args: String): Boolean {
|
||||||
if (!allowArgs && args.isNotBlank()) return false
|
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"))
|
MessageHandler.transmit(ApiMessage(text = "$user is not permitted to perform command: $alias"))
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
return when (type) {
|
return when (type) {
|
||||||
CommandType.PASSTHROUGH -> {
|
CommandType.PASSTHROUGH -> {
|
||||||
//TODO: use a new commandSender for each user
|
//uses a new commandsender for each user
|
||||||
instance.commandSender.execute("$execute $args")
|
// TODO: cache CommandSenders
|
||||||
|
instance.commandSenderFor(user, userId, server).execute("$execute $args")
|
||||||
}
|
}
|
||||||
CommandType.RESPONSE -> {
|
CommandType.RESPONSE -> {
|
||||||
//TODO: replace format variables, use arguments
|
MessageHandler.transmit(ApiMessage(text = response.lazyFormat(getReplacements(user, args))))
|
||||||
MessageHandler.transmit(ApiMessage(text = response))
|
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,10 +38,20 @@ data class CustomCommand(
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
override fun validate(): Boolean {
|
override fun validate(): Boolean {
|
||||||
|
val typeCheck = when (type) {
|
||||||
|
CommandType.PASSTHROUGH -> execute.isNotBlank()
|
||||||
|
CommandType.RESPONSE -> response.isNotBlank()
|
||||||
|
}
|
||||||
|
if (!typeCheck) return false
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun getReplacements(user: String, args: String): Map<String, () -> String> = mapOf(
|
||||||
|
"{UPTIME}" to instance::getUptimeAsString,
|
||||||
|
"{USER}" to { user },
|
||||||
|
"{ARGS}" to { args }
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class CommandType {
|
enum class CommandType {
|
||||||
|
|
|
@ -3,17 +3,19 @@ package matterlink.bridge.command
|
||||||
import matterlink.config.PermissionConfig
|
import matterlink.config.PermissionConfig
|
||||||
|
|
||||||
interface IBridgeCommand {
|
interface IBridgeCommand {
|
||||||
val alias : String
|
val alias: String
|
||||||
val help : String
|
val help: String
|
||||||
val permLevel : Int
|
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
|
fun validate() = true
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
|
|
||||||
fun getPermLevel(userId: String, server: String): Int {
|
fun getPermLevel(userId: String, server: String): Int {
|
||||||
if (PermissionConfig.perms[server] == null) return 0
|
if (PermissionConfig.perms[server] == null) return 0
|
||||||
return PermissionConfig.perms[server]?.get(userId) ?: 0
|
return PermissionConfig.perms[server]?.get(userId) ?: 0
|
||||||
|
|
|
@ -1,10 +1,21 @@
|
||||||
package matterlink.bridge.command
|
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
|
* @param cmdString The command to execute with its arguments
|
||||||
*
|
*
|
||||||
* @return True for success, or false for failure
|
* @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)
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -52,12 +52,7 @@ abstract class BaseConfig(rootDir: File) {
|
||||||
|
|
||||||
data class CommandOptions(
|
data class CommandOptions(
|
||||||
var prefix: String = "$",
|
var prefix: String = "$",
|
||||||
var enable: Boolean = true,
|
var enable: Boolean = true
|
||||||
var commandMapping: Map<String, String> = mapOf(
|
|
||||||
"tps" to "forge tps",
|
|
||||||
"list" to "list",
|
|
||||||
"seed" to "seed"
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
data class UpdateOptions(
|
data class UpdateOptions(
|
||||||
|
@ -147,21 +142,7 @@ abstract class BaseConfig(rootDir: File) {
|
||||||
command.prefix,
|
command.prefix,
|
||||||
"Prefix for MC bridge commands. Accepts a single character (not alphanumeric or /)",
|
"Prefix for MC bridge commands. Accepts a single character (not alphanumeric or /)",
|
||||||
Pattern.compile("^[^0-9A-Za-z/]$")
|
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"
|
category = "formatting"
|
||||||
|
|
|
@ -2,14 +2,18 @@ package matterlink.config
|
||||||
|
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.google.gson.GsonBuilder
|
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.CommandType
|
||||||
import matterlink.bridge.command.CustomCommand
|
import matterlink.bridge.command.CustomCommand
|
||||||
|
import matterlink.bridge.command.IBridgeCommand
|
||||||
|
import matterlink.instance
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
object CommandConfig {
|
object CommandConfig {
|
||||||
private val gson: Gson = GsonBuilder().setPrettyPrinting().create()
|
private val gson: Gson = GsonBuilder().setPrettyPrinting().create()
|
||||||
private val configFile: File = cfg.cfgDirectory.resolve("commands.json")
|
private val configFile: File = cfg.cfgDirectory.resolve("commands.json")
|
||||||
private val default = arrayOf(
|
private val default = arrayOf<CustomCommand>(
|
||||||
CustomCommand(
|
CustomCommand(
|
||||||
alias = "tps",
|
alias = "tps",
|
||||||
type = CommandType.PASSTHROUGH,
|
type = CommandType.PASSTHROUGH,
|
||||||
|
@ -32,16 +36,24 @@ object CommandConfig {
|
||||||
allowArgs = false
|
allowArgs = false
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
var commands: Array<CustomCommand> = default
|
||||||
|
private set
|
||||||
|
|
||||||
fun readConfig() : Array<CustomCommand> {
|
fun readConfig(): Boolean {
|
||||||
if(!configFile.exists()) {
|
if (!configFile.exists()) {
|
||||||
configFile.createNewFile()
|
configFile.createNewFile()
|
||||||
configFile.writeText(gson.toJson(default))
|
configFile.writeText(gson.toJson(default))
|
||||||
return default
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
val text = configFile.readText()
|
val text = configFile.readText()
|
||||||
return gson.fromJson(text, Array<CustomCommand>::class.java)
|
try {
|
||||||
|
commands = gson.fromJson(text, Array<CustomCommand>::class.java)
|
||||||
|
} catch (e: JsonSyntaxException) {
|
||||||
|
instance.fatal("failed to parse $configFile using last good values as fallback")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,26 +2,37 @@ package matterlink.config
|
||||||
|
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.google.gson.GsonBuilder
|
import com.google.gson.GsonBuilder
|
||||||
|
import com.google.gson.JsonSyntaxException
|
||||||
import com.google.gson.reflect.TypeToken
|
import com.google.gson.reflect.TypeToken
|
||||||
|
import com.google.gson.stream.MalformedJsonException
|
||||||
|
import matterlink.instance
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
|
typealias PermissionMap = HashMap<String, HashMap<String, Int>>
|
||||||
|
|
||||||
object PermissionConfig {
|
object PermissionConfig {
|
||||||
private val gson: Gson = GsonBuilder().setPrettyPrinting().create()
|
private val gson: Gson = GsonBuilder().setPrettyPrinting().create()
|
||||||
private val configFile: File = cfg.cfgDirectory.resolve("permissions.json")
|
private val configFile: File = cfg.cfgDirectory.resolve("permissions.json")
|
||||||
|
|
||||||
private val default = hashMapOf<String,HashMap<String,Int>>()
|
private val default = PermissionMap()
|
||||||
|
|
||||||
var perms : HashMap<String,HashMap<String,Int>> = default
|
var perms: PermissionMap = default
|
||||||
|
|
||||||
fun loadPermFile() {
|
fun loadPermFile(): Boolean {
|
||||||
if(!configFile.exists()) {
|
if (!configFile.exists()) {
|
||||||
configFile.createNewFile()
|
configFile.createNewFile()
|
||||||
perms = default
|
perms = default
|
||||||
configFile.writeText(gson.toJson(default))
|
configFile.writeText(gson.toJson(default))
|
||||||
return
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
val text = configFile.readText()
|
val text = configFile.readText()
|
||||||
perms = gson.fromJson(text, object : TypeToken <HashMap<String,HashMap<String,Int>>>(){}.type)
|
try {
|
||||||
|
perms = gson.fromJson(text, object : TypeToken<PermissionMap>() {}.type)
|
||||||
|
} catch (e: JsonSyntaxException) {
|
||||||
|
instance.fatal("failed to parse $configFile using last good values as fallback")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,3 +1,3 @@
|
||||||
mod_name = MatterLink
|
mod_name = MatterLink
|
||||||
mod_version = 1.4.1
|
mod_version = 1.4.2
|
||||||
forgelin_version = 1.6.0
|
forgelin_version = 1.6.0
|
Loading…
Reference in New Issue