Merge remote-tracking branch 'origin/master'

This commit is contained in:
Him188 2020-02-15 21:45:37 +08:00
commit 4d1ce5cd56
3 changed files with 104 additions and 44 deletions

View File

@ -15,15 +15,18 @@ import io.ktor.server.engine.applicationEngineEnvironment
import io.ktor.server.engine.connector import io.ktor.server.engine.connector
import io.ktor.server.engine.embeddedServer import io.ktor.server.engine.embeddedServer
import io.ktor.util.KtorExperimentalAPI import io.ktor.util.KtorExperimentalAPI
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import net.mamoe.mirai.api.http.route.mirai import net.mamoe.mirai.api.http.route.mirai
import net.mamoe.mirai.utils.DefaultLogger import net.mamoe.mirai.utils.DefaultLogger
import org.slf4j.LoggerFactory
import org.slf4j.helpers.NOPLogger
import org.slf4j.helpers.NOPLoggerFactory import org.slf4j.helpers.NOPLoggerFactory
import kotlin.coroutines.CoroutineContext
object MiraiHttpAPIServer { object MiraiHttpAPIServer : CoroutineScope {
private val logger = DefaultLogger("Mirai HTTP API") private val logger = DefaultLogger("Mirai HTTP API")
override val coroutineContext: CoroutineContext = CoroutineExceptionHandler { _, throwable -> logger.error(throwable) }
init { init {
SessionManager.authKey = generateSessionKey()//用于验证的key, 使用和SessionKey相同的方法生成, 但意义不同 SessionManager.authKey = generateSessionKey()//用于验证的key, 使用和SessionKey相同的方法生成, 但意义不同
@ -43,20 +46,19 @@ object MiraiHttpAPIServer {
SessionManager.authKey = authKey SessionManager.authKey = authKey
// TODO: start是无阻塞的理应获取启动状态后再执行后续代码 // TODO: start是无阻塞的理应获取启动状态后再执行后续代码
try { launch {
embeddedServer(CIO, environment = applicationEngineEnvironment { embeddedServer(CIO, environment = applicationEngineEnvironment {
this.parentCoroutineContext = coroutineContext
this.log = NOPLoggerFactory().getLogger("NMYSL") this.log = NOPLoggerFactory().getLogger("NMYSL")
this.module(Application::mirai) this.module(Application::mirai)
connector { connector {
this.port = port this.port = port
} }
}).start() }).start(wait = true)
logger.info("Http api server is running with authKey: ${SessionManager.authKey}")
callback?.invoke()
} catch (e: Exception) {
logger.error("Http api server launch error")
} }
logger.info("Http api server is running with authKey: ${SessionManager.authKey}")
callback?.invoke()
} }
} }

View File

@ -237,7 +237,7 @@ object MiraiConsole {
object CommandListener { object CommandListener {
fun start() { fun start() {
thread { thread {
processNextCommandLine() //processNextCommandLine()
} }
} }
@ -281,7 +281,6 @@ class MiraiConsoleLoader {
companion object { companion object {
@JvmStatic @JvmStatic
fun main(args: Array<String>) { fun main(args: Array<String>) {
MiraiConsole.start() MiraiConsole.start()
Runtime.getRuntime().addShutdownHook(thread(start = false) { Runtime.getRuntime().addShutdownHook(thread(start = false) {
MiraiConsole.stop() MiraiConsole.stop()

View File

@ -11,11 +11,15 @@ import com.googlecode.lanterna.terminal.Terminal
import com.googlecode.lanterna.terminal.TerminalResizeListener import com.googlecode.lanterna.terminal.TerminalResizeListener
import com.googlecode.lanterna.terminal.swing.SwingTerminal import com.googlecode.lanterna.terminal.swing.SwingTerminal
import com.googlecode.lanterna.terminal.swing.SwingTerminalFrame import com.googlecode.lanterna.terminal.swing.SwingTerminalFrame
import net.mamoe.mirai.MiraiConsoleUI.LoggerDrawer.drawLog
import net.mamoe.mirai.MiraiConsoleUI.LoggerDrawer.redrawLogs
import net.mamoe.mirai.utils.currentTimeSeconds
import java.io.OutputStream import java.io.OutputStream
import java.io.PrintStream import java.io.PrintStream
import java.lang.StringBuilder import java.nio.charset.Charset
import java.util.* import java.util.*
import kotlin.concurrent.thread import kotlin.concurrent.thread
import kotlin.math.ceil
object MiraiConsoleUI { object MiraiConsoleUI {
@ -36,12 +40,17 @@ object MiraiConsoleUI {
lateinit var textGraphics: TextGraphics lateinit var textGraphics: TextGraphics
var hasStart = false var hasStart = false
private lateinit var internalPrinter: PrintStream
fun start() { fun start() {
if (hasStart) { if (hasStart) {
return return
} }
internalPrinter = System.out
hasStart = true hasStart = true
val defaultTerminalFactory = DefaultTerminalFactory() val defaultTerminalFactory = DefaultTerminalFactory(internalPrinter, System.`in`, Charset.defaultCharset())
try { try {
terminal = defaultTerminalFactory.createTerminal() terminal = defaultTerminalFactory.createTerminal()
terminal.enterPrivateMode() terminal.enterPrivateMode()
@ -64,8 +73,27 @@ object MiraiConsoleUI {
inited = false inited = false
update() update()
redrawCommand() redrawCommand()
redrawLogs(log[screens[currentScreenId]]!!)
}) })
if (terminal !is SwingTerminalFrame) {
System.setOut(PrintStream(object : OutputStream() {
var builder = java.lang.StringBuilder()
override fun write(b: Int) {
with(b.toChar()) {
if (this == '\n') {
pushLog(0, builder.toString())
builder = java.lang.StringBuilder()
} else {
builder.append(this)
}
}
}
}))
}
System.setErr(System.out)
update() update()
val charList = listOf(',', '.', '/', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '=', '+', '!', ' ') val charList = listOf(',', '.', '/', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '=', '+', '!', ' ')
@ -197,52 +225,83 @@ object MiraiConsoleUI {
textGraphics.putString(width - 2 - "Add admins via commands|".length, 4, "Add admins via commands|") textGraphics.putString(width - 2 - "Add admins via commands|".length, 4, "Add admins via commands|")
} }
fun drawLogs(values: List<String>) {
val width = terminal.terminalSize.columns - 6
val heightMin = 5
var currentHeight = terminal.terminalSize.rows - 5 object LoggerDrawer {
var currentHeight = 6
for (index in heightMin until currentHeight) { fun drawLog(string: String, flush: Boolean = true) {
clearRows(index) val maxHeight = terminal.terminalSize.rows - 6
} val heightNeed = (string.length / (terminal.terminalSize.columns - 6)) + 1
if (currentHeight + heightNeed > maxHeight) {
values.forEach { cleanPage()
if (currentHeight > heightMin) { }
var x = it textGraphics.foregroundColor = TextColor.ANSI.GREEN
while (currentHeight > heightMin) { textGraphics.backgroundColor = TextColor.ANSI.DEFAULT
if (x.isEmpty() || x.isBlank()) break val width = terminal.terminalSize.columns - 6
textGraphics.foregroundColor = TextColor.ANSI.GREEN var x = string
textGraphics.backgroundColor = TextColor.ANSI.DEFAULT while (true) {
val towrite = if (x.length > width) { if (x == "") break
x.substring(0, width).also { val toWrite = if (x.length > width) {
x = x.substring(width) x.substring(0, width).also {
} x = x.substring(width)
} else { }
x.also { } else {
x = "" x.also {
} x = ""
} }
textGraphics.putString(3, currentHeight, towrite, SGR.ITALIC)
--currentHeight
} }
try {
textGraphics.putString(3, currentHeight, toWrite, SGR.ITALIC)
} catch (ignored: Exception) {
//
}
++currentHeight
}
if (flush && terminal is SwingTerminalFrame) {
terminal.flush()
} }
} }
textGraphics.putString(3, 9, "AAAAAAAAAAAAAAAAAAAAAAa", SGR.ITALIC)
terminal.flush() fun cleanPage() {
for (index in 6 until terminal.terminalSize.rows - 6) {
clearRows(index)
}
currentHeight = 6
}
fun redrawLogs(toDraw: List<String>) {
this.cleanPage()
var logsToDraw = 0
var vara = 0
toDraw.reversed().forEach {
val heightNeed = (it.length / (terminal.terminalSize.columns - 6)) + 1
vara += heightNeed
if (currentHeight + vara < terminal.terminalSize.rows - 6) {
logsToDraw++
} else {
return
}
}
for (index in (toDraw.size - logsToDraw) until toDraw.size - 1) {
drawLog(toDraw[index], false)
}
if (terminal is SwingTerminalFrame) {
terminal.flush()
}
}
} }
fun pushLog(uin: Long, str: String) { fun pushLog(uin: Long, str: String) {
log[uin]!!.push(str) log[uin]!!.push(str)
if (uin == screens[currentScreenId]) { if (uin == screens[currentScreenId]) {
drawLogs(log[screens[currentScreenId]]!!) drawLog(str)
} }
} }
var commandBuilder = StringBuilder() var commandBuilder = StringBuilder()
fun redrawCommand() { fun redrawCommand() {
val height = terminal.terminalSize.rows val height = terminal.terminalSize.rows
val width = terminal.terminalSize.columns val width = terminal.terminalSize.columns
@ -303,7 +362,7 @@ object MiraiConsoleUI {
drawBotFrame(screens[currentScreenId], 0) drawBotFrame(screens[currentScreenId], 0)
} }
} }
terminal.flush() redrawLogs(log[screens[currentScreenId]]!!)
} }
} }