2017-04-15 108 views
1

我想弄清楚如何删除命令创建后不一致机器人。这里是我创建的命令:从DiscordBot删除命令CommandService

_commandService.CreateCommand("create").Parameter("message", ParameterType.Multiple).Do(async e => 
{   
    var message = e.Args.Skip(1).Aggregate("", (current, t) => current + (t + " "));; 

    _commandService.CreateCommand("hello").Do(async cc => 
    { 
     await e.User.SendMessage(customCommand.Message); 
    }); 
}); 

的_commandService对象是Discord.Commands.CommandService

类型的现在,我希望能够运行:

_commandService.CreateCommand("delete").Parameter("message", ParameterType.Multiple).Do(async e => 
{  
    _commandService.DeleteCommand("hello"); 
}); 

然而,这样的方法并不存在,我也不能访问_commandService对象内的命令,因为所有内容都是只读的get;

有没有人知道如何删除t他命令,而不必重新启动机器人?

回答

0

这是可能的,但从discord.net 1.0开始,你需要使用Modules系统来完成它。不幸的是,这使事情变得非常复杂。希望他们会在未来的更新中添加适当的DeleteCommand(string commandName)

为什么你需要做到这一点(此部分,如果你不关心discord.net源不需要):该 类的CommandMap(它存储的命令,意料之中)暴露了做什么的方法RemoveCommand你正在寻找。源中此类的唯一对象的引用位于CommandService中的私有方法RemoveModuleInternal中。这是暴露在两种公共方法之一:RemoveModuleAsync(ModuleInfo module)RemoveModuleAsync<T>()。从1.0版本开始,没有其他方法可以影响命令。

如何操作:首先获取模块的ModuleInfo对象。最好,您创建的模块将只包含您想要删除的命令,原因很快就会显而易见。当您使用CreateModuleAsync(string primaryAlias, Action<ModuleBuilder> buildFunc)(或其他用于添加模块的方法之一)时,您将返回ModuleInfo对象。这意味着您需要使用ModuleBuilder,而不是使用简单的commandService.CreateCommand方法。请阅读如何做到这一点here ......如果这个过程仍令您感到困惑,那么这是另一个问题的绝佳主题。

你需要保持跟踪CreateModuleAsync以某种方式返回(我会使用的方法是如下图),然后你的第二个命令成为ModuleInfo对象:

// private ModuleInfo createInfo 
_commandService.CreateCommand("delete").Parameter("message", ParameterType.Multiple).Do(async e => 
{  
    if (createInfo != null) 
    { 
     await _commandService.DeleteModuleAsync(createInfo); 
    } 
}); 

请注意,整个模块实例被删除...这就是为什么你的“创建”命令应该是唯一的东西。

另一种解决方案(虽然明显不那么优雅),如果整个模块业务看起来太复杂,将存储一个布尔值,并简单地切换它来模拟删除命令。那就是:

// bool createNotDeleted = true; 
_commandService.CreateCommand("create").Parameter("message", ParameterType.Multiple).Do(async e => 
{  
    if (createNotDeleted) 
    { 
     var message = e.Args.Skip(1).Aggregate("", (current, t) => current + (t + " "));; 

     _commandService.CreateCommand("hello").Do(async cc => 
     { 
      await e.User.SendMessage(customCommand.Message); 
     }); 
    } 
    else 
    { 
     // error handling 
    }  

}); 

_commandService.CreateCommand("delete").Parameter("message", ParameterType.Multiple).Do(async e => 
{  
    if (createNotDeleted) 
    { 
     createNotDeleted = false 
     // return something indicating command is deleted 
    } 
    else 
    { 
     // error handling 
    } 
});