feat: add remove plugin on disable
Signed-off-by: MiaoWoo <admin@yumc.pw>
This commit is contained in:
parent
514ac27aca
commit
38bd2f5187
@ -16,16 +16,18 @@ export namespace command {
|
||||
}
|
||||
}
|
||||
off(plugin: any, name: string) {
|
||||
|
||||
console.debug(`插件 ${plugin.description.name} 注销命令 ${name}...`)
|
||||
this.remove(plugin, name);
|
||||
}
|
||||
/**
|
||||
* Create Server Command Object
|
||||
*/
|
||||
abstract create(plugin: any, command: string);
|
||||
abstract onCommand(plugin: any, command: any, executor: Function);
|
||||
abstract onTabComplete(plugin: any, command: any, tabCompleter: Function);
|
||||
protected abstract create(plugin: any, command: string);
|
||||
protected abstract remove(plugin: any, command: string);
|
||||
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[]) => {
|
||||
try {
|
||||
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[]) => {
|
||||
try {
|
||||
var token = args[args.length - 1];
|
||||
|
@ -23,5 +23,6 @@ export namespace plugin {
|
||||
enable(...args: any[]): void;
|
||||
disable(...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);
|
||||
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) {
|
||||
// 必须指定需要实现的接口类型 否则MOD服会报错
|
||||
command.setExecutor(new CommandExecutor({
|
||||
|
@ -52,9 +52,11 @@ export class PluginManagerImpl implements plugin.PluginManager {
|
||||
}
|
||||
|
||||
enable(...args: any[]): void {
|
||||
this.checkAndGet(args[0]).forEach(pl => {
|
||||
this.runCatch(pl, 'enable')
|
||||
this.runCatch(pl, `${this.serverType}enable`);
|
||||
this.checkAndGet(args[0]).forEach(plugin => {
|
||||
this.runCatch(plugin, '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.runCatch(pl, '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) {
|
||||
try {
|
||||
if (pl[func]) pl[func].call(pl);
|
||||
@ -172,9 +179,7 @@ export class PluginManagerImpl implements plugin.PluginManager {
|
||||
this.pluginMap.set(metadata.name, pluginInstance);
|
||||
pluginInstance.description = metadata;
|
||||
// @ts-ignore
|
||||
pluginInstance.logger = new this.Console(metadata.name);
|
||||
this.registryCommand(pluginInstance);
|
||||
this.registryListener(pluginInstance);
|
||||
pluginInstance.logger = new this.Console(metadata.prefix || metadata.name);
|
||||
return pluginInstance;
|
||||
}
|
||||
|
||||
@ -199,4 +204,15 @@ export class PluginManagerImpl implements plugin.PluginManager {
|
||||
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;
|
||||
setTabCompleter = (tabCompleter: Function) => this.tabCompleter = tabCompleter;
|
||||
toString = () => `Sponge SimpleCommandCallable`
|
||||
}
|
||||
|
||||
@injectable()
|
||||
@ -54,19 +55,30 @@ export class SpongeCommand extends command.Command {
|
||||
@inject(plugin.PluginInstance)
|
||||
private pluginInstance: any
|
||||
private commandMap: any[] = [];
|
||||
private commandMapping: any[] = [];
|
||||
|
||||
create(plugin: any, command: string) {
|
||||
var commandKey = plugin.description.name.toLowerCase() + ":" + command;
|
||||
var commandKey = this.getCommandKey(plugin, command);
|
||||
if (!this.commandMap[commandKey]) {
|
||||
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];
|
||||
}
|
||||
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) {
|
||||
command.setExecutor(super.setExecutor(plugin, command, executor));
|
||||
}
|
||||
onTabComplete(plugin: any, command: any, tabCompleter: Function) {
|
||||
command.setTabCompleter(super.setTabCompleter(plugin, command, tabCompleter));
|
||||
}
|
||||
|
||||
private getCommandKey(plugin: any, command: string) {
|
||||
return plugin.description.name.toLowerCase() + ":" + command;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user