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