plugin.loader.FilePluginLoader.kt Maven / Gradle / Ivy
/*
* Copyright 2019-2020 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AFFERO GENERAL PUBLIC LICENSE version 3 license that can be found through the following link.
*
* https://github.com/mamoe/mirai/blob/master/LICENSE
*/
package net.mamoe.mirai.console.plugin.loader
import net.mamoe.mirai.console.plugin.Plugin
import net.mamoe.mirai.console.plugin.PluginManager
import net.mamoe.mirai.console.plugin.description.PluginDescription
import net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader
import java.io.File
/**
* ['/plugins'][PluginManager.pluginsPath] 目录中的插件的加载器. 每个加载器需绑定一个后缀.
*
* @see AbstractFilePluginLoader 默认基础实现
* @see JvmPluginLoader 内建的 Jar (JVM) 插件加载器.
*/
public interface FilePluginLoader : PluginLoader
{
/**
* 所支持的插件文件后缀, 含 '.', 不区分大小写. 如 [JvmPluginLoader] 为 ".jar"
*/
public val fileSuffix: String
}
/**
* [FilePluginLoader] 的默认基础实现.
*
* @see FilePluginLoader
*/
public abstract class AbstractFilePluginLoader
(
/**
* 所支持的插件文件后缀, 含 '.', 不区分大小写. 如 [JvmPluginLoader] 为 ".jar"
*/
public override val fileSuffix: String,
) : FilePluginLoader
{
private fun pluginsFilesSequence(): Sequence =
PluginManager.pluginsFolder.listFiles().orEmpty().asSequence()
.filter { it.isFile && it.name.endsWith(fileSuffix, ignoreCase = true) }
/**
* 读取扫描到的后缀与 [fileSuffix] 相同的文件中的插件实例, 但不 [加载][PluginLoader.load]
*/
protected abstract fun Sequence.extractPlugins(): List
public final override fun listPlugins(): List
= pluginsFilesSequence().extractPlugins()
}