Het maken van een Discord-bot op .NET Core met deployment op een VPS-server

Het maken van een Discord-bot op .NET Core met deployment op een VPS-server

Hallo, Habr-lezers!

Vandaag zult u kennismaken met een artikel waarin wordt uitgelegd hoe u een bot kunt maken met C# op .NET Core en hoe u deze op een externe server kunt draaien.

Het artikel zal bestaan uit de achtergrond, de voorbereidende fase, het schrijven van de logica en het verplaatsen van de bot naar de externe server.

Ik hoop dat dit artikel veel beginners zal helpen.

Achtergrond

Het begon op een slapeloze herfstnacht die ik doorbracht op Discord – de server. Omdat ik er pas relatief recent bij was gekomen, begon ik deze van boven tot onder te bestuderen. Toen ik het tekstkanaal "Vacatures" ontdekte, werd ik nieuwsgierig, opende het en vond tussen de niet-interessante aanbiedingen het volgende:

"Programmeur (botontwikkelaar)
Vereisten:

  • kennis van programmeertalen;
  • zelflerend vermogen.

Wensen:

  • in staat zijn om in andermans code te begrijpen;
  • kennis van de functionaliteit van DISCORD.

Taken:

  • het ontwikkelen van een bot;
  • ondersteuning en onderhoud van de bot.

Uw voordelen:

  • De mogelijkheid om een aantrekkelijk project te ondersteunen en te beïnvloeden;
  • Verkrijgen van ervaring in teamwerk;
  • De mogelijkheid om uw bestaande vaardigheden te demonstreren en te verbeteren."


Dit trok onmiddellijk mijn aandacht. Ja, voor dit werk werd niet betaald, maar er werden ook geen verplichtingen van je verwacht, en het zou niet slecht zijn voor mijn portfolio. Dus schreef ik de serverbeheerder, en hij vroeg me een bot te schrijven die de statistieken van een speler in World of Tanks zou tonen.

Om ervoor te zorgen dat het testen van lokalisatie soepel verloopt, moet je je goed voorbereiden.

Het maken van een Discord-bot op .NET Core met deployment op een VPS-server
Discord
Voordat we beginnen met het schrijven van onze bot, moet deze worden gemaakt voor Discord. U heeft nodig:

  1. Inloggen op uw Discord-account. via de link
  2. In het tabblad "Applications" op de knop "New Application" klikken en de bot een naam geven.
  3. Een token voor de bot verkrijgen door in te loggen op uw bot en in de lijst onder "Settings" het tabblad "Bot" te vinden.
  4. Bewaar het token ergens.

Wargaming

Daarnaast moet u een applicatie in Wargaming aanmaken om toegang te krijgen tot de Wargaming API. Ook dit is eenvoudig:

  1. Log in op uw Wargaming-account. Via deze link.
  2. Ga naar "Mijn applicaties" en klik op de knop "Nieuwe applicatie toevoegen", geef de applicatie een naam en kies het type.
  3. Bewaar de applicatie-ID.

Software

Hier is er al vrijheid van keuze. Iemand gebruikt Visual Studio, iemand anders Rider, en weer iemand schrijft zelfs krachtige code in Vim (echt, echte programmeurs gebruiken alleen de toetsenbord, toch?). Om de Discord API niet zelf te implementeren, kun je de ongeofficiale bibliotheek voor C# “DSharpPlus” gebruiken. Deze kan je installeren via NuGet of zelf de broncode van de repository samenstellen.

Voor degenen die niet weten, of vergeten zijn, hoe je applicaties installeert via NuGet.Instructies voor Visual Studio

  1. Ga naar het tabblad Project – NuGet-pakketbeheer;
  2. Klik op verkennen en voer in het zoekveld “DSharpPlus” in;
  3. Kies en installeer het framework;
  4. WINST!

De voorbereidende stap is voltooid, nu kunnen we beginnen met het schrijven van de bot.

Logica schrijven

Het maken van een Discord-bot op .NET Core met deployment op een VPS-server

We zullen niet alle logica van de applicatie bekijken, ik laat je alleen zien hoe je berichten kunt onderscheppen met de bot en hoe je met de Wargaming API werkt.

De interactie met de Discord bot gebeurt via de functie static async Task MainTask(string[] args);
Om deze functie aan te roepen, moet je in Main het volgende schrijven

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

