@@ -1,5 +1,6 @@
 | 
			
		||||
import { command, plugin, server } from '@ccms/api'
 | 
			
		||||
import { provideSingleton, Autowired } from '@ccms/container'
 | 
			
		||||
import { interfaces } from './interfaces'
 | 
			
		||||
import { getPluginCommandMetadata, getPluginTabCompleterMetadata } from './utils'
 | 
			
		||||
 | 
			
		||||
@provideSingleton(PluginCommandManager)
 | 
			
		||||
@@ -23,11 +24,10 @@ export class PluginCommandManager {
 | 
			
		||||
                continue
 | 
			
		||||
            }
 | 
			
		||||
            for (let command of [cmd.name, ...cmd.alias]) {
 | 
			
		||||
                let [cmdExecutor, cmdCompleter] = this.generateAutoMainCommand(pluginInstance, cmd, tabs.get(command))
 | 
			
		||||
                this.CommandManager.on(pluginInstance, command, {
 | 
			
		||||
                    cmd: pluginInstance[cmd.executor].bind(pluginInstance),
 | 
			
		||||
                    tab: tabs.has(command) ?
 | 
			
		||||
                        pluginInstance[tabs.get(command).executor].bind(pluginInstance) :
 | 
			
		||||
                        console.debug(`[${pluginInstance.description.name}] command ${cmd.name} is not registry tabCompleter`)
 | 
			
		||||
                    cmd: cmdExecutor.bind(pluginInstance),
 | 
			
		||||
                    tab: cmdCompleter?.bind(pluginInstance)
 | 
			
		||||
                })
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -37,4 +37,29 @@ export class PluginCommandManager {
 | 
			
		||||
        let cmds = getPluginCommandMetadata(pluginInstance)
 | 
			
		||||
        cmds.forEach(cmd => this.CommandManager.off(pluginInstance, cmd.name))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private generateAutoMainCommand(pluginInstance: plugin.Plugin, cmd: interfaces.CommandMetadata, tab: interfaces.CommandMetadata) {
 | 
			
		||||
        let cmdExecutor = pluginInstance[cmd.executor]
 | 
			
		||||
        let cmdCompleter = tab ? pluginInstance[tab.executor] : undefined
 | 
			
		||||
        let cmdSubCache = Object.keys(pluginInstance.constructor.prototype).filter(s => s.startsWith('cmd')).map(s => s.substring(3))
 | 
			
		||||
        if (cmd.autoMain) {
 | 
			
		||||
            cmdExecutor = (sender: any, command: string, args: string[]) => {
 | 
			
		||||
                let subcommand = args[0] || 'help'
 | 
			
		||||
                let cmdKey = 'cmd' + subcommand
 | 
			
		||||
                if (!pluginInstance[cmdKey]) {
 | 
			
		||||
                    console.sender(sender, '§4未知的子命令: §c' + subcommand)
 | 
			
		||||
                    pluginInstance['cmdhelp'] && console.sender(sender, `§6请执行 §b/${command} §ahelp §6查看帮助!`)
 | 
			
		||||
                    return
 | 
			
		||||
                }
 | 
			
		||||
                args.shift()
 | 
			
		||||
                return pluginInstance[cmdKey].apply(pluginInstance, [sender, ...args])
 | 
			
		||||
            }
 | 
			
		||||
            let originCompleter = cmdCompleter
 | 
			
		||||
            cmdCompleter = (sender: any, command: string, args: string[]) => {
 | 
			
		||||
                return (args.length == 1 ? cmdSubCache : []).concat(originCompleter?.apply(pluginInstance, [sender, command, args]) || [])
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (!cmdCompleter) { console.warn(`[${pluginInstance.description.name}] command ${cmd.name} is not registry tabCompleter`) }
 | 
			
		||||
        return [cmdExecutor, cmdCompleter]
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -47,6 +47,10 @@ export namespace interfaces {
 | 
			
		||||
         * 参数列表
 | 
			
		||||
         */
 | 
			
		||||
        paramtypes?: string[]
 | 
			
		||||
        /**
 | 
			
		||||
         * 自动化主命令
 | 
			
		||||
         */
 | 
			
		||||
        autoMain?: boolean
 | 
			
		||||
    }
 | 
			
		||||
    export interface ListenerMetadata extends ExecMetadata {
 | 
			
		||||
        /**
 | 
			
		||||
 
 | 
			
		||||
@@ -233,21 +233,25 @@ export class PluginManagerImpl implements plugin.PluginManager {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private checkDepends(depends: string | string[]) {
 | 
			
		||||
        if (!depends) return true
 | 
			
		||||
        for (const depend of depends) { if (!this.metadataMap.has(depend)) return false }
 | 
			
		||||
        return true
 | 
			
		||||
        if (!depends) return []
 | 
			
		||||
        let loseDepends = []
 | 
			
		||||
        for (const depend of depends) { if (!this.metadataMap.has(depend)) loseDepends.push(depend) }
 | 
			
		||||
        return loseDepends
 | 
			
		||||
    }
 | 
			
		||||
    private checkNativeDepends(depends: string | string[]) {
 | 
			
		||||
        if (!depends) return true
 | 
			
		||||
        for (const depend of depends) { if (!this.nativePluginManager.has(depend)) return false }
 | 
			
		||||
        return true
 | 
			
		||||
        if (!depends) return []
 | 
			
		||||
        let loseDepends = []
 | 
			
		||||
        for (const depend of depends) { if (!this.nativePluginManager.has(depend)) loseDepends.push(depend) }
 | 
			
		||||
        return loseDepends
 | 
			
		||||
    }
 | 
			
		||||
    private buildPlugin(metadata: plugin.PluginMetadata) {
 | 
			
		||||
        if (this.instanceMap.has(metadata.name)) { throw new Error(`Plugin ${metadata.name} is already load from ${metadata.source}...`) }
 | 
			
		||||
        if (!this.loaderMap.has(metadata.type)) { throw new Error(`§4无法加载插件 §b${metadata.name} §4请检查 §c${metadata.type} §4加载器是否正常启用!`) }
 | 
			
		||||
        if (!this.serverChecker.check(metadata.servers)) { throw new Error(`§6插件 §b${metadata.name} §c服务器类型不兼容(${metadata.servers.join(',')}) §6忽略加载...`) }
 | 
			
		||||
        if (!this.checkDepends(metadata.depends)) { throw new Error(`§4无法加载插件 §b${metadata.name} §4请检查依赖 §3${metadata.depends.join(',')} §4是否安装完整!`) }
 | 
			
		||||
        if (!this.checkNativeDepends(metadata.nativeDepends)) { throw new Error(`§4无法加载插件 §b${metadata.name} §4请检查插件依赖 §3${metadata.nativeDepends.join(',')} §4是否安装完整!`) }
 | 
			
		||||
        let loseDepends = this.checkDepends(metadata.depends) || []
 | 
			
		||||
        if (loseDepends.length) { throw new Error(`§4无法加载插件 §b${metadata.name} §4请检查依赖 §3[${loseDepends.join(',')}] §4是否安装完整!`) }
 | 
			
		||||
        let loseNativeDepends = this.checkNativeDepends(metadata.nativeDepends) || []
 | 
			
		||||
        if (loseNativeDepends.length) { throw new Error(`§4无法加载插件 §b${metadata.name} §4请检查插件依赖 §3[${loseNativeDepends.join(',')}] §4是否安装完整!`) }
 | 
			
		||||
        let pluginInstance = this.loaderMap.get(metadata.type).build(metadata)
 | 
			
		||||
        if (!pluginInstance) { throw new Error(`§4加载器 §c${metadata.type} §4加载插件 §c${metadata.name} §4失败!`) }
 | 
			
		||||
        this.instanceMap.set(metadata.name, pluginInstance)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user