package net.taehui.twilight.system import org.apache.logging.log4j.core.Core import org.apache.logging.log4j.core.Layout import org.apache.logging.log4j.core.LogEvent import org.apache.logging.log4j.core.appender.AbstractAppender import org.apache.logging.log4j.core.config.plugins.Plugin import org.apache.logging.log4j.core.config.plugins.PluginAttribute import org.apache.logging.log4j.core.config.plugins.PluginElement import org.apache.logging.log4j.core.config.plugins.PluginFactory import org.jline.builtins.Completers import org.jline.builtins.Completers.OptionCompleter import org.jline.builtins.Completers.TreeCompleter import org.jline.builtins.Completers.TreeCompleter.node import org.jline.reader.LineReader import org.jline.reader.LineReaderBuilder import org.jline.reader.impl.completer.AggregateCompleter import org.jline.reader.impl.completer.ArgumentCompleter import org.jline.reader.impl.completer.NullCompleter import org.jline.reader.impl.completer.StringsCompleter import org.jline.terminal.TerminalBuilder import java.io.Serializable @Plugin(name = "Window", category = Core.CATEGORY_NAME) class Window(name: String, layout: Layout<out Serializable>) : AbstractAppender(name, null, layout, true, null) { val r: LineReader = LineReaderBuilder.builder() .completer( AggregateCompleter( TreeCompleter(node("avatar", node("allow", "ban", "exile", "learn", "view"))), TreeCompleter(node("awilight", node("set"))), TreeCompleter(node("bundle", node("wipe"))), TreeCompleter(node("comment", node("learn", "wipe"))), TreeCompleter(node("future")), TreeCompleter(node("handled", node("learn"))), TreeCompleter(node("note", node("allow", "ban", "learn", "pms", "wipe"))), TreeCompleter(node("pause")), TreeCompleter(node("platform", node("avatar", "dispose", "handle", "view"))), TreeCompleter(node("ram")), TreeCompleter(node("site", node("alarm", "put", "silent", "view", "wipe"))), TreeCompleter(node("tv", node("allow", "ban", "dispose", "handle", "view"))), TreeCompleter(node("reload", node("ability"))), TreeCompleter(node("save")), TreeCompleter(node("stop")), ) ) .terminal(TerminalBuilder.builder().build()).build() init { r.setOpt(LineReader.Option.DISABLE_EVENT_EXPANSION) r.unsetOpt(LineReader.Option.INSERT_TAB) } override fun append(event: LogEvent) { r.printAbove(layout.toSerializable(event).toString()) } companion object { lateinit var window: Window @JvmStatic @PluginFactory fun getWindow( @PluginAttribute("name") name: String, @PluginElement("Layout") layout: Layout<out Serializable> ): Window { window = Window(name, layout) return window } } }