Fix api changes

This commit is contained in:
Him188
2020-02-29 15:25:47 +08:00
parent 538518ae21
commit 4e6420d5dc
3 changed files with 82 additions and 15 deletions

View File

@@ -12,7 +12,10 @@ import com.googlecode.lanterna.terminal.TerminalResizeListener
import com.googlecode.lanterna.terminal.swing.SwingTerminal
import com.googlecode.lanterna.terminal.swing.SwingTerminalFrame
import kotlinx.coroutines.*
import kotlinx.coroutines.io.ByteWriteChannel
import kotlinx.coroutines.io.close
import kotlinx.coroutines.io.jvm.nio.copyTo
import kotlinx.coroutines.io.reader
import kotlinx.io.core.IoBuffer
import kotlinx.io.core.use
import net.mamoe.mirai.Bot
@@ -21,17 +24,19 @@ import net.mamoe.mirai.console.MiraiConsoleTerminalUI.LoggerDrawer.drawLog
import net.mamoe.mirai.console.MiraiConsoleTerminalUI.LoggerDrawer.redrawLogs
import net.mamoe.mirai.console.utils.MiraiConsoleUI
import net.mamoe.mirai.utils.LoginSolver
import net.mamoe.mirai.utils.createCharImg
import net.mamoe.mirai.utils.writeChannel
import java.awt.Image
import java.awt.image.BufferedImage
import java.io.File
import java.io.OutputStream
import java.io.PrintStream
import java.io.RandomAccessFile
import java.nio.charset.Charset
import java.util.*
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.ConcurrentLinkedDeque
import javax.imageio.ImageIO
import kotlin.concurrent.thread
import kotlin.coroutines.CoroutineContext
import kotlin.system.exitProcess
/**
@@ -114,9 +119,10 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI {
}
}
@Volatile
var requesting = false
var requestResult: String? = null
override suspend fun requestInput(question: String): String {
override suspend fun requestInput(): String {
requesting = true
while (requesting) {
delay(100)//不然会卡死 迷惑吧
@@ -167,7 +173,7 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI {
}
}
pushLog(0, "$toLog[Login Solver]请输验证码. ${tempFile.absolutePath}")
return requestInput("[Login Solver]请输入 4 位字母验证码. 若要更换验证码, 请直接回车")!!
return requestInput()!!
.takeUnless { it.isEmpty() || it.length != 4 }
.also {
pushLog(0, "[Login Solver]正在提交[$it]中...")
@@ -179,7 +185,7 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI {
pushLog(0, "[Login Solver]请在任意浏览器中打开以下链接并完成验证码. ")
pushLog(0, "[Login Solver]完成后请输入任意字符 ")
pushLog(0, url)
return requestInput("[Login Solver]完成后请输入任意字符").also {
return requestInput().also {
pushLog(0, "[Login Solver]正在提交中")
}
}
@@ -191,7 +197,7 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI {
pushLog(0, "[Login Solver]请将该链接在QQ浏览器中打开并完成认证, 成功后输入任意字符")
pushLog(0, "[Login Solver]这步操作将在后续的版本中优化")
pushLog(0, url)
return requestInput("[Login Solver]完成后请输入任意字符").also {
return requestInput().also {
pushLog(0, "[Login Solver]正在提交中...")
}
}
@@ -660,3 +666,69 @@ class LimitLinkedQueue<T>(
return super.push(e)
}
}
/**
* @author NaturalHG
*/
private fun BufferedImage.createCharImg(outputWidth: Int = 100, ignoreRate: Double = 0.95): String {
val newHeight = (this.height * (outputWidth.toDouble() / this.width)).toInt()
val tmp = this.getScaledInstance(outputWidth, newHeight, Image.SCALE_SMOOTH)
val image = BufferedImage(outputWidth, newHeight, BufferedImage.TYPE_INT_ARGB)
val g2d = image.createGraphics()
g2d.drawImage(tmp, 0, 0, null)
fun gray(rgb: Int): Int {
val r = rgb and 0xff0000 shr 16
val g = rgb and 0x00ff00 shr 8
val b = rgb and 0x0000ff
return (r * 30 + g * 59 + b * 11 + 50) / 100
}
fun grayCompare(g1: Int, g2: Int): Boolean =
kotlin.math.min(g1, g2).toDouble() / kotlin.math.max(g1, g2) >= ignoreRate
val background = gray(image.getRGB(0, 0))
return buildString(capacity = height) {
val lines = mutableListOf<StringBuilder>()
var minXPos = outputWidth
var maxXPos = 0
for (y in 0 until image.height) {
val builderLine = StringBuilder()
for (x in 0 until image.width) {
val gray = gray(image.getRGB(x, y))
if (grayCompare(gray, background)) {
builderLine.append(" ")
} else {
builderLine.append("#")
if (x < minXPos) {
minXPos = x
}
if (x > maxXPos) {
maxXPos = x
}
}
}
if (builderLine.toString().isBlank()) {
continue
}
lines.add(builderLine)
}
for (line in lines) {
append(line.substring(minXPos, maxXPos)).append("\n")
}
}
}
// Copied from Ktor CIO
private fun File.writeChannel(
coroutineContext: CoroutineContext = Dispatchers.IO
): ByteWriteChannel = GlobalScope.reader(CoroutineName("file-writer") + coroutineContext, autoFlush = true) {
@Suppress("BlockingMethodInNonBlockingContext")
RandomAccessFile(this@writeChannel, "rw").use { file ->
val copied = channel.copyTo(file.channel)
file.setLength(copied) // truncate tail that could remain from the previously written data
}
}.channel

View File

@@ -15,7 +15,6 @@ import net.mamoe.mirai.console.MiraiConsole
import net.mamoe.mirai.console.utils.MiraiConsoleUI
import net.mamoe.mirai.utils.DefaultLoginSolver
import net.mamoe.mirai.utils.LoginSolver
import net.mamoe.mirai.utils.LoginSolverInputReader
import kotlin.concurrent.thread
class MiraiConsoleUIPure : MiraiConsoleUI {
@@ -52,7 +51,7 @@ class MiraiConsoleUIPure : MiraiConsoleUI {
}
override suspend fun requestInput(question: String): String {
override suspend fun requestInput(): String {
requesting = true
while (true) {
delay(50)
@@ -68,10 +67,8 @@ class MiraiConsoleUIPure : MiraiConsoleUI {
override fun createLoginSolver(): LoginSolver {
return DefaultLoginSolver(
reader = object : LoginSolverInputReader {
override suspend fun read(question: String): String? {
return requestInput(question)
}
input = suspend {
requestInput()
}
)
}

View File

@@ -54,9 +54,7 @@ interface MiraiConsoleUI {
* 这个Input 不 等于 Command
*
*/
suspend fun requestInput(
question: String
): String
suspend fun requestInput(): String
/**