mirror of
https://github.com/mamoe/mirai.git
synced 2025-01-01 13:58:24 +08:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
4d1ce5cd56
@ -15,15 +15,18 @@ import io.ktor.server.engine.applicationEngineEnvironment
|
||||
import io.ktor.server.engine.connector
|
||||
import io.ktor.server.engine.embeddedServer
|
||||
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.utils.DefaultLogger
|
||||
import org.slf4j.LoggerFactory
|
||||
import org.slf4j.helpers.NOPLogger
|
||||
import org.slf4j.helpers.NOPLoggerFactory
|
||||
import kotlin.coroutines.CoroutineContext
|
||||
|
||||
object MiraiHttpAPIServer {
|
||||
object MiraiHttpAPIServer : CoroutineScope {
|
||||
|
||||
private val logger = DefaultLogger("Mirai HTTP API")
|
||||
override val coroutineContext: CoroutineContext = CoroutineExceptionHandler { _, throwable -> logger.error(throwable) }
|
||||
|
||||
init {
|
||||
SessionManager.authKey = generateSessionKey()//用于验证的key, 使用和SessionKey相同的方法生成, 但意义不同
|
||||
@ -43,20 +46,19 @@ object MiraiHttpAPIServer {
|
||||
SessionManager.authKey = authKey
|
||||
|
||||
// TODO: start是无阻塞的,理应获取启动状态后再执行后续代码
|
||||
try {
|
||||
launch {
|
||||
embeddedServer(CIO, environment = applicationEngineEnvironment {
|
||||
this.parentCoroutineContext = coroutineContext
|
||||
this.log = NOPLoggerFactory().getLogger("NMYSL")
|
||||
this.module(Application::mirai)
|
||||
|
||||
connector {
|
||||
this.port = port
|
||||
}
|
||||
}).start()
|
||||
|
||||
logger.info("Http api server is running with authKey: ${SessionManager.authKey}")
|
||||
callback?.invoke()
|
||||
} catch (e: Exception) {
|
||||
logger.error("Http api server launch error")
|
||||
}).start(wait = true)
|
||||
}
|
||||
|
||||
logger.info("Http api server is running with authKey: ${SessionManager.authKey}")
|
||||
callback?.invoke()
|
||||
}
|
||||
}
|
@ -237,7 +237,7 @@ object MiraiConsole {
|
||||
object CommandListener {
|
||||
fun start() {
|
||||
thread {
|
||||
processNextCommandLine()
|
||||
//processNextCommandLine()
|
||||
}
|
||||
}
|
||||
|
||||
@ -281,7 +281,6 @@ class MiraiConsoleLoader {
|
||||
companion object {
|
||||
@JvmStatic
|
||||
fun main(args: Array<String>) {
|
||||
|
||||
MiraiConsole.start()
|
||||
Runtime.getRuntime().addShutdownHook(thread(start = false) {
|
||||
MiraiConsole.stop()
|
||||
|
@ -11,11 +11,15 @@ import com.googlecode.lanterna.terminal.Terminal
|
||||
import com.googlecode.lanterna.terminal.TerminalResizeListener
|
||||
import com.googlecode.lanterna.terminal.swing.SwingTerminal
|
||||
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.PrintStream
|
||||
import java.lang.StringBuilder
|
||||
import java.nio.charset.Charset
|
||||
import java.util.*
|
||||
import kotlin.concurrent.thread
|
||||
import kotlin.math.ceil
|
||||
|
||||
|
||||
object MiraiConsoleUI {
|
||||
@ -36,12 +40,17 @@ object MiraiConsoleUI {
|
||||
lateinit var textGraphics: TextGraphics
|
||||
|
||||
var hasStart = false
|
||||
private lateinit var internalPrinter: PrintStream
|
||||
fun start() {
|
||||
if (hasStart) {
|
||||
return
|
||||
}
|
||||
|
||||
internalPrinter = System.out
|
||||
|
||||
|
||||
hasStart = true
|
||||
val defaultTerminalFactory = DefaultTerminalFactory()
|
||||
val defaultTerminalFactory = DefaultTerminalFactory(internalPrinter, System.`in`, Charset.defaultCharset())
|
||||
try {
|
||||
terminal = defaultTerminalFactory.createTerminal()
|
||||
terminal.enterPrivateMode()
|
||||
@ -64,8 +73,27 @@ object MiraiConsoleUI {
|
||||
inited = false
|
||||
update()
|
||||
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()
|
||||
|
||||
val charList = listOf(',', '.', '/', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '=', '+', '!', ' ')
|
||||
@ -197,52 +225,83 @@ object MiraiConsoleUI {
|
||||
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) {
|
||||
clearRows(index)
|
||||
}
|
||||
|
||||
values.forEach {
|
||||
if (currentHeight > heightMin) {
|
||||
var x = it
|
||||
while (currentHeight > heightMin) {
|
||||
if (x.isEmpty() || x.isBlank()) break
|
||||
textGraphics.foregroundColor = TextColor.ANSI.GREEN
|
||||
textGraphics.backgroundColor = TextColor.ANSI.DEFAULT
|
||||
val towrite = if (x.length > width) {
|
||||
x.substring(0, width).also {
|
||||
x = x.substring(width)
|
||||
}
|
||||
} else {
|
||||
x.also {
|
||||
x = ""
|
||||
}
|
||||
fun drawLog(string: String, flush: Boolean = true) {
|
||||
val maxHeight = terminal.terminalSize.rows - 6
|
||||
val heightNeed = (string.length / (terminal.terminalSize.columns - 6)) + 1
|
||||
if (currentHeight + heightNeed > maxHeight) {
|
||||
cleanPage()
|
||||
}
|
||||
textGraphics.foregroundColor = TextColor.ANSI.GREEN
|
||||
textGraphics.backgroundColor = TextColor.ANSI.DEFAULT
|
||||
val width = terminal.terminalSize.columns - 6
|
||||
var x = string
|
||||
while (true) {
|
||||
if (x == "") break
|
||||
val toWrite = if (x.length > width) {
|
||||
x.substring(0, width).also {
|
||||
x = x.substring(width)
|
||||
}
|
||||
} else {
|
||||
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) {
|
||||
log[uin]!!.push(str)
|
||||
if (uin == screens[currentScreenId]) {
|
||||
drawLogs(log[screens[currentScreenId]]!!)
|
||||
drawLog(str)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var commandBuilder = StringBuilder()
|
||||
|
||||
fun redrawCommand() {
|
||||
val height = terminal.terminalSize.rows
|
||||
val width = terminal.terminalSize.columns
|
||||
@ -303,7 +362,7 @@ object MiraiConsoleUI {
|
||||
drawBotFrame(screens[currentScreenId], 0)
|
||||
}
|
||||
}
|
||||
terminal.flush()
|
||||
redrawLogs(log[screens[currentScreenId]]!!)
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user