2017-04-15 2 views
1

Ich versuche herauszufinden, wie man einen Befehl aus dem Diskord Bot entfernt, nachdem er erstellt wurde. Hier ist, wie ich den Befehl erstellen:Einen Befehl von DiscordBot CommandService entfernen

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

Das _commandService Objekt vom Typ ist Discord.Commands.CommandService

Jetzt will ich laufen können:

_commandService.CreateCommand("delete").Parameter("message", ParameterType.Multiple).Do(async e => 
{  
    _commandService.DeleteCommand("hello"); 
}); 

jedoch kein solches Verfahren existiert, noch kann ich auf die Befehle innerhalb _commandService Objekt zugreifen, da alles nur lesbar ist get;

Weiß jemand, wie ich t löschen kann er Befehl, ohne den Bot neu starten zu müssen?

Antwort

0

Es ist möglich, aber ab discord.net 1.0 müssen Sie das Module-System verwenden, um es zu tun. Leider kompliziert es die Dinge sehr. Hoffentlich fügen sie in einem zukünftigen Update ein richtiges DeleteCommand(string commandName) hinzu.

Warum müssen Sie diesen (diesen Abschnitt nicht erforderlich, wenn Sie nicht über die discord.net Quelle egal) tun: Die Klasse commandMap (es speichert die Befehle, wenig überraschend) stellt eine Methode RemoveCommand das, was tut du willst es machen. Der einzige Verweis auf ein Objekt dieser Klasse in der Quelle befindet sich in der privaten Methode RemoveModuleInternal in CommandService. Dies wird in einer von zwei öffentlichen Methoden angezeigt: RemoveModuleAsync(ModuleInfo module) oder RemoveModuleAsync<T>(). Es gibt keine andere Möglichkeit, Befehle ab Version 1.0 zu beeinflussen.

Vorgehensweise: Rufen Sie zuerst das ModuleInfo-Objekt für Ihr Modul ab. Vorzugsweise enthält das von Ihnen erstellte Modul nur den Befehl, den Sie löschen möchten, aus Gründen, die schon bald offensichtlich sein sollten. Wenn Sie CreateModuleAsync(string primaryAlias, Action<ModuleBuilder> buildFunc) (oder eine der anderen Methoden zum Hinzufügen von Modulen) verwenden, erhalten Sie das ModuleInfo-Objekt zurück. Dies bedeutet, dass Sie anstelle der einfachen commandService.CreateCommand-Methode, die Sie verwenden, einen ModuleBuilder verwenden müssen. Lesen Sie, wie man das macht here ... wenn der Prozess Sie immer noch verwirrt, ist es ein ausgezeichnetes Thema für eine andere Frage.

Sie müssen den Überblick über die Module Objekt zu halten, die CreateModuleAsync in irgendeiner Weise zurückgibt (die Methode, die ich unter verwenden würde) und dann zweite Befehl wird:

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

Sie beachten Sie, dass das gesamte Modul-Instanz gelöscht werden ... deshalb sollte dein "create" -Befehl das einzige Ding sein.

Eine alternative Lösung (obwohl wesentlich weniger elegant), wenn dieses ganze Modulgeschäft zu kompliziert scheint, würde sein, einen boolean zu speichern und es einfach zu schalten, um das Löschen des Befehls zu simulieren. Das heißt:

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

}); 

und

_commandService.CreateCommand("delete").Parameter("message", ParameterType.Multiple).Do(async e => 
{  
    if (createNotDeleted) 
    { 
     createNotDeleted = false 
     // return something indicating command is deleted 
    } 
    else 
    { 
     // error handling 
    } 
}); 
Verwandte Themen