feat: add remove plugin on disable
Signed-off-by: MiaoWoo <admin@yumc.pw>
This commit is contained in:
		@@ -16,16 +16,18 @@ export namespace command {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        off(plugin: any, name: string) {
 | 
					        off(plugin: any, name: string) {
 | 
				
			||||||
 | 
					            console.debug(`插件 ${plugin.description.name} 注销命令 ${name}...`)
 | 
				
			||||||
 | 
					            this.remove(plugin, name);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
         * Create Server Command Object
 | 
					         * Create Server Command Object
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        abstract create(plugin: any, command: string);
 | 
					        protected abstract create(plugin: any, command: string);
 | 
				
			||||||
        abstract onCommand(plugin: any, command: any, executor: Function);
 | 
					        protected abstract remove(plugin: any, command: string);
 | 
				
			||||||
        abstract onTabComplete(plugin: any, command: any, tabCompleter: Function);
 | 
					        protected abstract onCommand(plugin: any, command: any, executor: Function);
 | 
				
			||||||
 | 
					        protected abstract onTabComplete(plugin: any, command: any, tabCompleter: Function);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        setExecutor(plugin: any, command: any, executor: Function) {
 | 
					        protected setExecutor(plugin: any, command: any, executor: Function) {
 | 
				
			||||||
            return (sender: any, _, command: string, args: string[]) => {
 | 
					            return (sender: any, _, command: string, args: string[]) => {
 | 
				
			||||||
                try {
 | 
					                try {
 | 
				
			||||||
                    return executor(sender, command, Java.from(args));
 | 
					                    return executor(sender, command, Java.from(args));
 | 
				
			||||||
@@ -38,7 +40,7 @@ export namespace command {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        setTabCompleter(plugin: any, command: any, tabCompleter: Function) {
 | 
					        protected setTabCompleter(plugin: any, command: any, tabCompleter: Function) {
 | 
				
			||||||
            return (sender: any, _, command: string, args: string[]) => {
 | 
					            return (sender: any, _, command: string, args: string[]) => {
 | 
				
			||||||
                try {
 | 
					                try {
 | 
				
			||||||
                    var token = args[args.length - 1];
 | 
					                    var token = args[args.length - 1];
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,5 +23,6 @@ export namespace plugin {
 | 
				
			|||||||
        enable(...args: any[]): void;
 | 
					        enable(...args: any[]): void;
 | 
				
			||||||
        disable(...args: any[]): void;
 | 
					        disable(...args: any[]): void;
 | 
				
			||||||
        reload(...args: any[]): void;
 | 
					        reload(...args: any[]): void;
 | 
				
			||||||
 | 
					        getPlugins(): Map<string, any>;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,6 +27,12 @@ export class BukkitCommand extends command.Command {
 | 
				
			|||||||
        this.commandMap.register(plugin.description.name, cmd);
 | 
					        this.commandMap.register(plugin.description.name, cmd);
 | 
				
			||||||
        return cmd;
 | 
					        return cmd;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    remove(plugin: any, command: string) {
 | 
				
			||||||
 | 
					        var cmd = this.commandMap.getCommand(command)
 | 
				
			||||||
 | 
					        if (cmd && cmd instanceof PluginCommand) {
 | 
				
			||||||
 | 
					            cmd.unregister(this.commandMap);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    onCommand(plugin: any, command: any, executor: Function) {
 | 
					    onCommand(plugin: any, command: any, executor: Function) {
 | 
				
			||||||
        // 必须指定需要实现的接口类型 否则MOD服会报错
 | 
					        // 必须指定需要实现的接口类型 否则MOD服会报错
 | 
				
			||||||
        command.setExecutor(new CommandExecutor({
 | 
					        command.setExecutor(new CommandExecutor({
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,9 +52,11 @@ export class PluginManagerImpl implements plugin.PluginManager {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    enable(...args: any[]): void {
 | 
					    enable(...args: any[]): void {
 | 
				
			||||||
        this.checkAndGet(args[0]).forEach(pl => {
 | 
					        this.checkAndGet(args[0]).forEach(plugin => {
 | 
				
			||||||
            this.runCatch(pl, 'enable')
 | 
					            this.runCatch(plugin, 'enable')
 | 
				
			||||||
            this.runCatch(pl, `${this.serverType}enable`);
 | 
					            this.runCatch(plugin, `${this.serverType}enable`);
 | 
				
			||||||
 | 
					            this.registryCommand(plugin);
 | 
				
			||||||
 | 
					            this.registryListener(plugin);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -62,7 +64,8 @@ export class PluginManagerImpl implements plugin.PluginManager {
 | 
				
			|||||||
        this.checkAndGet(args[0]).forEach(pl => {
 | 
					        this.checkAndGet(args[0]).forEach(pl => {
 | 
				
			||||||
            this.runCatch(pl, 'disable');
 | 
					            this.runCatch(pl, 'disable');
 | 
				
			||||||
            this.runCatch(pl, `${this.serverType}disable`);
 | 
					            this.runCatch(pl, `${this.serverType}disable`);
 | 
				
			||||||
            this.EventManager.disable(pl);
 | 
					            this.unregistryCommand(pl);
 | 
				
			||||||
 | 
					            this.unregistryListener(pl);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -76,6 +79,10 @@ export class PluginManagerImpl implements plugin.PluginManager {
 | 
				
			|||||||
        })
 | 
					        })
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    getPlugins() {
 | 
				
			||||||
 | 
					        return this.pluginMap;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private runCatch(pl: any, func: string) {
 | 
					    private runCatch(pl: any, func: string) {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            if (pl[func]) pl[func].call(pl);
 | 
					            if (pl[func]) pl[func].call(pl);
 | 
				
			||||||
@@ -172,9 +179,7 @@ export class PluginManagerImpl implements plugin.PluginManager {
 | 
				
			|||||||
        this.pluginMap.set(metadata.name, pluginInstance);
 | 
					        this.pluginMap.set(metadata.name, pluginInstance);
 | 
				
			||||||
        pluginInstance.description = metadata;
 | 
					        pluginInstance.description = metadata;
 | 
				
			||||||
        // @ts-ignore
 | 
					        // @ts-ignore
 | 
				
			||||||
        pluginInstance.logger = new this.Console(metadata.name);
 | 
					        pluginInstance.logger = new this.Console(metadata.prefix || metadata.name);
 | 
				
			||||||
        this.registryCommand(pluginInstance);
 | 
					 | 
				
			||||||
        this.registryListener(pluginInstance);
 | 
					 | 
				
			||||||
        return pluginInstance;
 | 
					        return pluginInstance;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -199,4 +204,15 @@ export class PluginManagerImpl implements plugin.PluginManager {
 | 
				
			|||||||
            this.EventManager.listen(pluginInstance, event.name, pluginInstance[event.executor].bind(pluginInstance));
 | 
					            this.EventManager.listen(pluginInstance, event.name, pluginInstance[event.executor].bind(pluginInstance));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private unregistryCommand(pluginInstance: interfaces.Plugin) {
 | 
				
			||||||
 | 
					        let cmds = getPluginCommandMetadata(pluginInstance);
 | 
				
			||||||
 | 
					        cmds.forEach(cmd => {
 | 
				
			||||||
 | 
					            this.CommandManager.off(pluginInstance, cmd.name);
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private unregistryListener(pluginInstance: interfaces.Plugin) {
 | 
				
			||||||
 | 
					        this.EventManager.disable(pluginInstance);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,6 +47,7 @@ class SimpleCommandCallable {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    setExecutor = (executor: Function) => this.executor = executor;
 | 
					    setExecutor = (executor: Function) => this.executor = executor;
 | 
				
			||||||
    setTabCompleter = (tabCompleter: Function) => this.tabCompleter = tabCompleter;
 | 
					    setTabCompleter = (tabCompleter: Function) => this.tabCompleter = tabCompleter;
 | 
				
			||||||
 | 
					    toString = () => `Sponge SimpleCommandCallable`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@injectable()
 | 
					@injectable()
 | 
				
			||||||
@@ -54,19 +55,30 @@ export class SpongeCommand extends command.Command {
 | 
				
			|||||||
    @inject(plugin.PluginInstance)
 | 
					    @inject(plugin.PluginInstance)
 | 
				
			||||||
    private pluginInstance: any
 | 
					    private pluginInstance: any
 | 
				
			||||||
    private commandMap: any[] = [];
 | 
					    private commandMap: any[] = [];
 | 
				
			||||||
 | 
					    private commandMapping: any[] = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    create(plugin: any, command: string) {
 | 
					    create(plugin: any, command: string) {
 | 
				
			||||||
        var commandKey = plugin.description.name.toLowerCase() + ":" + command;
 | 
					        var commandKey = this.getCommandKey(plugin, command);
 | 
				
			||||||
        if (!this.commandMap[commandKey]) {
 | 
					        if (!this.commandMap[commandKey]) {
 | 
				
			||||||
            this.commandMap[commandKey] = new SimpleCommandCallable(command);
 | 
					            this.commandMap[commandKey] = new SimpleCommandCallable(command);
 | 
				
			||||||
            Sponge.getCommandManager().register(this.pluginInstance, this.commandMap[commandKey].callable, command, commandKey);
 | 
					            this.commandMapping[commandKey] = Sponge.getCommandManager().register(this.pluginInstance, this.commandMap[commandKey].callable, command, commandKey).orElse(null);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return this.commandMap[commandKey];
 | 
					        return this.commandMap[commandKey];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    remove(plugin: any, command: string) {
 | 
				
			||||||
 | 
					        var commandKey = this.getCommandKey(plugin, command);
 | 
				
			||||||
 | 
					        if (this.commandMapping[commandKey]) {
 | 
				
			||||||
 | 
					            Sponge.getCommandManager().removeMapping(this.commandMapping[commandKey]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    onCommand(plugin: any, command: any, executor: Function) {
 | 
					    onCommand(plugin: any, command: any, executor: Function) {
 | 
				
			||||||
        command.setExecutor(super.setExecutor(plugin, command, executor));
 | 
					        command.setExecutor(super.setExecutor(plugin, command, executor));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    onTabComplete(plugin: any, command: any, tabCompleter: Function) {
 | 
					    onTabComplete(plugin: any, command: any, tabCompleter: Function) {
 | 
				
			||||||
        command.setTabCompleter(super.setTabCompleter(plugin, command, tabCompleter));
 | 
					        command.setTabCompleter(super.setTabCompleter(plugin, command, tabCompleter));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private getCommandKey(plugin: any, command: string) {
 | 
				
			||||||
 | 
					        return plugin.description.name.toLowerCase() + ":" + command;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user