2016-04-10 10 views
2

Coding ein Bot für Discord und wollen es einfacher zu debuggen, wenn Fehler.Brauchen Sie Hilfe bei der Konvertierung in die Mehrklassenhierarchie

Ich möchte nehmen diese

private static void Main(string[]) args) 
{ 
    var client = new DiscordClient(); 
    client.Connect(" "); 
    var commands = new client.Services.Get<CommandService>(); 
    commands.CreateCommand("test") 
     .Description("This is a test command.") 
     .Do(async e => 
      { 
       await e.Channel.SendMessage("Test Successful!"); 
      }); 
} 

und, wenn möglich, machen es so jeder Befehl seine eigene Klassendatei hat, so dass es etwas ist, wie diese

namespace Console.scripts 
{ 
    class test 
    { 
     commands.CreateCommand("test") 
      .Description("This is a test command.) 
      .Do(async e => 
       { 
        await e.Channel.SendMessage("Test Successful!"); 
       }); 
    } 
} 

Ich habe nie gut mit Multiclasses, sogar ein Beispiel für etwas Ähnliches würde helfen.

Antwort

1

Sie könnten eine Schnittstelle IDiscordCommand mit einem Namen, einer Beschreibung und einer Methode erstellen, die den Befehl ausführt.

public interface IDiscordCommand 
{ 
    string Name { get; set; } 
    string Description { get; set; } 
    void Run(CommandEventArgs e); 
} 

Eine Implementierung Probe wäre

public class TestCommand : IDiscordCommand 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 

    public void Run(CommandEventArgs e) 
    { 
     e.Channel.SendMessage("Test"); 
    } 
} 

Dann auf dem Programm, das Sie zur Verfügung eine Liste mit allen Befehlen erstellen können, und foreach Befehl mit den CommandService wie diese von

public class Program 
{ 
    static void Main(string[] args) 
    { 
     var client = new DiscordClient(); 
     client.Connect(" "); 

     RegisterCommands(client.Services.Get<CommandService>()); 
    } 

    public static void RegisterCommands(CommandService commandService) 
    { 
     var commands = new List<IDiscordCommand>(); 
     commands.Add(new TestCommand()); 

     foreach (var command in commands) 
     { 
      commandService.CreateCommand(command.Name) 
       .Description(command.Description) 
       .Do(command.Run); 
     } 
    } 
} 
+0

registrieren mein Verständnis derzeit würde ich das CommandEventArgs-Ereignis verwenden, aber ich habe ein Problem in der Zeile ".Do (command.Run);" "Diese asynchrone Methode hat keine 'Warte' -Operatoren und wird synchron ausgeführt." "Nur Anweisung, Aufruf, Inkrement, Dekrement und neue Objektausdrücke können als Anweisung verwendet werden". Notiz bearbeitet die Zeile zu ".Do (async e => command.Run);" – TehPirate

+0

Fügen Sie dann in der Befehlsklasse (in diesem Fall 'TestCommand')' Async' zur 'Run'-Methodensignatur hinzu. Wechseln Sie dann zu '.Do (async e => erwarte Befehl.Run (e));'. – BrunoLM

+0

Async wird als unbekannte Methode angezeigt, wenn sie außerhalb des SDK angewendet wird. – TehPirate

Verwandte Themen