Oprettelse af en Discord-bot i .NET Core med deployment pÄ VPS-server

Oprettelse af en Discord-bot i .NET Core med deployment pÄ VPS-server

Hej, Habr-folk!

I dag vil du blive introduceret til en artikel, der beskriver, hvordan man opretter en bot ved hjÊlp af C# pÄ .NET Core, og hvordan man fÄr den til at kÞre pÄ en remote server.

Artiklen vil bestÄ af en baghistorie, forberedelsesfase, skrivning af logik og overfÞrsel af botten til den remote server.

Jeg hÄber, at denne artikel vil vÊre til hjÊlp for mange begyndere.

Background

Det hele begyndte en sÞvnlÞs efterÄrsnat, som jeg tilbragte pÄ Discord-serveren. Da jeg relativt nyligt var tilsluttet, begyndte jeg at udforske den grundigt. Jeg opdagede tekstkanalen "Jobopslag", blev interesseret, Äbnede den og fandt blandt de uinteressante forslag dette:

"Programmerer (botudvikler)
Krav:

  • kendskab til programmeringssprog;
  • evne til selvstudium.

Ønsker:

  • evne til at forstĂ„ andres kode;
  • kendskab til DISCORD-funktionaliteter.

Opgaver:

  • udvikling af bot;
  • vedligeholdelse og support af botten.

Din fordel:

  • Mulighed for at stĂžtte og pĂ„virke et interessant projekt;
  • Erhvervelse af erfaring med teamwork;
  • Mulighed for at demonstrere og forbedre eksisterende fĂŠrdigheder."


Dette fangede straks min interesse. Ja, der blev ikke betalt for dette arbejde, men der blev ikke krĂŠvet nogen forpligtelser fra dig, og det vil ikke vĂŠre skadelig for portfolioet. SĂ„ jeg skrev til serveradministratoren, og han bad mig om at skrive en bot, der ville vise statistikken for spillere i World of Tanks.

Forberedelsesfase

Oprettelse af en Discord-bot i .NET Core med deployment pÄ VPS-server
Discord
FĂžr vi kan begynde at skrive vores bot, skal vi oprette den til Discord. Du skal:

  1. Logge ind pÄ din Discord-konto via linket
  2. I fanen "Applications" klikke pÄ knappen "New Application" og navngive botten
  3. FÄ bot-tokenet ved at logge ind pÄ din bot og finde fanen "Bot" under "Settings"
  4. Gem tokenet et sted

Wargaming

Derudover skal vi oprette en applikation i Wargaming for at fÄ adgang til Wargaming API. Dette er ogsÄ enkelt:

  1. Log ind pÄ Wargaming-kontoen via dette link
  2. GÄ til "Mine applikationer" og klik pÄ knappen "TilfÞj ny applikation", giv applikationen et navn, og vÊlg dens type
  3. Gem applikationens ID

Software

Her har du allerede frihed til at vĂŠlge. Nogle bruger Visual Studio, andre Rider, og nogle er virkelig hardcore og skriver kode i Vim (rigtige programmĂžrer bruger kun tastaturet, ikke sandt?). Men for at undgĂ„ at implementere Discord API kan du bruge et uofficielt bibliotek til C# kaldet “DSharpPlus”. Det kan installeres enten fra NuGet eller ved selv at kompilere kildekoden fra depotet.

For dem, der ikke ved, eller har glemt, hvordan man installerer applikationer fra NuGet.Instruktion til Visual Studio

  1. GĂ„ til fanen Projekt – Administrer NuGet-pakker;
  2. Klik pĂ„ Gennemse, og i sĂžgefeltet indtast “DSharpPlus”;
  3. VÊlg og installér framework;
  4. PROFIT!

Forberedelsesfasen er slut, nu kan vi gÄ videre til at skrive botten.

Skrivning af logik

Oprettelse af en Discord-bot i .NET Core med deployment pÄ VPS-server

Vi vil ikke dĂŠkke hele logikken i applikationen, jeg vil kun vise, hvordan man arbejder med meddelelser, der fanges af botten, og hvordan man arbejder med Wargaming API.

Arbejdet med Discord-botten foregÄr gennem funktionen static async Task MainTask(string[] args);
For at kalde denne funktion skal du skrive i Main

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

Derefter skal du initialisere din bot:

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

Hvor token er tokenet for din bot.
Derefter skriver vi nĂždvendige kommandoer, som botten skal udfĂžre, gennem en lambda:

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

Hvor e.Author.Username er brugernavnet pÄ brugeren.

SÄ nÄr du sender en hvilken som helst besked, der begynder med &, vil botten hilse pÄ dig.

I slutningen af denne funktion skal du skrive await discord.ConnectAsync(); og await Task.Delay(-1);

Dette vil tillade, at kommandoer kÞrer i baggrunden uden at blokere hovedtrÄden.

Nu skal vi se pĂ„ Wargaming API. Her er det enkelt – skriv CURL-anmodninger, modtag svar i form af JSON-strenge, udtrĂŠk de nĂždvendige data derfra og manipulĂ©r dem.

Eksempel pÄ arbejde med 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("Spiller ikke fundet");
                }
            }
            else
            {
                string error = parsed.error.message;
                if (error == "NOT_ENOUGH_SEARCH_LENGTH")
                {
                    throw new PlayerNotFound("Minimum tre tegn krĂŠves");
                }
                else if (error == "INVALID_SEARCH")
                {
                    throw new PlayerNotFound("Ugyldig sĂžgning");
                }
                else if (error == "SEARCH_NOT_SPECIFIED")
                {
                    throw new PlayerNotFound("Tom brugernavn");
                }
                else
                {
                    throw new Exception("Noget gik galt.");
                }
            }

            return player;
        }

Advarsel! Det anbefales pÄ det kraftigste ikke at opbevare alle tokens og app-ID'er i Äbent format! I det mindste vil Discord blockere sÄdanne tokens, nÄr de kommer ud pÄ internettet, og i vÊrste fald kan botten blive udnyttet af svindlere.

Deployment pĂ„ VPS – server

Oprettelse af en Discord-bot i .NET Core med deployment pÄ VPS-server

NÄr du er fÊrdig med botten, skal den placeres pÄ en server, der kÞrer dÞgnet rundt 24/7. Dette skyldes, at nÄr din applikation kÞrer, kÞrer botten ogsÄ. SÄ snart du slukker for applikationen, gÄr din bot ogsÄ i dvale.

Der er mange VPS-servere derude, bÄde pÄ Windows og pÄ Linux, men i de fleste tilfÊlde er det langt billigere at hoste pÄ Linux.

PÄ Discord-serveren anbefalede de vscale.io til mig, sÄ jeg oprettede straks en virtuel server pÄ Ubuntu og uploadede botten. Jeg vil ikke beskrive, hvordan denne hjemmeside fungerer, men gÄr direkte til indstillingerne for botten.

FĂžrst skal du installere den nĂždvendige software, som skal kĂžre vores bot, der er skrevet i .NET Core. Hvordan du gĂžr dette, er beskrevet her.

DernĂŠst skal du uploade botten til Git – en service som GitHub og lignende, og klone den pĂ„ VPS-serveren, eller pĂ„ anden mĂ„de downloade din bot. VĂŠr opmĂŠrksom pĂ„, at du kun vil have en konsol, der vil ikke vĂŠre nogen GUI. Overhovedet.

NÄr du har downloaded din bot, skal du starte den. For dette skal du:

  • Gendanne alle afhĂŠngigheder: dotnet restore
  • Bygge applikationen: dotnet build name_project.sln -c Release
  • GĂ„ til den byggede DLL;
  • dotnet name_of_file.dll

Tillykke! Din bot er startet. DesvÊrre optager botten konsollen, og det er ikke sÄ let at lukke VPS-serveren. Derudover, hvis serveren genstartes, skal botten startes igen. Der er et par lÞsninger pÄ dette problem. Alle er relateret til at starte ved serverstart:

  • TilfĂžje scriptstart til /etc/init.d
  • Oprette en tjeneste, der starter ved opstart.

Jeg ser ikke nogen grund til at gÄ i dybden med dem; alt er tilstrÊkkeligt godt beskrevet pÄ internettet.

Konklusioner

Jeg er glad for, at jeg tog dette opdrag. Det var min fÞrste erfaring med at udvikle en bot, og jeg er glad for, at jeg har fÄet ny viden om C# og arbejde med Linux.

Link til Discord-serveren. For dem, der spiller Wargaming-spil.
Link til repository, hvor Discord-botten ligger.
Link til DSharpPlus-repository.
Tak for din opmĂŠrksomhed!

Kilde: habr.com

KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster