mirror of
https://github.com/mamoe/mirai.git
synced 2025-01-19 19:18: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.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()
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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()
|
||||||
|
@ -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]]!!)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user