Erstellen eines Discord-Bots auf .NET Core mit Bereitstellung auf einem VPS-Server

Erstellen eines Discord-Bots auf .NET Core mit Bereitstellung auf einem VPS-Server

Hallo Chabrowiten!

Heute sehen Sie einen Artikel, der Ihnen zeigt, wie Sie mit C# auf .NET Core einen Bot erstellen und ihn auf einem Remote-Server ausführen.

Der Artikel besteht aus einem Hintergrund, einer Vorbereitungsphase, dem Schreiben von Logik und der Übertragung des Bots auf einen Remote-Server.

Ich hoffe, dieser Artikel wird vielen Anfängern helfen.

Vorgeschichte

Alles begann in einer schlaflosen Herbstnacht, die ich auf dem Discord-Server verbrachte. Seit ich vor kurzem zu ihm kam, begann ich, ihn von Grund auf zu studieren. Nachdem ich den Textkanal „Stellenangebote“ gefunden hatte, wurde ich interessiert, öffnete ihn und fand unter den Angeboten, die mich nicht interessierten, diese:

„Programmierer (Bot-Entwickler)
Anforderungen:

  • Kenntnisse in Programmiersprachen;
  • Fähigkeit zum Selbstlernen.

Пожелания:

  • Fähigkeit, den Code anderer Leute zu verstehen;
  • Kenntnisse der DISCORD-Funktionalität.

Ziele:

  • Bot-Entwicklung;
  • Support und Wartung des Bots.

Ihr Vorteil:

  • Möglichkeit, das Projekt, das Ihnen gefällt, zu unterstützen und zu beeinflussen;
  • Erfahrungen in der Teamarbeit sammeln;
  • Möglichkeit, vorhandene Fähigkeiten unter Beweis zu stellen und zu verbessern.


Das hat mich sofort interessiert. Ja, sie haben diese Arbeit nicht bezahlt, aber sie haben von Ihnen keine Verpflichtungen verlangt, und sie wird im Portfolio nicht überflüssig sein. Deshalb habe ich an den Serveradministrator geschrieben und er hat mich gebeten, einen Bot zu schreiben, der die Statistiken des Spielers in World of Tanks anzeigt.

Die Vorbereitungsphase

Erstellen eines Discord-Bots auf .NET Core mit Bereitstellung auf einem VPS-Server
Scheibe
Bevor wir mit dem Schreiben unseres Bots beginnen, müssen wir ihn für Discord erstellen. Du brauchst:

  1. Melden Sie sich beim Discord-Konto an Link
  2. Klicken Sie im Reiter „Anwendungen“ auf die Schaltfläche „Neue Anwendung“ und benennen Sie den Bot
  3. Erhalten Sie ein Bot-Token, indem Sie sich bei Ihrem Bot anmelden und in der Liste „Einstellungen“ die Registerkarte „Bot“ finden
  4. Bewahren Sie den Token irgendwo auf

Wargaming

Außerdem müssen Sie eine Anwendung in Wargaming erstellen, um Zugriff auf die Wargaming-API zu erhalten. Auch hier ist alles einfach:

  1. Melden Sie sich bei Ihrem Wargaming-Konto an über diesen Link
  2. Wir gehen zu „Meine Bewerbungen“ und klicken auf die Schaltfläche „Neue Bewerbung hinzufügen“, geben den Namen der Bewerbung ein und wählen ihren Typ aus
  3. Speichern der Anwendungs-ID

Software

Es gibt bereits Wahlfreiheit. Jemand verwendet Visual Studio, jemand Rider, jemand ist im Allgemeinen mächtig und schreibt Code in Vim (echte Programmierer verwenden schließlich nur die Tastatur, oder?). Um die Discord-API jedoch nicht zu implementieren, können Sie die inoffizielle C#-Bibliothek „DSharpPlus“ verwenden. Sie können es entweder über NuGet installieren oder indem Sie die Quellen selbst aus dem Repository erstellen.

Für diejenigen, die nicht wissen oder vergessen haben, wie man Anwendungen von NuGet installiert.Anleitung für Visual Studio

  1. Gehen Sie zur Registerkarte Projekt – NuGet-Pakete verwalten;
  2. Klicken Sie auf die Rezension und geben Sie im Suchfeld „DSharpPlus“ ein;
  3. Framework auswählen und installieren;
  4. Gewinn!

Die Vorbereitungsphase ist abgeschlossen, Sie können mit dem Schreiben des Bots fortfahren.

Logik schreiben

Erstellen eines Discord-Bots auf .NET Core mit Bereitstellung auf einem VPS-Server

Wir werden nicht die gesamte Logik der Anwendung betrachten, ich werde nur zeigen, wie man mit dem Abfangen von Nachrichten durch den Bot arbeitet und wie man mit der Wargaming-API arbeitet.

Die Arbeit mit dem Discord-Bot erfolgt über die statische asynchrone Aufgabe MainTask(string[] args);
Um diese Funktion aufzurufen, müssen Sie sich in Main registrieren

MainTask(args).ConfigureAwait(false).GetAwaiter().GetResult();

Als nächstes müssen Sie Ihren Bot initialisieren:

discord = new DiscordClient(new DiscordConfiguration
{
    Token = token,
    TokenType = TokenType.Bot,
    UseInternalLogHandler = true,
    LogLevel = LogLevel.Debug
});

Wobei token das Token Ihres Bots ist.
Dann schreiben wir über das Lambda die notwendigen Befehle, die der Bot ausführen soll:

discord.MessageCreated += async e =>
{
    string message = e.Message.Content;
    if (message.StartsWith("&"))
    {
        await e.Message.RespondAsync(“Hello, ” + e.Author.Username);
    }
};

Wobei e.Author.Username den Spitznamen des Benutzers erhält.

Auf diese Weise werden Sie vom Bot begrüßt, wenn Sie eine Nachricht senden, die mit & beginnt.

Am Ende dieser Funktion müssen Sie „await discord.ConnectAsync();“ schreiben. und warte auf Task.Delay(-1);

Dadurch können Sie Befehle im Hintergrund ausführen, ohne den Hauptthread zu beanspruchen.

Jetzt müssen wir uns mit der Wargaming-API befassen. Hier ist alles einfach: CURL-Anfragen schreiben, eine Antwort in Form eines JSON-Strings erhalten, die erforderlichen Daten von dort abrufen und Manipulationen daran vornehmen.

Ein Beispiel für die Arbeit mit WargamingAPI

public Player FindPlayer(string searchNickname)
        {
            //https://api.worldoftanks.ru/wot/account/list/?application_id=y0ur_a@@_id_h3r3search=nickname
            urlRequest = resourceMan.GetString("url_find_player") + appID + "&search=" + searchNickname;
            Player player = null;
            string resultResponse = GetResponse(urlRequest);
            dynamic parsed = JsonConvert.DeserializeObject(resultResponse);

            string status = parsed.status;
            if (status == "ok")
            {
                int count = parsed.meta.count;
                if (count > 0)
                {
                    player = new Player
                    {
                        Nickname = parsed.data[0].nickname,
                        Id = parsed.data[0].account_id
                    };
                }
                else
                {
                    throw new PlayerNotFound("Игрок не найден");
                }
            }
            else
            {
                string error = parsed.error.message;
                if (error == "NOT_ENOUGH_SEARCH_LENGTH")
                {
                    throw new PlayerNotFound("Минимум три символа требуется");
                }
                else if (error == "INVALID_SEARCH")
                {
                    throw new PlayerNotFound("Неверный поиск");
                }
                else if (error == "SEARCH_NOT_SPECIFIED")
                {
                    throw new PlayerNotFound("Пустой никнейм");
                }
                else
                {
                    throw new Exception("Something went wrong.");
                }
            }

            return player;
        }

Aufmerksamkeit! Es wird dringend davon abgeraten, alle Token und Anwendungs-IDs im Klartext zu speichern! Zumindest verbietet Discord solche Token, wenn sie in das weltweite Netzwerk gelangen, und höchstens beginnt der Bot, von Angreifern genutzt zu werden.

Auf dem VPS-Server bereitstellen

Erstellen eines Discord-Bots auf .NET Core mit Bereitstellung auf einem VPS-Server

Sobald Sie mit dem Bot fertig sind, muss er auf einem Server gehostet werden, der rund um die Uhr läuft. Dies liegt daran, dass, wenn Ihre Anwendung ausgeführt wird, auch der Bot ausgeführt wird. Sobald Sie die Anwendung ausschalten, schläft auch Ihr Bot ein.

Es gibt viele VPS-Server auf der Welt, sowohl unter Windows als auch unter Linux. In den meisten Fällen ist es jedoch viel günstiger, sie unter Linux zu hosten.

Auf dem Discord-Server wurde mir vscale.io empfohlen, und ich habe darauf sofort einen virtuellen Server auf Ubuntu erstellt und den Bot hochgeladen. Ich werde nicht beschreiben, wie diese Seite funktioniert, sondern gehe direkt zu den Bot-Einstellungen.

Zunächst müssen Sie die erforderliche Software installieren, mit der unser in .NET Core geschriebener Bot ausgeführt werden kann. Wie das geht, ist hier beschrieben.

Als Nächstes müssen Sie den Bot auf einen Git-Dienst wie GitHub und dergleichen hochladen und ihn auf einen VPS-Server klonen oder Ihren Bot auf andere Weise herunterladen. Bitte beachten Sie, dass Sie nur eine Konsole und keine GUI haben. Überhaupt.

Nachdem Sie Ihren Bot heruntergeladen haben, müssen Sie ihn ausführen. Dazu benötigen Sie:

  • Alle Abhängigkeiten wiederherstellen: Dotnet Restore
  • Build-Anwendung: dotnet build name_project.sln -c Release
  • Gehen Sie zur erstellten DLL;
  • dotnet name_of_file.dll

Glückwunsch! Ihr Bot läuft. Allerdings belegt der Bot leider die Konsole und es ist nicht einfach, den VPS-Server zu verlassen. Außerdem müssen Sie den Bot im Falle eines Serverneustarts neu starten. Es gibt mehrere Auswege aus der Situation. Sie alle beziehen sich auf den Start beim Serverstart:

  • Fügen Sie das Ausführungsskript zu /etc/init.d hinzu
  • Erstellen Sie einen Dienst, der beim Start ausgeführt wird.

Ich sehe keinen Sinn darin, näher darauf einzugehen, im Internet ist alles ausführlich genug beschrieben.

Befund

Ich bin froh, dass ich diese Aufgabe übernommen habe. Dies war meine erste Erfahrung in der Bot-Entwicklung und ich bin froh, dass ich neue Kenntnisse in C# und der Arbeit mit Linux erworben habe.

Link zum Discord-Server. Für diejenigen, die Wargaming-Spiele spielen.
Link zum Repository, in dem sich der Discord-Bot befindet.
Link zum DSharpPlus-Repository.
Danke!

Source: habr.com

Kommentar hinzufügen