feat: add remove plugin on disable

Signed-off-by: MiaoWoo <admin@yumc.pw>
This commit is contained in:
MiaoWoo 2019-09-22 18:00:18 +08:00
parent 514ac27aca
commit 38bd2f5187
5 changed files with 53 additions and 16 deletions

View File

@ -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];

View File

@ -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>;
} }
} }

View File

@ -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({

View File

@ -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);
}
} }

View File

@ -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;
}
}