Opprette en Discord-bot på .NET Core med distribusjon til en VPS-server

Opprette en Discord-bot på .NET Core med distribusjon til en VPS-server

Hei Khabroviter!

I dag vil du se en artikkel som viser deg hvordan du lager en bot ved hjelp av C# på .NET Core og hvordan du kjører den på en ekstern server.

Artikkelen vil bestå av en bakgrunn, et forberedende stadium, skrivelogikk og overføring av boten til en ekstern server.

Jeg håper denne artikkelen vil hjelpe mange nybegynnere.

forhistorie

Det hele startet på en søvnløs høstnatt jeg tilbrakte på Discord-serveren. Siden jeg nylig ble med ham, begynte jeg å studere ham opp og ned. Etter å ha funnet tekstkanalen "Ledige stillinger", ble jeg interessert, åpnet den og fant blant tilbudene som ikke interesserte meg, disse er:

"Programmer (botutvikler)
krav:

  • kunnskap om programmeringsspråk;
  • evne til selvlæring.

Пожелания:

  • evne til å forstå andres kode;
  • kunnskap om DISCORD-funksjonalitet.

mål:

  • bot utvikling;
  • støtte og vedlikehold av boten.

Din fordel:

  • Mulighet til å støtte og påvirke prosjektet du liker;
  • Få erfaring med å jobbe i team;
  • Mulighet til å demonstrere og forbedre eksisterende ferdigheter.


Dette interesserte meg umiddelbart. Ja, de betalte ikke for dette arbeidet, men de krevde ingen forpliktelser fra deg, og det vil ikke være overflødig i porteføljen. Derfor skrev jeg til serveradministratoren, og han ba meg skrive en bot som vil vise spillerens statistikk i World of Tanks.

Forberedelsesfasen

Opprette en Discord-bot på .NET Core med distribusjon til en VPS-server
Discrod
Før vi begynner å skrive boten vår, må vi lage den for Discord. Du trenger:

  1. Logg inn på Discord-kontoen по ссылке
  2. I "Applikasjoner"-fanen, klikk på "Ny applikasjon"-knappen og navngi boten
  3. Få et bot-token ved å logge på boten din og finne "Bot"-fanen i "Innstillinger"-listen
  4. Lagre tokenet et sted

Wargaming

Du må også opprette en applikasjon i Wargaming for å få tilgang til Wargaming API. Også her er alt enkelt:

  1. Logg inn på din Wargaming-konto ved denne lenken
  2. Vi går til "Mine applikasjoner" og klikker på knappen "Legg til en ny applikasjon", oppgir navnet på applikasjonen og velger dens type
  3. Lagrer applikasjons-ID

Software

Det er allerede valgfrihet. Noen bruker Visual Studio, noen Rider, noen er generelt kraftige, og skriver kode i Vim (tross alt bruker ekte programmerere bare tastaturet, ikke sant?). For ikke å implementere Discord API, kan du imidlertid bruke det uoffisielle C#-biblioteket "DSharpPlus". Du kan installere det enten fra NuGet, eller ved å bygge kildene selv fra depotet.

For de som ikke vet eller har glemt hvordan man installerer applikasjoner fra NuGet.Instruksjoner for Visual Studio

  1. Gå til fanen Prosjekt - Administrer NuGet-pakker;
  2. Klikk på anmeldelsen og skriv inn "DSharpPlus" i søkefeltet;
  3. Velg og installer rammeverk;
  4. PROFITT!

Den forberedende fasen er over, du kan fortsette å skrive boten.

Skrivelogikk

Opprette en Discord-bot på .NET Core med distribusjon til en VPS-server

Vi vil ikke vurdere hele logikken til applikasjonen, jeg vil bare vise hvordan man jobber med avskjæring av meldinger av boten, og hvordan man jobber med Wargaming API.

Arbeid med Discord-roboten skjer gjennom den statiske asynkrone Task MainTask(streng[] args);
For å kalle denne funksjonen må du registrere deg i Main

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

Deretter må du initialisere boten din:

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

Hvor token er botens token.
Deretter, gjennom lambdaen, skriver vi de nødvendige kommandoene som boten skal utføre:

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

Hvor e.Author.Username får brukerens kallenavn.

På denne måten, når du sender en melding som begynner med &, vil boten hilse på deg.

På slutten av denne funksjonen må du skrive await discord.ConnectAsync(); og avvent Task.Delay(-1);

Dette vil tillate deg å utføre kommandoer i bakgrunnen uten å ta opp hovedtråden.

Nå må vi håndtere Wargaming API. Alt er enkelt her - skriv CURL-forespørsler, få et svar i form av en JSON-streng, trekk ut de nødvendige dataene derfra og utfør manipulasjoner på dem.

Et eksempel på arbeid 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("Игрок не найден");
                }
            }
            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;
        }

Merk følgende! Det er strengt tatt ikke anbefalt å lagre alle tokens og applikasjons-IDer i klartekst! Som et minimum forbyr Discord slike tokens når de kommer inn i det verdensomspennende nettverket, og som et maksimum begynner boten å bli brukt av angripere.

Distribuer til VPS - server

Opprette en Discord-bot på .NET Core med distribusjon til en VPS-server

Når du er ferdig med boten, må den ligge på en server som hele tiden kjører 24/7. Dette skyldes det faktum at når applikasjonen din kjører, kjører også boten. Så snart du slår av applikasjonen, sovner roboten din også.

Mange VPS-servere finnes i denne verden, både på Windows og på Linux, men i de fleste tilfeller er det mye billigere å hoste på Linux.

På Discord-serveren ble jeg informert om vscale.io, og jeg opprettet umiddelbart en virtuell server på Ubuntu på den og lastet opp boten. Jeg vil ikke beskrive hvordan denne siden fungerer, men vil gå rett til bot-innstillingene.

Først av alt må du installere den nødvendige programvaren som vil kjøre boten vår skrevet i .NET Core. Hvordan du gjør det er beskrevet her.

Deretter må du laste opp boten til en Git-tjeneste, som GitHub og lignende, og klone den til en VPS-server, eller laste ned boten din på andre måter. Vær oppmerksom på at du bare vil ha en konsoll, ingen GUI. I det hele tatt.

Etter at du har lastet ned boten din, må du kjøre den. For dette trenger du:

  • Gjenopprett alle avhengigheter: dotnet gjenoppretting
  • Bygg applikasjon: dotnet build navn_prosjekt.sln -c Utgivelse
  • Gå til bygget DLL;
  • dotnet navn_på_fil.dll

Gratulerer! Boten din kjører. Imidlertid okkuperer boten dessverre konsollen, og det er ikke lett å gå ut av VPS-serveren. Også, i tilfelle en server omstart, må du starte boten på en ny måte. Det er et par veier ut av situasjonen. Alle er relatert til lanseringen ved serveroppstart:

  • Legg til kjøreskript til /etc/init.d
  • Opprett en tjeneste som vil kjøre ved oppstart.

Jeg ser ikke poenget med å dvele ved dem i detalj, alt er beskrevet i tilstrekkelig detalj på Internett.

Funn

Jeg er glad jeg tok på meg denne oppgaven. Dette var min første erfaring med botutvikling, og jeg er glad for at jeg fikk ny kunnskap i C #, og arbeidet med Linux.

Link til Discord server. For de som spiller Wargaming-spill.
Link til depotet der Discord-roboten er plassert.
Link til DSharpPlus-depotet.
Takk for din oppmerksomhet!

Kilde: www.habr.com

Legg til en kommentar