
Hallo, Habr-Nutzer!
Heute werden Sie einen Artikel kennenlernen, in dem erklärt wird, wie man einen Bot mit C# auf .NET Core erstellt und wie man ihn auf einem Remote-Server zum Laufen bringt.
Der Artikel wird aus einer Vorgeschichte, einem Vorbereitungsschritt, der Entwicklung der Logik und der Übertragung des Bots auf den Remote-Server bestehen.
Ich hoffe, dieser Artikel wird vielen Anfängern helfen.
Hintergrund
Alles begann in einer schlaflosen Herbstnacht, die ich auf dem Discord-Server verbrachte. Da ich relativ neu war, begann ich, ihn gründlich zu erkunden. Als ich den Textkanal "Stellenangebote" entdeckte, war ich interessiert, öffnete ihn und fand unter den für mich uninteressanten Angeboten folgendes:
"Programmierer (Bot-Entwickler)
Anforderungen:
- Kenntnisse in Programmiersprachen;
- Fähigkeit zur Selbstlernfähigkeit.
Wünsche:
- Fähigkeit, sich in fremden Code einzuarbeiten;
- Kenntnisse über die Funktionen von DISCORD.
Aufgaben:
- Entwicklung des Bots;
- Unterstützung und Pflege des Bots.
Ihr Nutzen:
- Möglichkeit, ein favorisiertes Projekt zu unterstützen und Einfluss zu nehmen;
- Erwerb von Erfahrungen in der Teamarbeit;
- Möglichkeit, bestehende Fähigkeiten zu demonstrieren und zu verbessern."
Das hat sofort mein Interesse geweckt. Ja, für diese Arbeit gab es keine Bezahlung, aber es wurden keine Verpflichtungen von dir verlangt, und es schadet auch nicht, es im Portfolio zu haben. Daher habe ich den Server-Admin kontaktiert und er bat mich, einen Bot zu erstellen, der die Statistiken des Spielers in World of Tanks anzeigt.
Vorbereitungsphase

Discord
Bevor wir mit dem Schreiben unseres Bots beginnen, müssen wir ihn für Discord erstellen. Sie müssen Folgendes tun:
- In Ihr Discord-Konto einloggen
- Im Tab „Applications“ auf die Schaltfläche „New Application“ klicken und den Bot benennen
- Den Token des Bots erhalten, indem Sie zu Ihrem Bot gehen und im Bereich „Settings“ den Tab „Bot“ finden
- Den Token irgendwo sichern
Wargaming
Außerdem müssen Sie eine Anwendung bei Wargaming erstellen, um Zugriff auf die Wargaming API zu erhalten. Auch das ist ganz einfach:
- In Ihr Wargaming-Konto einloggen
- In „Meine Anwendungen“ gehen und auf die Schaltfläche „Neue Anwendung hinzufügen“ klicken, einen Namen für die Anwendung vergeben und den Typ auswählen
- Die ID der Anwendung speichern
Software
Hier haben Sie bereits die Freiheit der Wahl. Manche nutzen Visual Studio, andere Rider, wieder andere schwören ganz auf Vim und schreiben ihren Code nur mit der Tastatur (echte Programmierer verwenden schließlich nur die Tastatur, oder?). Wenn Sie jedoch die Discord-API nicht implementieren möchten, können Sie die inoffizielle C#-Bibliothek „DSharpPlus“ verwenden. Diese lässt sich entweder über NuGet installieren oder durch manuelles Zusammenstellen der Quellcodes aus dem Repository.
Für diejenigen, die nicht wissen oder vergessen haben, wie man Anwendungen aus NuGet installiert.Anleitung für Visual Studio
- Gehen Sie zur Registerkarte Projekt – NuGet-Paketverwaltung;
- Klicken Sie auf Übersicht und geben Sie im Suchfeld „DSharpPlus“ ein;
- Wählen Sie das Framework aus und installieren Sie es;
- PROFIT!
Der Vorbereitungsteil ist abgeschlossen, Sie können jetzt mit dem Schreiben des Bots beginnen.
Implementierung der Logik

