从DiscordBot CommandService中删除命令

时间:2017-04-15 00:35:46

标签: c# discord discord.net

我试图弄清楚如何在创建后从discord bot中删除命令。以下是我创建命令的方法:

_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;

有没有人知道如何删除命令而无需重新启动僵尸程序?

1 个答案:

答案 0 :(得分:0)

这是可能的,但是从discord.net 1.0开始,您需要使用模块系统来完成它。不幸的是,它使事情变得非常复杂。希望他们在将来的更新中添加适当的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);
    }
});

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

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

// 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
    }
});