Erstellung eines Discord-bot auf .NET Core mit Bereitstellung auf einem VPS-Server



Hallo Khabrovchans!

Heute lesen Sie einen Artikel, in dem erklärt wird, wie Sie einen Bot mit C # unter .NET Core erstellen und auf einen Remote-Server übertragen.

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

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

Hintergrund


Alles begann in einer schlaflosen Herbstnacht, die ich auf dem Discord-Server verbracht habe. Da ich vor relativ kurzer Zeit zu ihm kam, begann ich ihn von oben bis unten zu studieren. Nachdem ich den Textkanal „Jobs“ gefunden hatte, wurde ich interessiert, öffnete ihn und fand unter den Vorschlägen, die für mich nicht interessant waren:

"Programmierer (Bot-Entwickler)
Anforderungen:

  • Kenntnisse in Programmiersprachen;
  • Selbstlernfähigkeit.

Wünsche:

  • Fähigkeit, den Code eines anderen zu verstehen;
  • Kenntnis der Funktionsweise von DISCORD.

Aufgaben:

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

Ihr Nutzen:

  • Die Fähigkeit, das von Ihnen gewünschte Projekt zu unterstützen und zu beeinflussen;
  • Sammeln von Teamerfahrung;
  • Eine Gelegenheit, vorhandene Fähigkeiten zu demonstrieren und zu verbessern. “


Es hat mich sofort interessiert. Ja, sie haben nicht für diese Arbeit bezahlt, aber sie haben keine Verpflichtungen von Ihnen gefordert, und dies wird im Portfolio nicht überflüssig sein. Also schrieb ich an den Serveradministrator und er bat mich, einen Bot zu schreiben, der Spielerstatistiken in World of Tanks anzeigt.

Vorbereitungsphase



Discrod
Bevor Sie beginnen, unseren Bot zu schreiben, müssen Sie ihn für Discord erstellen. Sie müssen:

  1. Melden Sie sich bei Discord an
  2. Klicken Sie auf der Registerkarte "Anwendungen" auf die Schaltfläche "Neue Anwendung" und benennen Sie den Bot
  3. Holen Sie sich das Bot-Token, indem Sie sich bei Ihrem Bot anmelden und in der Liste "Einstellungen" die Registerkarte "Bot" finden
  4. Token irgendwo speichern

Wargaming

Sie müssen auch eine Anwendung in Wargaming erstellen, um auf die Wargaming-API zugreifen zu können. Auch hier ist alles einfach:

  1. Über diesen Link gelangen wir zum Wargaming-Konto
  2. Gehen Sie zu "Meine Anwendungen" und klicken Sie auf die Schaltfläche "Neue Anwendung hinzufügen", geben Sie den Namen der Anwendung an und wählen Sie ihren Typ aus
  3. Speichern Sie die Anwendungs-ID

Software

Es gibt bereits Wahlfreiheit. Jemand benutzt Visual Studio, jemand Rider, jemand ist im Allgemeinen mächtig und schreibt Code in Vim (echte Programmierer benutzen immer noch nur die Tastatur, oder?). Um die Discord-API jedoch nicht zu implementieren, können Sie die inoffizielle C # -Bibliothek „DSharpPlus“ verwenden. Es kann entweder von NuGet aus installiert werden oder indem Sie die Quelle selbst aus dem Repository abrufen.

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 Package Management.
  2. Klicken Sie auf die Überprüfung und geben Sie "DSharpPlus" in das Suchfeld ein.
  3. Wir wählen und installieren das Framework.
  4. GEWINN!


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

Rechtschreiblogik




Wir werden nicht die gesamte Logik der Anwendung betrachten, sondern 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 Funktion static async Task 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 durch 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); } }; 

Where e.Author.Username - Abrufen des Benutzernamens.

Wenn Sie also eine Nachricht senden, die mit & beginnt, heißt Sie der Bot willkommen.

Am Ende dieser Funktion müssen Sie sich registrieren, bis discord.ConnectAsync (); und warten auf Task.Delay (-1);

Auf diese Weise können Sie Befehle im Hintergrund ausführen, ohne den Hauptthread zu belegen.

Nun müssen Sie sich mit der Wargaming-API befassen. Hier ist alles einfach - schreiben Sie CURL-Anforderungen, erhalten Sie die Antwort in Form von JSON-Zeichenfolgen, ziehen Sie die erforderlichen Daten von dort heraus und nehmen Sie Manipulationen an ihnen vor.

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


Achtung! Es wird dringend davon abgeraten, alle Token und Anwendungs-IDs im Klartext zu speichern! Zumindest - Discord verbietet diese Token, wenn sie das weltweite Netzwerk erreichen, maximal - der Bot beginnt, böswillige Benutzer zu verwenden.

Auf dem VPS-Server bereitstellen




Nachdem Sie mit dem Bot fertig sind, müssen Sie ihn auf einen Server stellen, der ständig rund um die Uhr läuft. Dies liegt an der Tatsache, dass der Bot auch funktioniert, wenn Ihre Anwendung funktioniert. Sobald Sie die Anwendung ausschalten, schläft Ihr Bot ein.

Auf dieser Welt gibt es viele VPS-Server, sowohl unter Windows als auch unter Linux. In den meisten Fällen ist Linux jedoch um ein Vielfaches günstiger zu hosten.

Auf dem Discord-Server wurde ich von vscale.io beraten, und ich habe auf Ubuntu sofort einen virtuellen Server darauf erstellt und den Bot hochgeladen. Ich werde nicht beschreiben, wie diese Seite funktioniert, aber ich werde sofort mit den Bot-Einstellungen fortfahren.

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

Als Nächstes müssen Sie den Bot auf einen Git-Dienst wie GitHub und dergleichen hochladen und auf einen VPS-Server klonen oder Ihren Bot auf andere Weise herunterladen. Beachten Sie, dass Sie nur eine Konsole haben, es wird keine GUI geben. Absolut.

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

  • Stellen Sie alle Abhängigkeiten wieder her: dotnet restore
  • Build-Anwendung: dotnet build name_project.sln -c Release
  • Wechseln Sie zu der erstellten DLL.
  • dotnet name_of_file.dll

Herzlichen Glückwunsch! Dein Bot läuft. Leider belegt der Bot die Konsole und es wird nicht einfach sein, den VPS-Server zu verlassen. Im Falle eines Neustarts des Servers müssen Sie den Bot erneut starten. Es gibt ein paar Möglichkeiten, aus der Situation herauszukommen. Alle von ihnen beziehen sich auf den Start beim Serverstart:

  • Skriptlauf zu /etc/init.d hinzufügen
  • Erstellen Sie einen Dienst, der beim Start gestartet wird.

Ich sehe keinen Sinn darin, sie zu beschreiben, alles ist im Internet ausreichend detailliert beschrieben.

Schlussfolgerungen


Ich bin froh, dass ich diesen Auftrag angenommen habe. Dies war meine erste Erfahrung in der Bot-Entwicklung, und ich bin froh, dass ich neue Kenntnisse in C # und in 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.
Vielen Dank für Ihre Aufmerksamkeit!

Source: https://habr.com/ru/post/de479180/


All Articles