Wir werden nicht die gesamte Logik der Anwendung betrachten, ich werde Ihnen nur zeigen, wie man mit der Nachrichtenüberwachung durch den Bot arbeitet und wie man mit der Wargaming-API umgeht.
Die Arbeit mit dem Discord-Bot erfolgt über die Funktion static async Task MainTask(string[] args);
Um diese Funktion aufzurufen, müssen Sie im Main Folgendes eingeben
MainTask(args).ConfigureAwait(false).GetAwaiter().GetResult();Danach müssen Sie Ihren Bot initialisieren:
discord = new DiscordClient(new DiscordConfiguration
{
Token = token,
TokenType = TokenType.Bot,
UseInternalLogHandler = true,
LogLevel = LogLevel.Debug
}); Wo token – der Token Ihres Bots.
Dann definieren wir über eine Lambda-Funktion 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("Hallo, " + e.Author.Username);
}
};
Wobei e.Author.Username – der Benutzername des Autors ist.
So wird der Bot Sie begrüßen, wenn Sie eine Nachricht senden, die mit & beginnt.
Am Ende dieser Funktion müssen Sie await discord.ConnectAsync(); und await Task.Delay(-1); hinzufügen.
Das ermöglicht die Ausführung von Befehlen im Hintergrund, ohne den Haupt-Thread zu blockieren.
Jetzt müssen wir uns mit der Wargaming API beschäftigen. Hier ist es einfach – Sie schreiben CURL-Anfragen, erhalten eine Antwort im JSON-Format, extrahieren die notwendigen Daten und führen Manipulationen daran durch.
Beispiel für die Arbeit mit der 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("Spieler nicht gefunden");
}
}
else
{
string error = parsed.error.message;
if (error == "NOT_ENOUGH_SEARCH_LENGTH")
{
throw new PlayerNotFound("Mindestens drei Zeichen erforderlich");
}
else if (error == "INVALID_SEARCH")
{
throw new PlayerNotFound("Ungültige Suche");
}
else if (error == "SEARCH_NOT_SPECIFIED")
{
throw new PlayerNotFound("Leerer Nickname");
}
else
{
throw new Exception("Etwas ist schief gelaufen.");
}
}
return player;
}
Achtung! Das Speichern von Tokens und Anwendungs-IDs im Klartext wird dringend nicht empfohlen! Zumindest – Discord sperrt solche Tokens, wenn sie ins Internet gelangen; im schlimmsten Fall wird der Bot von Angreifern missbraucht.
Deployment auf VPS – Server

Nachdem Sie mit dem Bot fertig sind, müssen Sie ihn auf einem Server hosten, der rund um die Uhr verfügbar ist. Das liegt daran, dass Ihr Bot nur funktioniert, wenn Ihre Anwendung läuft. Sobald Sie die Anwendung ausschalten, schläft auch Ihr Bot ein.
Es gibt viele VPS-Server auf dieser Welt, sowohl auf Windows als auch auf Linux, jedoch ist es in den meisten Fällen deutlich günstiger, auf Linux zu hosten.
Auf dem Discord-Server wurde mir vscale.io empfohlen, also habe ich sofort einen virtuellen Server auf Ubuntu erstellt und den Bot hochgeladen. Ich werde nicht beschreiben, wie die Website funktioniert, sondern direkt zur Konfiguration des Bots übergehen.
Zuerst müssen Sie die erforderliche Software installieren, die unseren auf .NET Core geschriebenen Bot ausführt. .
Als Nächstes müssen Sie den Bot auf Git, einen Dienst wie GitHub und ähnliche, hochladen und auf den VPS-Server klonen oder Ihren Bot auf andere Weise herunterladen. Beachten Sie, dass Sie nur über die Konsole verfügen werden, eine grafische Benutzeroberfläche (GUI) wird nicht vorhanden sein.
Nachdem Sie Ihren Bot heruntergeladen haben, müssen Sie ihn starten. Dazu müssen Sie:
- Alle Abhängigkeiten wiederherstellen: dotnet restore
- Die Anwendung erstellen: dotnet build name_project.sln -c Release
- Zur erstellten DLL wechseln;
- dotnet name_of_file.dll
Herzlichen Glückwunsch! Ihr Bot läuft. Allerdings belegt der Bot leider die Konsole, und es ist nicht einfach, sich vom VPS-Server abzumelden. Zudem müssen Sie den Bot nach einem Neustart des Servers erneut starten. Hier gibt es einige Lösungen für dieses Problem. Alle stehen im Zusammenhang mit dem Starten beim Serverstart:
- Den Start des Skripts in /etc/init.d hinzufügen
- Einen Dienst erstellen, der beim Starten ausgeführt wird.
Ich sehe keinen Sinn darin, ausführlich darauf einzugehen; alles ist ausreichend detailliert im Internet beschrieben.
Fazit
Ich freue mich, dass ich mich dieser Aufgabe gewidmet habe. Es war mein erster Versuch, einen Bot zu entwickeln, und ich bin froh, neue Kenntnisse in C# und im Umgang mit Linux gewonnen zu haben.
Link zum Discord-Server.
Vielen Dank für Ihre Aufmerksamkeit!
Quelle: habr.com
