refactor: optimize config & plugin load
Signed-off-by: MiaoWoo <admin@yumc.pw>
This commit is contained in:
		@@ -47,8 +47,8 @@ export class PluginCommandManager {
 | 
				
			|||||||
                let subcommand = args[0] || 'help'
 | 
					                let subcommand = args[0] || 'help'
 | 
				
			||||||
                let cmdKey = 'cmd' + subcommand
 | 
					                let cmdKey = 'cmd' + subcommand
 | 
				
			||||||
                if (!pluginInstance[cmdKey]) {
 | 
					                if (!pluginInstance[cmdKey]) {
 | 
				
			||||||
                    console.sender(sender, '§4未知的子命令: §c' + subcommand)
 | 
					                    pluginInstance.logger.sender(sender, '§4未知的子命令: §c' + subcommand)
 | 
				
			||||||
                    pluginInstance['cmdhelp'] && console.sender(sender, `§6请执行 §b/${command} §ahelp §6查看帮助!`)
 | 
					                    pluginInstance['cmdhelp'] && pluginInstance.logger.sender(sender, `§6请执行 §b/${command} §ahelp §6查看帮助!`)
 | 
				
			||||||
                    return
 | 
					                    return
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                args.shift()
 | 
					                args.shift()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -85,25 +85,27 @@ export class PluginConfigManager {
 | 
				
			|||||||
        try {
 | 
					        try {
 | 
				
			||||||
            metadata.file = fs.concat(fs.file(plugin.description.loadMetadata.file).parent, plugin.description.name, metadata.filename)
 | 
					            metadata.file = fs.concat(fs.file(plugin.description.loadMetadata.file).parent, plugin.description.name, metadata.filename)
 | 
				
			||||||
            let configLoader = this.getConfigLoader(metadata.format)
 | 
					            let configLoader = this.getConfigLoader(metadata.format)
 | 
				
			||||||
            let value = plugin[metadata.variable]
 | 
					            let defaultValue = metadata.default ?? plugin[metadata.variable]
 | 
				
			||||||
 | 
					            let configValue = defaultValue
 | 
				
			||||||
            if (!fs.exists(metadata.file)) {
 | 
					            if (!fs.exists(metadata.file)) {
 | 
				
			||||||
                base.save(metadata.file, configLoader.dump(value))
 | 
					                base.save(metadata.file, configLoader.dump(defaultValue))
 | 
				
			||||||
                console.i18n("ms.plugin.manager.config.save.default", { plugin: plugin.description.name, name: metadata.name, format: metadata.format })
 | 
					                console.i18n("ms.plugin.manager.config.save.default", { plugin: plugin.description.name, name: metadata.name, format: metadata.format })
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                value = configLoader.load(base.read(metadata.file))
 | 
					                configValue = configLoader.load(base.read(metadata.file)) || {}
 | 
				
			||||||
                console.debug(`[${plugin.description.name}] Load Config ${metadata.variable} from file ${metadata.file} =>\n${JSON.stringify(value, undefined, 4)}`)
 | 
					                if (defaultValue) {
 | 
				
			||||||
                if (metadata.default) {
 | 
					 | 
				
			||||||
                    let needSave = false
 | 
					                    let needSave = false
 | 
				
			||||||
                    for (const key of Object.keys(metadata.default)) {
 | 
					                    for (const key of Object.keys(defaultValue)) {
 | 
				
			||||||
                        if (value[key] == undefined) {
 | 
					                        // 当配置文件不存在当前属性时才进行赋值
 | 
				
			||||||
                            value[key] = metadata.default[key]
 | 
					                        if (!Object.prototype.hasOwnProperty.call(configValue, key)) {
 | 
				
			||||||
 | 
					                            configValue[key] = defaultValue[key]
 | 
				
			||||||
                            needSave = true
 | 
					                            needSave = true
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    needSave && base.save(metadata.file, configLoader.dump(value))
 | 
					                    needSave && base.save(metadata.file, configLoader.dump(configValue))
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					                console.debug(`[${plugin.description.name}] Load Config ${metadata.variable} from file ${metadata.file} =>\n${JSON.stringify(configValue, undefined, 4)}`)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            this.defienConfigProp(plugin, metadata, value)
 | 
					            this.defienConfigProp(plugin, metadata, configValue)
 | 
				
			||||||
        } catch (error) {
 | 
					        } catch (error) {
 | 
				
			||||||
            console.i18n("ms.plugin.manager.config.load.error", { plugin: plugin.description.name, name: metadata.name, format: metadata.format, error })
 | 
					            console.i18n("ms.plugin.manager.config.load.error", { plugin: plugin.description.name, name: metadata.name, format: metadata.format, error })
 | 
				
			||||||
            console.ex(error)
 | 
					            console.ex(error)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,6 +41,10 @@ export class PluginManagerImpl implements plugin.PluginManager {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    private instanceMap: Map<string, plugin.Plugin>
 | 
					    private instanceMap: Map<string, plugin.Plugin>
 | 
				
			||||||
    private metadataMap: Map<string, plugin.PluginMetadata>
 | 
					    private metadataMap: Map<string, plugin.PluginMetadata>
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 延时加载插件
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private lazyMetadataMap: Map<string, plugin.PluginMetadata>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    constructor() {
 | 
					    constructor() {
 | 
				
			||||||
        this.sacnnerMap = new Map()
 | 
					        this.sacnnerMap = new Map()
 | 
				
			||||||
@@ -48,6 +52,7 @@ export class PluginManagerImpl implements plugin.PluginManager {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        this.instanceMap = new Map()
 | 
					        this.instanceMap = new Map()
 | 
				
			||||||
        this.metadataMap = new Map()
 | 
					        this.metadataMap = new Map()
 | 
				
			||||||
 | 
					        this.lazyMetadataMap = new Map()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // ignore unused
 | 
					        // ignore unused
 | 
				
			||||||
        this.taskManager
 | 
					        this.taskManager
 | 
				
			||||||
@@ -239,14 +244,14 @@ export class PluginManagerImpl implements plugin.PluginManager {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private buildPlugins() {
 | 
					    private buildPlugins() {
 | 
				
			||||||
        this.metadataMap.forEach((metadata) => {
 | 
					        this.metadataMap.forEach((metadata, key) => {
 | 
				
			||||||
            try {
 | 
					            if (metadata?.depends?.length) {
 | 
				
			||||||
 | 
					                this.lazyMetadataMap.set(key, metadata)
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
                this.buildPlugin(metadata)
 | 
					                this.buildPlugin(metadata)
 | 
				
			||||||
            } catch (error) {
 | 
					 | 
				
			||||||
                console.console(`§4无法加载插件 §b${metadata.name} §4构建插件失败!`)
 | 
					 | 
				
			||||||
                console.ex(error)
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
 | 
					        this.lazyMetadataMap.forEach((metadata, key) => this.buildPlugin(metadata))
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private checkDepends(depends: string | string[]) {
 | 
					    private checkDepends(depends: string | string[]) {
 | 
				
			||||||
@@ -262,16 +267,21 @@ export class PluginManagerImpl implements plugin.PluginManager {
 | 
				
			|||||||
        return loseDepends
 | 
					        return loseDepends
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    private buildPlugin(metadata: plugin.PluginMetadata) {
 | 
					    private buildPlugin(metadata: plugin.PluginMetadata) {
 | 
				
			||||||
        if (this.instanceMap.has(metadata.name)) { throw new Error(`Plugin ${metadata.name} is already load from ${metadata.source}...`) }
 | 
					        try {
 | 
				
			||||||
        if (!this.loaderMap.has(metadata.type)) { throw new Error(`§4无法加载插件 §b${metadata.name} §4请检查 §c${metadata.type} §4加载器是否正常启用!`) }
 | 
					            if (this.instanceMap.has(metadata.name)) { throw new Error(`Plugin ${metadata.name} is already load from ${metadata.source}...`) }
 | 
				
			||||||
        if (!this.serverChecker.check(metadata.servers)) { throw new Error(`§6插件 §b${metadata.name} §c服务器类型不兼容(${metadata.servers.join(',')}) §6忽略加载...`) }
 | 
					            if (!this.loaderMap.has(metadata.type)) { throw new Error(`§4无法加载插件 §b${metadata.name} §4请检查 §c${metadata.type} §4加载器是否正常启用!`) }
 | 
				
			||||||
        let loseDepends = this.checkDepends(metadata.depends) || []
 | 
					            if (!this.serverChecker.check(metadata.servers)) { throw new Error(`§6插件 §b${metadata.name} §c服务器类型不兼容(${metadata.servers.join(',')}) §6忽略加载...`) }
 | 
				
			||||||
        if (loseDepends.length) { throw new Error(`§4无法加载插件 §b${metadata.name} §4请检查依赖 §3[${loseDepends.join(',')}] §4是否安装完整!`) }
 | 
					            let loseDepends = this.checkDepends(metadata.depends) || []
 | 
				
			||||||
        let loseNativeDepends = this.checkNativeDepends(metadata.nativeDepends) || []
 | 
					            if (loseDepends.length) { throw new Error(`§4无法加载插件 §b${metadata.name} §4请检查脚本依赖 §3[${loseDepends.join(',')}] §4是否安装完整!`) }
 | 
				
			||||||
        if (loseNativeDepends.length) { throw new Error(`§4无法加载插件 §b${metadata.name} §4请检查插件依赖 §3[${loseNativeDepends.join(',')}] §4是否安装完整!`) }
 | 
					            let loseNativeDepends = this.checkNativeDepends(metadata.nativeDepends) || []
 | 
				
			||||||
        let pluginInstance = this.loaderMap.get(metadata.type).build(metadata)
 | 
					            if (loseNativeDepends.length) { throw new Error(`§4无法加载插件 §b${metadata.name} §4请检查插件依赖 §3[${loseNativeDepends.join(',')}] §4是否安装完整!`) }
 | 
				
			||||||
        if (!pluginInstance) { throw new Error(`§4加载器 §c${metadata.type} §4加载插件 §c${metadata.name} §4失败!`) }
 | 
					            let pluginInstance = this.loaderMap.get(metadata.type).build(metadata)
 | 
				
			||||||
        this.instanceMap.set(metadata.name, pluginInstance)
 | 
					            if (!pluginInstance) { throw new Error(`§4加载器 §c${metadata.type} §4加载插件 §c${metadata.name} §4失败!`) }
 | 
				
			||||||
        return pluginInstance
 | 
					            this.instanceMap.set(metadata.name, pluginInstance)
 | 
				
			||||||
 | 
					            return pluginInstance
 | 
				
			||||||
 | 
					        } catch (error) {
 | 
				
			||||||
 | 
					            console.console(`§4无法加载插件 §b${metadata.name} §4构建插件失败!`)
 | 
				
			||||||
 | 
					            console.ex(error)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user