Commit bcf6a2a9 authored by ryoii's avatar ryoii

Merge remote-tracking branch 'origin'

parents 4aa4a61b e27c9bd4
......@@ -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
for (index in heightMin until currentHeight) {
clearRows(index)
}
object LoggerDrawer {
var currentHeight = 6
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()
}
}
fun cleanPage() {
for (index in 6 until terminal.terminalSize.rows - 6) {
clearRows(index)
}
currentHeight = 6
}
textGraphics.putString(3, 9, "AAAAAAAAAAAAAAAAAAAAAAa", SGR.ITALIC)
terminal.flush()
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]]!!)
}
}
......
......@@ -215,7 +215,7 @@ fun ByteReadPacket.readIoBuffer(
* 解析 SSO 层包装
*/
@UseExperimental(ExperimentalUnsignedTypes::class)
private fun parseSsoFrame(flag3: Int, input: ByteReadPacket): KnownPacketFactories.IncomingPacket {
private fun parseSsoFrame(flag3: Int, input: ByteReadPacket): KnownPacketFactories.IncomingPacket<*> {
val commandName: String
val ssoSequenceId: Int
......@@ -257,7 +257,7 @@ private fun parseSsoFrame(flag3: Int, input: ByteReadPacket): KnownPacketFactori
* 解析 Uni 层包装
*/
@UseExperimental(ExperimentalUnsignedTypes::class)
private fun parseUniFrame(input: ByteReadPacket): KnownPacketFactories.IncomingPacket {
private fun parseUniFrame(input: ByteReadPacket): KnownPacketFactories.IncomingPacket<*> {
// 00 00 00 30 00 01 2F 7C 00 00 00 00 00 00 00 04 00 00 00 14 67 78 68 72 65 70 6F 72 74 2E 72 65 70 6F 72 74 00 00 00 08 66 82 D3 0B 00 00 00 00
// 00 00 00 06 08 00
......
......@@ -5,6 +5,10 @@ Mirai Java Apt
提供阻塞API 来让 Java 调用 Mirai 的 API 更容易
## Requirements
- JDK 1.8+
## 开始
```java
......
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