2017-04-15 8 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;

내가 어떻게 삭제할 수 있는지 알고 계십니까? 그는 봇을 다시 시작할 필요없이 명령을 내릴 수 있습니까?

답변

0

disord.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 객체가 다시 나타납니다. 즉, 사용하는 간단한 commandService.CreateCommand 메서드 대신 ModuleBuilder를 사용해야합니다. 방법을 읽어보십시오. here ... 프로세스가 여전히 혼란 스러우면 다른 질문에 대한 훌륭한 주제입니다.

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

은 전체 모듈 인스턴스가 있습니다 마십시오

당신은 CreateModuleAsync은 (내가 사용하는 것이 방법은 다음과 같습니다) 어떤 방식으로 반환 한 다음 두 번째 명령이되는 ModuleInfo 객체 추적 할 필요 삭제되는 중 ... 그 이유는 "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 
    } 
});