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) {
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user