mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-25 06:50:09 +08:00
Try to open browser safely. fix #694
This commit is contained in:
parent
2d8c01ba8b
commit
0237741009
@ -38,12 +38,18 @@ public object SwingSolver : LoginSolver() {
|
||||
public override suspend fun onSolveSliderCaptcha(bot: Bot, url: String): String {
|
||||
return openWindow("Mirai SliderCaptcha(${bot.id})") {
|
||||
JLabel("需要滑动验证码, 完成后请关闭该窗口").append()
|
||||
Desktop.getDesktop().browse(URI(url))
|
||||
// Try to open browser safely. #694
|
||||
kotlin.runCatching {
|
||||
Desktop.getDesktop().browse(URI(url))
|
||||
}.onFailure {
|
||||
JTextField(url).last()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override suspend fun onSolveUnsafeDeviceLoginVerify(bot: Bot, url: String): String {
|
||||
return openWindow("Mirai UnsafeDeviceLoginVerify(${bot.id})") {
|
||||
val title = "Mirai UnsafeDeviceLoginVerify(${bot.id})"
|
||||
return openWindow(title) {
|
||||
JLabel(
|
||||
"""
|
||||
<html>
|
||||
@ -53,13 +59,15 @@ public object SwingSolver : LoginSolver() {
|
||||
成功后请关闭该窗口
|
||||
""".trimIndent()
|
||||
).append()
|
||||
HyperLinkLabel(url, "设备锁验证").last()
|
||||
HyperLinkLabel(url, "设备锁验证", title).last()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 隔离类代码
|
||||
// 在 jvm 中, 使用 WindowHelperJvm 不会加载 SwingSolverKt
|
||||
// 不会触发各种 NoDefClassError
|
||||
@Suppress("DEPRECATION")
|
||||
internal object WindowHelperJvm {
|
||||
internal val isDesktopSupported: Boolean = kotlin.run {
|
||||
@ -122,19 +130,23 @@ internal class WindowInitializer(private val initializer: WindowInitializer.(JFr
|
||||
}
|
||||
}
|
||||
|
||||
internal val windowIcon: BufferedImage? by lazy {
|
||||
internal val windowImage: BufferedImage? by lazy {
|
||||
WindowHelperJvm::class.java.getResourceAsStream("project-mirai.png")?.use {
|
||||
ImageIO.read(it)
|
||||
}
|
||||
}
|
||||
|
||||
internal val windowIcon: Icon? by lazy {
|
||||
windowImage?.let(::ImageIcon)
|
||||
}
|
||||
|
||||
internal suspend fun openWindow(title: String = "", initializer: WindowInitializer.(JFrame) -> Unit = {}): String {
|
||||
return openWindow(title, WindowInitializer(initializer))
|
||||
}
|
||||
|
||||
internal suspend fun openWindow(title: String = "", initializer: WindowInitializer = WindowInitializer {}): String {
|
||||
val frame = JFrame()
|
||||
frame.iconImage = windowIcon
|
||||
frame.iconImage = windowImage
|
||||
frame.minimumSize = Dimension(228, 62) // From Windows 10
|
||||
val value = JTextField()
|
||||
val def = CompletableDeferred<String>()
|
||||
@ -176,18 +188,33 @@ internal suspend fun openWindow(title: String = "", initializer: WindowInitializ
|
||||
}
|
||||
|
||||
/**
|
||||
* 构造方法中url指代用户需要点击的链接, text为显示的提示内容
|
||||
* @param url 打开的链接
|
||||
* @param text 显示的提示内容
|
||||
* @param fallbackTitle 无法打开链接时的提醒窗口标题
|
||||
*/
|
||||
internal class HyperLinkLabel constructor(url: String, text: String) : JLabel() {
|
||||
internal class HyperLinkLabel constructor(
|
||||
url: String,
|
||||
text: String,
|
||||
fallbackTitle: String
|
||||
) : JLabel() {
|
||||
init {
|
||||
super.setText("<html><a href='$url'>$text</a></html>")
|
||||
addMouseListener(object : MouseAdapter() {
|
||||
|
||||
override fun mouseClicked(e: MouseEvent) {
|
||||
// Try to open browser safely. #694
|
||||
try {
|
||||
Desktop.getDesktop().browse(URI(url))
|
||||
} catch (ex: Exception) {
|
||||
ex.printStackTrace()
|
||||
JOptionPane.showInputDialog(
|
||||
this@HyperLinkLabel,
|
||||
"Mirai 无法直接打开浏览器, 请手动复制以下 URL 打开",
|
||||
fallbackTitle,
|
||||
JOptionPane.WARNING_MESSAGE,
|
||||
windowIcon,
|
||||
null,
|
||||
url
|
||||
)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
Loading…
Reference in New Issue
Block a user