这是可能的,但从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
}
});