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