Commit baa3e56d authored by Him188's avatar Him188

Merge remote-tracking branch 'origin/master'

parents 25b3b2b2 1437ad70
...@@ -11,10 +11,15 @@ package net.mamoe.mirai.api.http ...@@ -11,10 +11,15 @@ package net.mamoe.mirai.api.http
import io.ktor.application.Application import io.ktor.application.Application
import io.ktor.server.cio.CIO import io.ktor.server.cio.CIO
import io.ktor.server.engine.applicationEngineEnvironment
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 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
object MiraiHttpAPIServer { object MiraiHttpAPIServer {
...@@ -39,7 +44,14 @@ object MiraiHttpAPIServer { ...@@ -39,7 +44,14 @@ object MiraiHttpAPIServer {
// TODO: start是无阻塞的,理应获取启动状态后再执行后续代码 // TODO: start是无阻塞的,理应获取启动状态后再执行后续代码
try { try {
embeddedServer(CIO, port, module = Application::mirai).start() embeddedServer(CIO, environment = applicationEngineEnvironment {
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}") logger.info("Http api server is running with authKey: ${SessionManager.authKey}")
callback?.invoke() callback?.invoke()
......
...@@ -35,11 +35,18 @@ import net.mamoe.mirai.api.http.data.common.DTO ...@@ -35,11 +35,18 @@ import net.mamoe.mirai.api.http.data.common.DTO
import net.mamoe.mirai.api.http.data.common.VerifyDTO import net.mamoe.mirai.api.http.data.common.VerifyDTO
import net.mamoe.mirai.api.http.util.jsonParseOrNull import net.mamoe.mirai.api.http.util.jsonParseOrNull
import net.mamoe.mirai.api.http.util.toJson import net.mamoe.mirai.api.http.util.toJson
import org.slf4j.Logger
import org.slf4j.helpers.NOPLogger
import org.slf4j.helpers.NOPLoggerFactory
import org.slf4j.impl.SimpleLogger
import org.slf4j.impl.SimpleLoggerFactory
fun Application.mirai() { fun Application.mirai() {
install(DefaultHeaders) install(DefaultHeaders)
install(CallLogging) install(CallLogging) {
logger = NOPLoggerFactory().getLogger("NMSL")
}
authModule() authModule()
messageModule() messageModule()
infoModule() infoModule()
......
...@@ -19,6 +19,7 @@ import net.mamoe.mirai.api.http.generateSessionKey ...@@ -19,6 +19,7 @@ import net.mamoe.mirai.api.http.generateSessionKey
import net.mamoe.mirai.contact.sendMessage import net.mamoe.mirai.contact.sendMessage
import net.mamoe.mirai.utils.MiraiLogger import net.mamoe.mirai.utils.MiraiLogger
import java.io.File import java.io.File
import java.io.PrintStream
import kotlin.concurrent.thread import kotlin.concurrent.thread
object MiraiConsole { object MiraiConsole {
...@@ -37,8 +38,7 @@ object MiraiConsole { ...@@ -37,8 +38,7 @@ object MiraiConsole {
val pluginManager: PluginManager val pluginManager: PluginManager
get() = PluginManager get() = PluginManager
var logger: MiraiConsoleLogger = var logger = UIPushLogger(0)
UIPushLogger()
var path: String = System.getProperty("user.dir") var path: String = System.getProperty("user.dir")
...@@ -255,11 +255,11 @@ object MiraiConsole { ...@@ -255,11 +255,11 @@ object MiraiConsole {
} }
} }
class UIPushLogger(override val identity: String?, override var follower: MiraiLogger?) : MiraiLogger { class UIPushLogger(val identity: Long) {
override fun invoke(any: Any?) { operator fun invoke(any: Any? = null) {
MiraiConsoleUI.start() MiraiConsoleUI.start()
if (any != null) { if (any != null) {
MiraiConsoleUI.pushLog(0, "[Mirai$version $build]: $any") MiraiConsoleUI.pushLog(identity, "[Mirai$version $build]: $any")
} }
} }
} }
...@@ -281,6 +281,7 @@ class MiraiConsoleLoader { ...@@ -281,6 +281,7 @@ 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,6 +11,8 @@ import com.googlecode.lanterna.terminal.Terminal ...@@ -11,6 +11,8 @@ 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 java.io.OutputStream
import java.io.PrintStream
import java.lang.StringBuilder import java.lang.StringBuilder
import java.util.* import java.util.*
import kotlin.concurrent.thread import kotlin.concurrent.thread
...@@ -29,9 +31,9 @@ object MiraiConsoleUI { ...@@ -29,9 +31,9 @@ object MiraiConsoleUI {
log[uin] = LimitLinkedQueue() log[uin] = LimitLinkedQueue()
} }
fun pushLog(uin: Long, str: String) {
log[uin]!!.push(str) lateinit var terminal: Terminal
} lateinit var textGraphics: TextGraphics
var hasStart = false var hasStart = false
fun start() { fun start() {
...@@ -40,25 +42,64 @@ object MiraiConsoleUI { ...@@ -40,25 +42,64 @@ object MiraiConsoleUI {
} }
hasStart = true hasStart = true
val defaultTerminalFactory = DefaultTerminalFactory() val defaultTerminalFactory = DefaultTerminalFactory()
var terminal: Terminal? = null
try { try {
terminal = defaultTerminalFactory.createTerminal() terminal = defaultTerminalFactory.createTerminal()
terminal.enterPrivateMode() terminal.enterPrivateMode()
terminal.clearScreen() terminal.clearScreen()
terminal.setCursorVisible(false) terminal.setCursorVisible(false)
} catch (e: Exception) { } catch (e: Exception) {
try {
terminal = SwingTerminalFrame("Mirai Console") terminal = SwingTerminalFrame("Mirai Console")
terminal.enterPrivateMode() terminal.enterPrivateMode()
terminal.clearScreen() terminal.clearScreen()
terminal.setCursorVisible(false) terminal.setCursorVisible(false)
} } catch (e: Exception) {
if (terminal == null) {
error("can not create terminal") error("can not create terminal")
} }
}
textGraphics = terminal.newTextGraphics()
val textGraphics: TextGraphics = terminal.newTextGraphics() terminal.addResizeListener(TerminalResizeListener { terminal1: Terminal, newSize: TerminalSize ->
terminal.clearScreen()
inited = false
update()
redrawCommand()
})
update()
val charList = listOf(',', '.', '/', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '=', '+', '!', ' ')
thread {
while (true) {
var keyStroke: KeyStroke = terminal.readInput()
when (keyStroke.keyType) {
KeyType.ArrowLeft -> {
currentScreenId = getLeftScreenId()
update()
}
KeyType.ArrowRight -> {
currentScreenId = getRightScreenId()
update()
}
KeyType.Enter -> {
emptyCommand()
}
else -> {
if (keyStroke.character != null) {
if (keyStroke.character.toInt() == 8) {
deleteCommandChar()
}
if (keyStroke.character.isLetterOrDigit() || charList.contains(keyStroke.character)) {
addCommandChar(keyStroke.character)
}
}
}
}
}
}
}
try {
fun getLeftScreenId(): Int { fun getLeftScreenId(): Int {
var newId = currentScreenId - 1 var newId = currentScreenId - 1
if (newId < 0) { if (newId < 0) {
...@@ -99,7 +140,7 @@ object MiraiConsoleUI { ...@@ -99,7 +140,7 @@ object MiraiConsoleUI {
val height = terminal.terminalSize.rows val height = terminal.terminalSize.rows
terminal.setBackgroundColor(TextColor.ANSI.DEFAULT) terminal.setBackgroundColor(TextColor.ANSI.DEFAULT)
if (!inited) { if (!inited) {
val mainTitle = "Mirai Console v0.01 Core v0.14" val mainTitle = "Mirai Console v0.01 Core v0.15"
textGraphics.foregroundColor = TextColor.ANSI.WHITE textGraphics.foregroundColor = TextColor.ANSI.WHITE
textGraphics.backgroundColor = TextColor.ANSI.GREEN textGraphics.backgroundColor = TextColor.ANSI.GREEN
textGraphics.putString((width - mainTitle.length) / 2, 1, mainTitle, SGR.BOLD) textGraphics.putString((width - mainTitle.length) / 2, 1, mainTitle, SGR.BOLD)
...@@ -188,9 +229,15 @@ object MiraiConsoleUI { ...@@ -188,9 +229,15 @@ object MiraiConsoleUI {
} }
} }
if (terminal is SwingTerminalFrame) { textGraphics.putString(3, 9, "AAAAAAAAAAAAAAAAAAAAAAa", SGR.ITALIC)
terminal.flush() terminal.flush()
} }
fun pushLog(uin: Long, str: String) {
log[uin]!!.push(str)
if (uin == screens[currentScreenId]) {
drawLogs(log[screens[currentScreenId]]!!)
}
} }
...@@ -257,58 +304,12 @@ object MiraiConsoleUI { ...@@ -257,58 +304,12 @@ object MiraiConsoleUI {
} }
} }
terminal.flush() terminal.flush()
}
terminal.addResizeListener(TerminalResizeListener { terminal1: Terminal, newSize: TerminalSize ->
terminal.clearScreen()
inited = false
update()
redrawCommand()
})
update()
val charList = listOf(',', '.', '/', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '=', '+', '!', ' ')
thread {
while (true) {
var keyStroke: KeyStroke = terminal.readInput()
when (keyStroke.keyType) {
KeyType.ArrowLeft -> {
currentScreenId = getLeftScreenId()
update()
}
KeyType.ArrowRight -> {
currentScreenId = getRightScreenId()
update()
}
KeyType.Enter -> {
emptyCommand()
}
else -> {
if (keyStroke.character != null) {
if (keyStroke.character.toInt() == 8) {
deleteCommandChar()
}
if (keyStroke.character.isLetterOrDigit() || charList.contains(keyStroke.character)) {
addCommandChar(keyStroke.character)
}
}
}
}
}
}
} catch (e: Exception) {
e.printStackTrace()
}
} }
} }
class LimitLinkedQueue<T>( class LimitLinkedQueue<T>(
val limit: Int = 50 val limit: Int = 50
) : LinkedList<T>() { ) : LinkedList<T>(), List<T> {
override fun push(e: T) { override fun push(e: T) {
if (size >= limit) { if (size >= limit) {
pollLast() pollLast()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment