mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-06 17:10:48 +08:00
Merge remote-tracking branch 'origin'
This commit is contained in:
commit
bcf6a2a9aa
mirai-console/src/main/kotlin/net/mamoe/mirai
mirai-core-qqandroid/src/jvmTest/kotlin/androidPacketTests
mirai-japt
@ -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]]!!)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user