[cleanup] Cleaned up Macro (#1753)

This commit is contained in:
Xiaro 2020-12-15 13:02:42 -05:00 committed by GitHub
parent 2149ab7c4d
commit f98cca9b85
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 84 additions and 155 deletions

View File

@ -8,7 +8,6 @@ import me.zeroeightsix.kami.event.KamiEventBus;
import me.zeroeightsix.kami.gui.kami.KamiGUI;
import me.zeroeightsix.kami.gui.mc.KamiGuiUpdateNotification;
import me.zeroeightsix.kami.manager.ManagerLoader;
import me.zeroeightsix.kami.manager.managers.FileInstanceManager;
import me.zeroeightsix.kami.module.Module;
import me.zeroeightsix.kami.module.ModuleManager;
import me.zeroeightsix.kami.setting.Setting;
@ -95,7 +94,6 @@ public class KamiMod {
guiManager.initializeGUI();
commandManager = new CommandManager();
FileInstanceManager.fixEmptyFiles();
ConfigUtils.INSTANCE.loadAll();
// After settings loaded, we want to let the enabled modules know they've been enabled (since the setting is done through reflection)

View File

@ -3,67 +3,64 @@ package me.zeroeightsix.kami.command.commands
import me.zeroeightsix.kami.command.Command
import me.zeroeightsix.kami.command.syntax.ChunkBuilder
import me.zeroeightsix.kami.command.syntax.parsers.EnumParser
import me.zeroeightsix.kami.manager.managers.FileInstanceManager
import me.zeroeightsix.kami.manager.managers.MacroManager
import me.zeroeightsix.kami.util.Macro
import me.zeroeightsix.kami.util.Wrapper
import me.zeroeightsix.kami.util.text.MessageSendHelper.sendChatMessage
import me.zeroeightsix.kami.util.text.MessageSendHelper.sendErrorMessage
import me.zeroeightsix.kami.util.text.MessageSendHelper.sendRawChatMessage
import me.zeroeightsix.kami.util.text.MessageSendHelper.sendWarningMessage
import me.zeroeightsix.kami.util.text.MessageSendHelper
/**
* @author l1ving
* Created by l1ving on 04/05/20
*/
class MacroCommand : Command("macro", ChunkBuilder().append("command", true, EnumParser(arrayOf("key", "list"))).append("setting", false, EnumParser(arrayOf("clear", "message|command"))).build(), "m") {
override fun call(args: Array<out String?>) {
val rKey = args[0] ?: return
val macro = args[1]
val key = Wrapper.getKey(rKey)
val keycode = Wrapper.getKey(rKey)
if (key == 0 && !rKey.equals("list", true)) {
sendErrorMessage("Unknown key '&7$rKey&f'! Left alt is &7lmenu&f, left Control is &7lcontrol&f and ` is &7grave&f. You cannot bind the &7meta&f key.")
if (keycode == 0 && !rKey.equals("list", true)) {
MessageSendHelper.sendErrorMessage("Unknown key '&7$rKey&f'! Left alt is &7lmenu&f, left Control is &7lcontrol&f and ` is &7grave&f. You cannot bind the &7meta&f key.")
return
}
val keyList: List<String?>? = Macro.getMacrosForKey(key)
when {
args[0] == null -> { /* key, error message is caught by the command handler but you don't want to continue the rest */
return
}
args[0].equals("list", ignoreCase = true) -> {
if (FileInstanceManager.macros.isEmpty()) {
sendChatMessage("You have no macros")
return
}
sendChatMessage("You have the following macros: ")
for ((key1, value) in FileInstanceManager.macros) {
sendRawChatMessage(Wrapper.getKeyName(key1) + ": $value")
if (MacroManager.isEmpty) {
MessageSendHelper.sendChatMessage("You have no macros")
} else {
MessageSendHelper.sendChatMessage("You have the following macros: ")
for ((key, value) in MacroManager.macros) {
MessageSendHelper.sendRawChatMessage(Wrapper.getKeyName(key) + ": $value")
}
}
}
args[1] == null -> { /* message */
val keyList = MacroManager.getMacros(keycode)
if (keyList == null || keyList.isEmpty()) {
sendChatMessage("'&7$rKey&f' has no macros")
MessageSendHelper.sendChatMessage("'&7$rKey&f' has no macros")
return
}
sendChatMessage("'&7$rKey&f' has the following macros: ")
Macro.sendMacrosToChat(keyList.toTypedArray())
val message = "'&7$rKey&f' has the following macros:\n" +
keyList.joinToString("\n")
MessageSendHelper.sendChatMessage(message)
}
args[1].equals("clear", ignoreCase = true) -> {
Macro.removeMacro(key)
MacroManager.removeMacro(keycode)
MacroManager.saveMacros()
MacroManager.loadMacros()
sendChatMessage("Cleared macros for '&7$rKey&f'")
MessageSendHelper.sendChatMessage("Cleared macros for '&7$rKey&f'")
}
args[2] != null -> { /* some random 3rd argument which shouldn't exist */
sendWarningMessage("$chatLabel Your macro / command must be inside quotes, as 1 argument in the command. Example: &7" + getCommandPrefix() + label + " R \";set AutoSpawner debug toggle\"")
MessageSendHelper.sendWarningMessage("$chatLabel Your macro / command must be inside quotes, as 1 argument in the command. Example: &7" +
getCommandPrefix() + label + " R \";set AutoSpawner debug toggle\"")
}
else -> {
Macro.addMacroToKey(key, macro)
val macro = args[1]!!
MacroManager.addMacroToKey(keycode, macro)
MacroManager.saveMacros()
sendChatMessage("Added macro '&7$macro&f' for key '&7$rKey&f'")
MessageSendHelper.sendChatMessage("Added macro '&7$macro&f' for key '&7$rKey&f'")
}
}
}

View File

@ -2,16 +2,9 @@ package me.zeroeightsix.kami.manager
import me.zeroeightsix.kami.KamiMod
import me.zeroeightsix.kami.event.KamiEventBus
import me.zeroeightsix.kami.manager.managers.FileInstanceManager
import me.zeroeightsix.kami.util.TimerUtils
import org.kamiblue.commons.utils.ClassUtils
/**
* @author Xiaro
*
* Created by Xiaro on 08/18/20
* Updated by Xiaro on 06/09/20
*/
object ManagerLoader {
/** Thread for scanning managers during Forge pre-init */
@ -24,7 +17,7 @@ object ManagerLoader {
fun preLoad() {
preLoadingThread = Thread {
val stopTimer = TimerUtils.StopTimer()
managerClassList = ClassUtils.findClasses(FileInstanceManager::class.java.getPackage().name, Manager::class.java)
managerClassList = ClassUtils.findClasses("me.zeroeightsix.kami.manager.managers", Manager::class.java)
val time = stopTimer.stop()
KamiMod.LOG.info("${managerClassList!!.size} manager(s) found, took ${time}ms")
}

View File

@ -1,35 +0,0 @@
package me.zeroeightsix.kami.manager.managers
import me.zeroeightsix.kami.manager.Manager
import me.zeroeightsix.kami.util.Macro
import java.io.FileWriter
import java.io.IOException
import java.util.*
object FileInstanceManager : Manager {
/**
* Map of all the macros.
* KeyCode, Actions
*/
var macros = LinkedHashMap<Int, ArrayList<String>>()
/**
* Super lazy fix for Windows users sometimes saving empty files
*/
@JvmStatic
fun fixEmptyFiles() {
if (!Macro.file.exists()) {
try {
val w = FileWriter(Macro.file)
w.write("{}")
w.close()
} catch (e: IOException) {
e.printStackTrace()
}
}
}
init {
fixEmptyFiles()
}
}

View File

@ -1,14 +1,28 @@
package me.zeroeightsix.kami.manager.managers
import com.google.gson.GsonBuilder
import com.google.gson.reflect.TypeToken
import me.zeroeightsix.kami.KamiMod
import me.zeroeightsix.kami.command.Command
import me.zeroeightsix.kami.manager.Manager
import me.zeroeightsix.kami.util.Macro
import me.zeroeightsix.kami.util.text.MessageSendHelper
import net.minecraftforge.fml.common.gameevent.InputEvent
import org.kamiblue.event.listener.listener
import org.lwjgl.input.Keyboard
import java.io.File
import java.io.FileNotFoundException
import java.io.FileReader
import java.io.FileWriter
object MacroManager : Manager {
private var macroMap = LinkedHashMap<Int, ArrayList<String>>()
val isEmpty get() = macroMap.isEmpty()
val macros: Map<Int, List<String>> get() = macroMap
private val gson = GsonBuilder().setPrettyPrinting().create()
private val type = object : TypeToken<LinkedHashMap<Int, List<String>>>() {}.type
private const val configName = "KAMIBlueMacros.json"
private val file get() = File(configName)
init {
listener<InputEvent.KeyInputEvent> {
@ -20,28 +34,60 @@ object MacroManager : Manager {
* Reads macros from KAMIBlueMacros.json into the macros Map
*/
fun loadMacros(): Boolean {
return Macro.readFileToMemory()
return try {
FileReader(file).buffered().use {
macroMap = gson.fromJson(it, type)
KamiMod.LOG.info("Macro loaded")
}
true
} catch (e: FileNotFoundException) {
KamiMod.LOG.warn("Could not find file $configName")
false
} catch (e: Exception) {
KamiMod.LOG.warn("Failed loading macro", e)
false
}
}
/**
* Saves macros from the macros Map into KAMIBlueMacros.json
*/
fun saveMacros(): Boolean {
return Macro.writeMemoryToFile()
return try {
FileWriter(file, false).buffered().use {
gson.toJson(macroMap, it)
KamiMod.LOG.info("Macro saved")
}
true
} catch (e: Exception) {
KamiMod.LOG.warn("Failed saving macro", e)
false
}
}
/**
* Sends the message or command, depending on which one it is
* @param keyCode int keycode of the key the was pressed
*/
fun sendMacro(keyCode: Int) {
val macrosForThisKey = Macro.getMacrosForKey(keyCode) ?: return
for (currentMacro in macrosForThisKey) {
if (currentMacro!!.startsWith(Command.getCommandPrefix())) { // this is done instead of just sending a chat packet so it doesn't add to the chat history
MessageSendHelper.sendKamiCommand(currentMacro, false) // ie, the false here
private fun sendMacro(keyCode: Int) {
val macros = getMacros(keyCode) ?: return
for (macro in macros) {
if (macro.startsWith(Command.getCommandPrefix())) { // this is done instead of just sending a chat packet so it doesn't add to the chat history
MessageSendHelper.sendKamiCommand(macro) // ie, the false here
} else {
MessageSendHelper.sendServerMessage(currentMacro)
MessageSendHelper.sendServerMessage(macro)
}
}
}
fun getMacros(keycode: Int) = macroMap[keycode]
fun addMacroToKey(keycode: Int, macro: String) {
macroMap.getOrPut(keycode, ::ArrayList).add(macro)
}
fun removeMacro(keycode: Int) {
macroMap.remove(keycode)
}
}

View File

@ -1,70 +0,0 @@
package me.zeroeightsix.kami.util
import com.google.gson.GsonBuilder
import com.google.gson.reflect.TypeToken
import me.zeroeightsix.kami.KamiMod
import me.zeroeightsix.kami.manager.managers.FileInstanceManager
import me.zeroeightsix.kami.util.text.MessageSendHelper
import java.io.*
import java.util.*
/**
* @author l1ving
* Created by l1ving on 04/05/20
*/
object Macro {
private val gson = GsonBuilder().setPrettyPrinting().create()
private const val configName = "KAMIBlueMacros.json"
val file = File(configName)
fun writeMemoryToFile(): Boolean {
return try {
val fw = FileWriter(file, false)
gson.toJson(FileInstanceManager.macros, fw)
fw.flush()
fw.close()
KamiMod.LOG.info("Macro saved")
true
} catch (e: IOException) {
KamiMod.LOG.info("Failed saving macro")
e.printStackTrace()
false
}
}
fun readFileToMemory(): Boolean {
var success = false
try {
try {
FileInstanceManager.macros = gson.fromJson(FileReader(file), object : TypeToken<LinkedHashMap<Int?, List<String?>?>?>() {}.type)!!
KamiMod.LOG.info("Macro loaded")
success = true
} catch (e: FileNotFoundException) {
KamiMod.LOG.warn("Could not find file $configName, clearing the macros list")
FileInstanceManager.macros.clear()
}
} catch (e: IllegalStateException) {
KamiMod.LOG.warn("$configName is empty!")
FileInstanceManager.macros.clear()
}
return success
}
fun getMacrosForKey(keycode: Int): List<String?>? {
val entry = FileInstanceManager.macros.entries.find { it.key == keycode } ?: return null
return entry.value
}
fun addMacroToKey(keycode: Int?, macro: String?) {
if (keycode == null || macro.isNullOrBlank()) return // prevent trying to add a null macro
FileInstanceManager.macros.getOrPut(keycode, ::arrayListOf).add(macro)
}
fun removeMacro(keycode: Int) {
FileInstanceManager.macros.keys.removeIf { it == keycode }
}
fun sendMacrosToChat(messages: Array<String?>) {
for (s in messages) MessageSendHelper.sendRawChatMessage("[$s]")
}
}