mirror of
https://github.com/mamoe/mirai.git
synced 2025-01-11 02:50:15 +08:00
Merge remote-tracking branch 'origin/master'
# Conflicts: # buildSrc/src/main/kotlin/versions.kt
This commit is contained in:
commit
e813b27227
@ -28,7 +28,9 @@ Mirai 是一个在全平台下运行,提供 QQ Android 和 TIM PC 协议支持
|
|||||||
**[下载(download)](https://github.com/mamoe/mirai-console/releases)**
|
**[下载(download)](https://github.com/mamoe/mirai-console/releases)**
|
||||||
请下载最新的 `mirai-console-wrapper-x.x.x-all.jar`
|
请下载最新的 `mirai-console-wrapper-x.x.x-all.jar`
|
||||||
|
|
||||||
你也可以下载这里的一键安装包来快速启动mirai-console **[下载地址](https://suihou-my.sharepoint.com/:f:/g/personal/user18_5tb_site/ErWGr97FpPVDjkboIDmDAJkBID-23ZMNbTPggGajf1zvGw?e=51NZWM)**
|
#### 对于Windows用户
|
||||||
|
|
||||||
|
你可以下载这里的一键安装包来快速启动mirai-console,这是最简单的方法 **[下载地址](https://suihou-my.sharepoint.com/:f:/g/personal/user18_5tb_site/ErWGr97FpPVDjkboIDmDAJkBID-23ZMNbTPggGajf1zvGw?e=51NZWM)**
|
||||||
|
|
||||||
**请注意**
|
**请注意**
|
||||||
* 使用时请留意安装包里的说明文字
|
* 使用时请留意安装包里的说明文字
|
||||||
@ -36,6 +38,10 @@ Mirai 是一个在全平台下运行,提供 QQ Android 和 TIM PC 协议支持
|
|||||||
* 关于安装包本身的一切问题请到QQ群内反馈
|
* 关于安装包本身的一切问题请到QQ群内反馈
|
||||||
* 如果上面的链接下载过慢,你可以到QQ群内高速下载
|
* 如果上面的链接下载过慢,你可以到QQ群内高速下载
|
||||||
|
|
||||||
|
#### 对于Linux用户
|
||||||
|
|
||||||
|
运行本软件需要openjdk11,请在上面的链接下载`mirai-console-wrapper-x.x.x-all.jar`直接运行即可
|
||||||
|
|
||||||
#### 如何启动
|
#### 如何启动
|
||||||
如果是打包好的软件, 双击<br>
|
如果是打包好的软件, 双击<br>
|
||||||
如果是命令行运行, 请注意运行目录, 推荐cd到jar的文件夹下运行, 运行目录与Console的全部配置文件储存位置有关
|
如果是命令行运行, 请注意运行目录, 推荐cd到jar的文件夹下运行, 运行目录与Console的全部配置文件储存位置有关
|
||||||
|
@ -12,7 +12,7 @@ import org.gradle.kotlin.dsl.DependencyHandlerScope
|
|||||||
object Versions {
|
object Versions {
|
||||||
object Mirai {
|
object Mirai {
|
||||||
const val core = "1.0-RC"
|
const val core = "1.0-RC"
|
||||||
const val console = "0.4.11"
|
const val console = "0.5.0"
|
||||||
const val consoleGraphical = "0.0.7"
|
const val consoleGraphical = "0.0.7"
|
||||||
const val consoleWrapper = "1.0.0"
|
const val consoleWrapper = "1.0.0"
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,7 @@ object MiraiConsole {
|
|||||||
/**
|
/**
|
||||||
* Console运行路径
|
* Console运行路径
|
||||||
*/
|
*/
|
||||||
var path: String = System.getProperty("user.dir")
|
lateinit var path: String
|
||||||
internal set
|
internal set
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -68,19 +68,47 @@ object MiraiConsole {
|
|||||||
private var started = false
|
private var started = false
|
||||||
|
|
||||||
|
|
||||||
|
@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN)
|
||||||
|
@Suppress("FunctionName")
|
||||||
|
@JvmSynthetic
|
||||||
|
@JvmStatic
|
||||||
|
fun /* synthetic */`start$default`(
|
||||||
|
miraiConsole: MiraiConsole,
|
||||||
|
miraiConsoleUI: MiraiConsoleUI?,
|
||||||
|
string: String?,
|
||||||
|
string2: String?,
|
||||||
|
n: Int,
|
||||||
|
@Suppress("UNUSED_PARAMETER") `object`: Any?
|
||||||
|
) {
|
||||||
|
@Suppress("NAME_SHADOWING")
|
||||||
|
var string = string
|
||||||
|
|
||||||
|
@Suppress("NAME_SHADOWING")
|
||||||
|
var string2 = string2
|
||||||
|
if (n and 2 != 0) {
|
||||||
|
string = "0.0.0"
|
||||||
|
}
|
||||||
|
if (n and 4 != 0) {
|
||||||
|
string2 = "0.0.0"
|
||||||
|
}
|
||||||
|
miraiConsole.start(miraiConsoleUI!!, string!!, string2!!)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 启动Console
|
* 启动Console
|
||||||
*/
|
*/
|
||||||
|
@JvmOverloads
|
||||||
fun start(
|
fun start(
|
||||||
frontEnd: MiraiConsoleUI,
|
frontEnd: MiraiConsoleUI,
|
||||||
coreVersion: String = "0.0.0",
|
coreVersion: String = "0.0.0",
|
||||||
consoleVersion: String = "0.0.0"
|
consoleVersion: String = "0.0.0",
|
||||||
|
path:String = System.getProperty("user.dir")
|
||||||
) {
|
) {
|
||||||
if (started) {
|
if (started) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
started = true
|
started = true
|
||||||
|
this.path = path
|
||||||
/* 初始化前端 */
|
/* 初始化前端 */
|
||||||
this.version = consoleVersion
|
this.version = consoleVersion
|
||||||
this.frontEnd = frontEnd
|
this.frontEnd = frontEnd
|
||||||
|
@ -39,7 +39,7 @@ object DefaultCommands {
|
|||||||
try {
|
try {
|
||||||
MiraiConsole.frontEnd.prePushBot(account)
|
MiraiConsole.frontEnd.prePushBot(account)
|
||||||
val bot = Bot(account, password) {
|
val bot = Bot(account, password) {
|
||||||
fileBasedDeviceInfo()
|
fileBasedDeviceInfo(MiraiConsole.path + "/device.json")
|
||||||
this.loginSolver = MiraiConsole.frontEnd.createLoginSolver()
|
this.loginSolver = MiraiConsole.frontEnd.createLoginSolver()
|
||||||
this.botLoggerSupplier = {
|
this.botLoggerSupplier = {
|
||||||
SimpleLogger("BOT $account]") { _, message, e ->
|
SimpleLogger("BOT $account]") { _, message, e ->
|
||||||
|
@ -29,7 +29,7 @@ import java.util.jar.JarFile
|
|||||||
|
|
||||||
|
|
||||||
object PluginManager {
|
object PluginManager {
|
||||||
internal val pluginsPath = (System.getProperty("user.dir") + "/plugins/").replace("//", "/").also {
|
internal val pluginsPath = (MiraiConsole.path + "/plugins/").replace("//", "/").also {
|
||||||
File(it).mkdirs()
|
File(it).mkdirs()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -372,6 +372,7 @@ object PluginManager {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据插件名字找Jar中的文件
|
* 根据插件名字找Jar中的文件
|
||||||
* null => 没找到
|
* null => 没找到
|
||||||
|
@ -103,15 +103,25 @@ internal class PluginClassLoader(
|
|||||||
files: File,
|
files: File,
|
||||||
private val pluginsLoader: PluginsLoader,
|
private val pluginsLoader: PluginsLoader,
|
||||||
parent: ClassLoader
|
parent: ClassLoader
|
||||||
) :
|
) {
|
||||||
URLClassLoader(arrayOf((files.toURI().toURL())), parent) {
|
|
||||||
private val classesCache = mutableMapOf<String, Class<*>?>()
|
private val classesCache = mutableMapOf<String, Class<*>?>()
|
||||||
|
private var classLoader: ClassLoader
|
||||||
|
|
||||||
override fun findClass(name: String): Class<*>? {
|
init {
|
||||||
return this.findClass(name, true)
|
classLoader = try {
|
||||||
|
//兼容Android
|
||||||
|
val loaderClass = Class.forName("dalvik.system.PathClassLoader")
|
||||||
|
loaderClass.getConstructor(String::class.java, ClassLoader::class.java)
|
||||||
|
.newInstance(files.absolutePath, parent) as ClassLoader
|
||||||
|
} catch (e: ClassNotFoundException) {
|
||||||
|
URLClassLoader(arrayOf((files.toURI().toURL())), parent)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun findClass(name: String, isSearchDependent: Boolean): Class<*>? {
|
fun loadClass(className: String): Class<*> = classLoader.loadClass(className)!!
|
||||||
|
|
||||||
|
|
||||||
|
fun findClass(name: String, isSearchDependent: Boolean = true): Class<*>? {
|
||||||
var clz: Class<*>? = null
|
var clz: Class<*>? = null
|
||||||
// 缓存中找
|
// 缓存中找
|
||||||
if (classesCache.containsKey(name)) {
|
if (classesCache.containsKey(name)) {
|
||||||
@ -122,9 +132,9 @@ internal class PluginClassLoader(
|
|||||||
if (isSearchDependent) {
|
if (isSearchDependent) {
|
||||||
clz = pluginsLoader.loadDependentClass(name)
|
clz = pluginsLoader.loadDependentClass(name)
|
||||||
}
|
}
|
||||||
// 交给super去findClass
|
// 好像没有findClass,直接load
|
||||||
if (clz == null) {
|
if (clz == null) {
|
||||||
clz = super.findClass(name)
|
clz = classLoader.loadClass(name)
|
||||||
}
|
}
|
||||||
// 加入缓存
|
// 加入缓存
|
||||||
if (clz != null) {
|
if (clz != null) {
|
||||||
@ -137,8 +147,10 @@ internal class PluginClassLoader(
|
|||||||
return clz
|
return clz
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun close() {
|
fun close() {
|
||||||
super.close()
|
if (classLoader is URLClassLoader) {
|
||||||
|
(classLoader as URLClassLoader).close()
|
||||||
|
}
|
||||||
classesCache.clear()
|
classesCache.clear()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user