diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/plugin/PluginManagerImpl.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/plugin/PluginManagerImpl.kt
index ebde00937..d39deb81f 100644
--- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/plugin/PluginManagerImpl.kt
+++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/plugin/PluginManagerImpl.kt
@@ -17,6 +17,9 @@ import net.mamoe.mirai.console.MiraiConsole
import net.mamoe.mirai.console.internal.data.cast
import net.mamoe.mirai.console.internal.data.mkdir
import net.mamoe.mirai.console.plugin.*
+import net.mamoe.mirai.console.plugin.dsecription.PluginDependency
+import net.mamoe.mirai.console.plugin.dsecription.PluginDescription
+import net.mamoe.mirai.console.plugin.dsecription.PluginKind
import net.mamoe.mirai.utils.info
import java.nio.file.Path
import java.util.concurrent.locks.ReentrantLock
diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/Plugin.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/Plugin.kt
index 24111e985..5280d5e0b 100644
--- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/Plugin.kt
+++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/Plugin.kt
@@ -12,6 +12,7 @@
package net.mamoe.mirai.console.plugin
import net.mamoe.mirai.console.command.CommandOwner
+import net.mamoe.mirai.console.plugin.dsecription.PluginDescription
import net.mamoe.mirai.console.plugin.jvm.JvmPlugin
import net.mamoe.mirai.console.util.ConsoleExperimentalAPI
import java.io.File
@@ -39,13 +40,13 @@ public interface Plugin : CommandOwner {
* 所属插件加载器实例, 此加载器必须能加载这个 [Plugin].
*/
public val loader: PluginLoader<*, *>
-
- /**
- * 获取插件描述
- */
- public val description: PluginDescription
}
+/**
+ * 获取插件描述
+ */
+public val Plugin.description: PluginDescription get() = safeLoader.getDescription(this)
+
/**
* 禁用这个插件
*
diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/PluginLoader.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/PluginLoader.kt
index 02f8ced21..d4d0f60fe 100644
--- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/PluginLoader.kt
+++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/PluginLoader.kt
@@ -11,6 +11,8 @@
package net.mamoe.mirai.console.plugin
+import net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.register
+import net.mamoe.mirai.console.plugin.dsecription.PluginDescription
import net.mamoe.mirai.console.plugin.jvm.JarPluginLoader
import java.io.File
@@ -25,10 +27,10 @@ import java.io.File
* - [JarPluginLoader] Jar 插件加载器
*
* ### 扩展加载器
- * 插件被允许扩展一个加载器。 可通过 [PluginManager.registerPluginLoader]
+ * 插件被允许扩展一个加载器。 可通过 [PluginManager.register]
*
* @see JarPluginLoader Jar 插件加载器
- * @see PluginManager.registerPluginLoader 注册一个扩展的插件加载器
+ * @see PluginManager.register 注册一个扩展的插件加载器
*/
public interface PluginLoader
{
/**
@@ -75,6 +77,7 @@ public interface PluginLoader
{
public fun disable(plugin: P)
}
+@Suppress("UNCHECKED_CAST")
@JvmSynthetic
public inline fun PluginLoader.getDescription(plugin: P): D =
plugin.description
diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/PluginManager.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/PluginManager.kt
index d575e62c3..2921bf7a8 100644
--- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/PluginManager.kt
+++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/PluginManager.kt
@@ -13,6 +13,7 @@ package net.mamoe.mirai.console.plugin
import net.mamoe.mirai.console.MiraiConsole
import net.mamoe.mirai.console.internal.plugin.PluginManagerImpl
+import net.mamoe.mirai.console.plugin.dsecription.PluginDescription
import java.io.File
import java.nio.file.Path
diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/description.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/dsecription/PluginDependency.kt
similarity index 52%
rename from backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/description.kt
rename to backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/dsecription/PluginDependency.kt
index 45f5c0b91..d79b46317 100644
--- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/description.kt
+++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/dsecription/PluginDependency.kt
@@ -7,100 +7,19 @@
* https://github.com/mamoe/mirai/blob/master/LICENSE
*/
-package net.mamoe.mirai.console.plugin
+package net.mamoe.mirai.console.plugin.dsecription
import com.vdurmont.semver4j.Semver
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
-import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.encodeToString
import net.mamoe.mirai.console.internal.data.map
import net.mamoe.yamlkt.Yaml
import net.mamoe.yamlkt.YamlDynamicSerializer
-import java.io.File
-
-
-/**
- * 插件描述.
- *
- * @see Plugin
- */
-public interface PluginDescription {
- /**
- * 插件类型. 将会决定加载顺序
- *
- * @see PluginKind
- */
- public val kind: PluginKind
-
- /**
- * 插件名称.
- */
- public val name: String
-
- /**
- * 插件作者, 允许为空
- */
- public val author: String
-
- /**
- * 插件版本.
- *
- * 语法参考: ([语义化版本 2.0.0](https://semver.org/lang/zh-CN/))
- *
- * @see Semver 语义化版本. 允许 [宽松][Semver.SemverType.LOOSE] 类型版本.
- */
- public val version: Semver
-
- /**
- * 插件信息, 允许为空
- */
- public val info: String
-
- /**
- * 此插件依赖的其他插件, 将会在这些插件加载之后加载此插件
- *
- * @see PluginDependency
- */
- public val dependencies: List<@Serializable(with = PluginDependency.SmartSerializer::class) PluginDependency>
-}
-
-/**
- * 插件类型
- */
-@Serializable(with = PluginKind.AsStringSerializer::class)
-public enum class PluginKind {
- /** 表示此插件提供一个 [PluginLoader], 应在加载其他 [NORMAL] 类型插件前加载 */
- LOADER,
-
- /** 表示此插件为一个通常的插件, 按照正常的依赖关系加载. */
- NORMAL;
-
- public object AsStringSerializer : KSerializer by String.serializer().map(
- serializer = { it.name },
- deserializer = { str ->
- values().firstOrNull {
- it.name.equals(str, ignoreCase = true)
- } ?: NORMAL
- }
- )
-}
/**
* 插件的一个依赖的信息.
*
- * 在 YAML 格式下, 典型的插件依赖示例:
- * ```yaml
- * dependencies:
- * - name: "依赖的插件名" # 依赖的插件名
- * version: "" # 依赖的版本号, 支持 Apache Ivy 格式. 为 null 或不指定时不限制版本
- * isOptional: true # `true` 表示插件在找不到此依赖时也能正常加载
- * - "SamplePlugin" # 名称为 SamplePlugin 的插件, 不限制版本, isOptional=false
- * - "TestPlugin:1.0.0+" # 名称为 ExamplePlugin 的插件, 版本至少为 1.0.0, isOptional=false
- * - "ExamplePlugin:1.5.0+?" # 名称为 ExamplePlugin 的插件, 版本至少为 1.5.0, 末尾 `?` 表示 isOptional=true
- * - "Another test plugin:[1.0.0, 2.0.0)" # 名称为 Another test plugin 的插件, 版本要求大于等于 1.0.0, 小于 2.0.0, isOptional=false
- * ```
- *
* @see PluginDescription.dependencies
*/
@Serializable(with = PluginDependency.SmartSerializer::class)
@@ -121,7 +40,7 @@ public data class PluginDependency(
public val isOptional: Boolean = false
) {
public override fun toString(): String {
- return "$name v$version"
+ return "$name v$version${if (isOptional) "?" else ""}"
}
@@ -157,11 +76,4 @@ public data class PluginDependency(
}
}
)
-}
-
-/**
- * 基于文件的插件 的描述
- */
-public interface FilePluginDescription : PluginDescription {
- public val file: File
-}
+}
\ No newline at end of file
diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/dsecription/PluginDescription.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/dsecription/PluginDescription.kt
new file mode 100644
index 000000000..24955abde
--- /dev/null
+++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/dsecription/PluginDescription.kt
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2019-2020 Mamoe Technologies and contributors.
+ *
+ * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 with Mamoe Exceptions 许可证的约束, 可以在以下链接找到该许可证.
+ * Use of this source code is governed by the GNU AFFERO GENERAL PUBLIC LICENSE version 3 with Mamoe Exceptions license that can be found via the following link.
+ *
+ * https://github.com/mamoe/mirai/blob/master/LICENSE
+ */
+
+package net.mamoe.mirai.console.plugin.dsecription
+
+import com.vdurmont.semver4j.Semver
+import kotlinx.serialization.Serializable
+import net.mamoe.mirai.console.plugin.Plugin
+
+
+/**
+ * 插件描述.
+ *
+ * @see Plugin
+ */
+public interface PluginDescription {
+ /**
+ * 插件类型. 将会决定加载顺序
+ *
+ * @see PluginKind
+ */
+ public val kind: PluginKind
+
+ /**
+ * 插件名称. 不允许存在 ":"
+ */
+ public val name: String
+
+ /**
+ * 插件作者, 允许为空
+ */
+ public val author: String
+
+ /**
+ * 插件版本.
+ *
+ * 语法参考: ([语义化版本 2.0.0](https://semver.org/lang/zh-CN/))
+ *
+ * @see Semver 语义化版本. 允许 [宽松][Semver.SemverType.LOOSE] 类型版本.
+ */
+ public val version: Semver
+
+ /**
+ * 插件信息, 允许为空
+ */
+ public val info: String
+
+ /**
+ * 此插件依赖的其他插件, 将会在这些插件加载之后加载此插件
+ *
+ * @see PluginDependency
+ */
+ public val dependencies: List<@Serializable(with = PluginDependency.SmartSerializer::class) PluginDependency>
+}
+
diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/dsecription/PluginKind.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/dsecription/PluginKind.kt
new file mode 100644
index 000000000..e3c475027
--- /dev/null
+++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/dsecription/PluginKind.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2019-2020 Mamoe Technologies and contributors.
+ *
+ * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 with Mamoe Exceptions 许可证的约束, 可以在以下链接找到该许可证.
+ * Use of this source code is governed by the GNU AFFERO GENERAL PUBLIC LICENSE version 3 with Mamoe Exceptions license that can be found via the following link.
+ *
+ * https://github.com/mamoe/mirai/blob/master/LICENSE
+ */
+
+package net.mamoe.mirai.console.plugin.dsecription
+
+import kotlinx.serialization.KSerializer
+import kotlinx.serialization.Serializable
+import kotlinx.serialization.builtins.serializer
+import net.mamoe.mirai.console.internal.data.map
+import net.mamoe.mirai.console.plugin.PluginLoader
+
+/**
+ * 插件类型
+ */
+@Serializable(with = PluginKind.AsStringSerializer::class)
+public enum class PluginKind {
+ /** 表示此插件提供一个 [PluginLoader], 应在加载其他 [NORMAL] 类型插件前加载 */
+ LOADER,
+
+ /** 表示此插件为一个通常的插件, 按照正常的依赖关系加载. */
+ NORMAL;
+
+ public object AsStringSerializer : KSerializer by String.serializer().map(
+ serializer = { it.name },
+ deserializer = { str ->
+ values().firstOrNull {
+ it.name.equals(str, ignoreCase = true)
+ } ?: NORMAL
+ }
+ )
+}
\ No newline at end of file
diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/JvmPlugin.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/JvmPlugin.kt
index 5a58bf433..a76706271 100644
--- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/JvmPlugin.kt
+++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/JvmPlugin.kt
@@ -43,7 +43,7 @@ public interface JvmPlugin : Plugin, CoroutineScope,
public val logger: MiraiLogger
/** 插件描述 */
- public override val description: JvmPluginDescription
+ public val description: JvmPluginDescription
/** 所属插件加载器实例 */
@JvmDefault
diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/JvmPluginDescription.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/JvmPluginDescription.kt
index 07ef42e61..6254c19f2 100644
--- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/JvmPluginDescription.kt
+++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/JvmPluginDescription.kt
@@ -14,9 +14,9 @@ import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import net.mamoe.mirai.console.internal.data.SemverAsStringSerializerLoose
-import net.mamoe.mirai.console.plugin.PluginDependency
-import net.mamoe.mirai.console.plugin.PluginDescription
-import net.mamoe.mirai.console.plugin.PluginKind
+import net.mamoe.mirai.console.plugin.dsecription.PluginDependency
+import net.mamoe.mirai.console.plugin.dsecription.PluginDescription
+import net.mamoe.mirai.console.plugin.dsecription.PluginKind
import net.mamoe.mirai.console.util.ConsoleExperimentalAPI
import net.mamoe.mirai.utils.MiraiExperimentalAPI
import java.io.File
@@ -32,7 +32,11 @@ public data class JvmMemoryPluginDescription(
public override val version: Semver,
public override val info: String,
public override val dependencies: List
-) : JvmPluginDescription
+) : JvmPluginDescription {
+ init {
+ require(!name.contains(':')) { "':' is forbidden in plugin name" }
+ }
+}
/**
* JVM 插件的描述. 通常作为 `plugin.yml`
@@ -72,6 +76,9 @@ public data class JvmMemoryPluginDescription(
*/
public interface JvmPluginDescription : PluginDescription
+/**
+ * @see JvmPluginDescriptionImpl
+ */
@MiraiExperimentalAPI
@Serializable
public class JvmPluginDescriptionImpl internal constructor(
@@ -86,6 +93,10 @@ public class JvmPluginDescriptionImpl internal constructor(
public override val dependencies: List<@Serializable(with = PluginDependency.SmartSerializer::class) PluginDependency> = listOf()
) : JvmPluginDescription {
+ init {
+ require(!name.contains(':')) { "':' is forbidden in plugin name" }
+ }
+
/**
* 在手动实现时使用这个构造器.
*/