Newer
Older
Twilight / src / main / kotlin / net / taehui / twilight / system / Window.kt
@taehui taehui on 23 Aug 2 KB v1.0-SNAPSHOT
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
        }
    }
}