Oprettelse af en Discord-bot på .NET Core med udrulning til en VPS-server

Oprettelse af en Discord-bot på .NET Core med udrulning til en VPS-server

Hej Khabrovites!

I dag vil du se en artikel, der viser dig, hvordan du opretter en bot ved hjælp af C# på .NET Core, og hvordan du kører den på en fjernserver.

Artiklen vil bestå af en baggrund, et forberedende trin, skrivelogik og overførsel af botten til en ekstern server.

Jeg håber, at denne artikel vil hjælpe mange begyndere.

forhistorie

Det hele startede på en søvnløs efterårsnat, som jeg tilbragte på Discord-serveren. Siden jeg for nylig sluttede mig til ham, begyndte jeg at studere ham op og ned. Efter at have fundet tekstkanalen "Ledige stillinger", blev jeg interesseret, åbnede den og fandt blandt de tilbud, der ikke interesserede mig, disse er:

"Programmer (botudvikler)
Krav:

  • kendskab til programmeringssprog;
  • evne til selvlæring.

Ønsker:

  • evne til at forstå andres kode;
  • kendskab til DISCORD funktionalitet.

mål:

  • bot udvikling;
  • support og vedligeholdelse af botten.

Din fordel:

  • Mulighed for at støtte og påvirke det projekt, du kan lide;
  • Få erfaring med at arbejde i et team;
  • Mulighed for at demonstrere og forbedre eksisterende færdigheder.


Dette interesserede mig straks. Ja, de har ikke betalt for dette arbejde, men de krævede ingen forpligtelser fra dig, og det vil ikke være overflødigt i porteføljen. Derfor skrev jeg til serveradministratoren, og han bad mig skrive en bot, der vil vise spillerens statistik i World of Tanks.

Den forberedende fase

Oprettelse af en Discord-bot på .NET Core med udrulning til en VPS-server
Diskod
Før vi begynder at skrive vores bot, skal vi oprette den til Discord. Du mangler:

  1. Log ind på Discord-konto по ссылке
  2. På fanen "Applikationer" skal du klikke på knappen "Ny applikation" og navngive botten
  3. Få et bot-token ved at logge ind på din bot og finde fanen "Bot" på listen "Indstillinger"
  4. Gem tokenet et sted

Wargaming

Du skal også oprette en applikation i Wargaming for at få adgang til Wargaming API. Også her er alt simpelt:

  1. Log ind på din Wargaming-konto ved dette link
  2. Vi går til "Mine applikationer" og klikker på knappen "Tilføj en ny applikation", giver navnet på applikationen og vælger dens type
  3. Gemmer applikations-id'et

Software

Der er allerede valgfrihed. Nogen bruger Visual Studio, nogen Rider, nogen er generelt magtfulde og skriver kode i Vim (rigtige programmører bruger trods alt kun tastaturet, ikke?). Men for ikke at implementere Discord API, kan du bruge det uofficielle C#-bibliotek "DSharpPlus". Du kan installere det enten fra NuGet eller ved at bygge kilderne selv fra depotet.

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

  1. Gå til fanen Projekt - Administrer NuGet-pakker;
  2. Klik på anmeldelsen og indtast "DSharpPlus" i søgefeltet;
  3. Vælg og installer framework;
  4. PROFIT!

Den forberedende fase er forbi, du kan fortsætte med at skrive botten.

Skrivelogik

Oprettelse af en Discord-bot på .NET Core med udrulning til en VPS-server

Vi vil ikke overveje hele applikationens logik, jeg vil kun vise, hvordan man arbejder med aflytning af beskeder af botten, og hvordan man arbejder med Wargaming API.

Arbejdet med Discord-botten foregår gennem den statiske async Task MainTask(streng[] args);
For at kalde denne funktion skal du registrere dig i Main

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

Dernæst skal du initialisere din bot:

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

Hvor token er din bots token.
Derefter skriver vi gennem lambdaen de nødvendige kommandoer, som botten skal udfø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 brugerens kaldenavn.

På denne måde, når du sender en besked, der starter med &, vil botten hilse på dig.

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

Dette giver dig mulighed for at udføre kommandoer i baggrunden uden at tage hovedtråden op.

Nu skal vi beskæftige os med Wargaming API. Alt er enkelt her - skriv CURL-anmodninger, få et svar i form af en JSON-streng, træk de nødvendige data ud derfra og udfør manipulationer på dem.

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

Opmærksomhed! Det anbefales strengt ikke at gemme alle tokens og applikations-id'er i klar tekst! Som minimum forbyder Discord sådanne tokens, når de kommer ind på det verdensomspændende netværk, og som et maksimum begynder botten at blive brugt af angribere.

Implementer til VPS - server

Oprettelse af en Discord-bot på .NET Core med udrulning til en VPS-server

Når du er færdig med botten, skal den hostes på en server, der konstant kører 24/7. Dette skyldes det faktum, at når din applikation kører, kører botten også. Så snart du slukker applikationen, falder din bot også i søvn.

Mange VPS-servere findes i denne verden, både på Windows og på Linux, men i de fleste tilfælde er det meget billigere at hoste på Linux.

På Discord-serveren blev jeg anbefalet vscale.io, og jeg oprettede straks en virtuel server på Ubuntu på den og uploadede botten. Jeg vil ikke beskrive, hvordan dette websted fungerer, men vil gå direkte til bot-indstillingerne.

Først og fremmest skal du installere den nødvendige software, der kører vores bot skrevet i .NET Core. Hvordan man gør det er beskrevet her.

Dernæst skal du uploade botten til en Git-tjeneste, som GitHub og lignende, og klone den til en VPS-server eller downloade din bot på andre måder. Bemærk venligst, at du kun vil have en konsol, ingen GUI. Overhovedet.

Når du har downloadet din bot, skal du køre den. Til dette har du brug for:

  • Gendan alle afhængigheder: dotnet gendannelse
  • Byg applikation: dotnet build name_project.sln -c Release
  • Gå til bygget DLL;
  • dotnet navn_på_fil.dll

Tillykke! Din bot kører. Men botten optager desværre konsollen, og det er ikke let at forlade VPS-serveren. I tilfælde af en servergenstart skal du også starte botten på en ny måde. Der er et par veje ud af situationen. Alle er relateret til lanceringen ved serverstart:

  • Tilføj run script til /etc/init.d
  • Opret en tjeneste, der kører ved opstart.

Jeg kan ikke se meningen med at dvæle ved dem i detaljer, alt er beskrevet tilstrækkeligt detaljeret på internettet.

Fund

Jeg er glad for, at jeg påtog mig denne opgave. Dette var min første erfaring med botudvikling, og jeg er glad for, at jeg fik ny viden i C # og arbejde med Linux.

Link til Discord server. For dem, der spiller Wargaming-spil.
Link til depotet, hvor Discord-botten er placeret.
Link til DSharpPlus-lageret.
Tak for din opmærksomhed!

Kilde: www.habr.com

Tilføj en kommentar