Daarna moet je je bot initialiseren:

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

Waar token – de token van je bot.
Vervolgens, via een lambda, definiëren we de benodigde commando's die de bot moet uitvoeren:

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

Waar e.Author.Username – het verkrijgen van de gebruikersnaam.

Dus wanneer je een bericht verstuurt dat begint met &, zal de bot je begroeten.

Aan het einde van deze functie moet je await discord.ConnectAsync(); en await Task.Delay(-1); toevoegen.

Dit zal ervoor zorgen dat commando's op de achtergrond worden uitgevoerd zonder de hoofdthread te blokkeren.

Nu moeten we ons verdiepen in de Wargaming API. Dit is eenvoudig – je schrijft CURL-verzoeken, krijgt als antwoord een JSON-reeks – haalt de benodigde gegevens daaruit en voert bewerkingen uit.

Voorbeeld van werken met 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("Speler niet gevonden");
                }
            }
            else
            {
                string error = parsed.error.message;
                if (error == "NOT_ENOUGH_SEARCH_LENGTH")
                {
                    throw new PlayerNotFound("Minimaal drie tekens vereist");
                }
                else if (error == "INVALID_SEARCH")
                {
                    throw new PlayerNotFound("Ongeldige zoekopdracht");
                }
                else if (error == "SEARCH_NOT_SPECIFIED")
                {
                    throw new PlayerNotFound("Leeg bijnaam");
                }
                else
                {
                    throw new Exception("Er is iets misgegaan.");
                }
            }

            return player;
        }

Let op! Het wordt ten zeerste afgeraden om alle tokens en app IDs openbaar op te slaan! Tenminste – Discord blokkeert dergelijke tokens wanneer deze op het wereldwijde netwerk verschijnen, en het ergste geval – de bot kan door kwaadwillenden worden overgenomen.

Deploy op VPS - server

Het maken van een Discord-bot op .NET Core met deployment op een VPS-server

Nadat je klaar bent met de bot, moet deze op een server worden geplaatst die voortdurend 24/7 draait. Dit is omdat wanneer je applicatie draait, de bot ook draait. Zodra je de applicatie uitschakelt, gaat je bot in slaapstand.

Er zijn veel VPS-servers op deze wereld, zowel op Windows als op Linux, maar in de meeste gevallen is het veel goedkoper om op Linux te hosten.

Op de Discord-server raadde iemand vscale.io aan, en ik creëerde onmiddellijk een virtuele server op Ubuntu en uploadde de bot. Ik zal niet beschrijven hoe deze site werkt, maar ga direct door naar de botinstellingen.

Allereerst moet je de nodige software installeren die onze bot, geschreven in .NET Core, zal uitvoeren. Hoe je dit doet, is hier beschreven.

Vervolgens moet je de bot uploaden naar Git - een service zoals GitHub en dergelijke, en deze op de VPS-server klonen, of op andere manieren je bot downloaden. Houd er rekening mee dat je alleen een console zult hebben, er zal geen GUI zijn. Helemaal niet.

Nadat je je bot hebt gedownload, moet je hem starten. Hiervoor moet je:

  • Alle afhankelijkheden herstellen: dotnet restore
  • De applicatie bouwen: dotnet build name_project.sln -c Release
  • Naar de gebouwde DLL gaan;
  • dotnet name_of_file.dll

Gefeliciteerd! Je bot is gestart. Helaas neemt de bot de console over, en het is niet eenvoudig om de VPS-server te verlaten. Bovendien moet je de bot opnieuw starten in het geval van een herstart van de server. Er zijn een paar oplossingen voor deze situatie. Ze zijn allemaal gerelateerd aan het starten bij het opstarten van de server:

  • Voeg het script toe aan /etc/init.d
  • Maak een service die bij het opstarten wordt gestart.

Ik zie geen nut in een uitgebreide uitleg hierover, alles is voldoende gedetailleerd beschreven op internet.

Conclusies

Ik ben blij dat ik deze opdracht heb aangenomen. Het was mijn eerste ervaring met het ontwikkelen van een bot, en ik ben blij dat ik nieuwe kennis heb opgedaan over C# en het werken met Linux.

Link naar de Discord-server. Voor degenen die Wargaming-spellen spelen.
Link naar de repository met de Discord-bot.
Link naar de DSharpPlus repository.
Bedankt voor uw aandacht!

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster