2017-04-15 104 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 
    } 
});