Crearea unui bot Discord pe .NET Core cu implementare pe un server VPS

Crearea unui bot Discord pe .NET Core cu implementare pe un server VPS

Salut Khabrovites!

Astăzi veți vedea un articol care vă va arăta cum să creați un bot folosind C# pe .NET Core și cum să-l rulați pe un server la distanță.

Articolul va consta dintr-un fundal, o etapă pregătitoare, scrierea logicii și transferul botului pe un server la distanță.

Sper că acest articol va ajuta mulți începători.

preistorie

Totul a început într-o noapte nedorită de toamnă pe care am petrecut-o pe serverul Discord. De când m-am alăturat lui recent, am început să-l studiez în sus și în jos. După ce am găsit canalul de text „Locuri vacante”, m-am interesat, l-am deschis și am găsit printre ofertele care nu mă interesează, acestea sunt:

„Programator (dezvoltator de bot)
Cerinte:

  • cunoasterea limbajelor de programare;
  • capacitatea de autoinvatare.

Пожелания:

  • capacitatea de a înțelege codul altor persoane;
  • cunoștințe despre funcționalitatea DISCORD.

obiective:

  • dezvoltare bot;
  • suport și întreținere a botului.

Beneficiul dvs.:

  • Oportunitatea de a susține și influența proiectul care îți place;
  • Dobândirea experienței de lucru în echipă;
  • Oportunitatea de a demonstra și îmbunătăți abilitățile existente.


Acest lucru m-a interesat imediat. Da, nu au plătit pentru această lucrare, dar nu ți-au cerut nicio obligație și nu va fi de prisos în portofoliu. Prin urmare, i-am scris administratorului serverului și mi-a cerut să scriu un bot care să arate statisticile jucătorului în World of Tanks.

Etapa pregătitoare

Crearea unui bot Discord pe .NET Core cu implementare pe un server VPS
Discrod
Înainte de a începe să scriem botul nostru, trebuie să-l creăm pentru Discord. Ai nevoie:

  1. Conectați-vă la contul Discord по ссылке
  2. În fila „Aplicații”, faceți clic pe butonul „Aplicație nouă” și denumiți botul
  3. Obțineți un token bot conectându-vă la bot și găsind fila „Bot” în lista „Setări”
  4. Salvați jetonul undeva

Wargaming

De asemenea, trebuie să creați o aplicație în Wargaming pentru a obține acces la API-ul Wargaming. Și aici totul este simplu:

  1. Conectați-vă la contul dvs. Wargaming prin acest link
  2. Mergem la „Aplicațiile mele” și facem clic pe butonul „Adăugați o nouă aplicație”, dând numele aplicației și selectând tipul acesteia
  3. Salvarea ID-ului aplicației

Software

Există deja libertate de alegere. Cineva folosește Visual Studio, cineva Rider, cineva este în general puternic și scrie cod în Vim (la urma urmei, programatorii adevărați folosesc doar tastatura, nu?). Cu toate acestea, pentru a nu implementa API-ul Discord, puteți utiliza biblioteca neoficială C# „DSharpPlus”. Îl puteți instala fie din NuGet, fie creând singur sursele din depozit.

Pentru cei care nu știu sau au uitat cum să instaleze aplicații din NuGet.Instrucțiuni pentru Visual Studio

  1. Accesați fila Proiect - Gestionați pachetele NuGet;
  2. Faceți clic pe recenzie și în câmpul de căutare introduceți „DSharpPlus”;
  3. Selectați și instalați cadrul;
  4. PROFIT!

Etapa pregătitoare s-a încheiat, puteți trece la scrierea botului.

Logica de scriere

Crearea unui bot Discord pe .NET Core cu implementare pe un server VPS

Nu vom lua în considerare întreaga logică a aplicației, voi arăta doar cum să lucrați cu interceptarea mesajelor de către bot și cum să lucrați cu API-ul Wargaming.

Lucrul cu botul Discord are loc prin sarcina asincronă static MainTask(string[] args);
Pentru a apela această funcție, în Main trebuie să vă înregistrați

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

Apoi, trebuie să vă inițializați botul:

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

Unde simbolul este simbolul botului tău.
Apoi, prin lambda, scriem comenzile necesare pe care botul ar trebui să le execute:

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

Unde e.Author.Username primește porecla utilizatorului.

În acest fel, atunci când trimiteți orice mesaj care începe cu &, botul vă va saluta.

La sfârșitul acestei funcții, trebuie să scrieți await discord.ConnectAsync(); și așteptați Task.Delay(-1);

Acest lucru vă va permite să executați comenzi în fundal fără a ocupa firul principal.

Acum trebuie să ne ocupăm de API-ul Wargaming. Totul este simplu aici - scrieți cereri CURL, obțineți un răspuns sub forma unui șir JSON, scoateți datele necesare de acolo și efectuați manipulări asupra lor.

Un exemplu de lucru cu 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;
        }

Atenţie! Nu este strict recomandat să stocați toate jetoanele și ID-urile aplicației în text clar! Cel puțin, Discord interzice astfel de jetoane atunci când intră în rețeaua mondială și, la maximum, botul începe să fie folosit de atacatori.

Implementați pe VPS - server

Crearea unui bot Discord pe .NET Core cu implementare pe un server VPS

Odată ce ați terminat cu botul, acesta trebuie să fie găzduit pe un server care rulează constant 24/7. Acest lucru se datorează faptului că atunci când aplicația dvs. rulează, botul rulează și el. De îndată ce închideți aplicația, botul dvs. adoarme și el.

Multe servere VPS există în această lume, atât pe Windows, cât și pe Linux, cu toate acestea, în majoritatea cazurilor, este mult mai ieftin să găzduiești pe Linux.

Pe serverul Discord, am fost sfătuit vscale.io și am creat imediat un server virtual pe Ubuntu pe el și am încărcat botul. Nu voi descrie cum funcționează acest site, dar voi merge direct la setările botului.

În primul rând, trebuie să instalați software-ul necesar care va rula botul nostru scris în .NET Core. Cum se face este descris aici.

Apoi, trebuie să încărcați botul într-un serviciu Git, cum ar fi GitHub și altele asemenea, și să îl clonați pe un server VPS sau să descărcați botul în alte moduri. Vă rugăm să rețineți că veți avea doar o consolă, fără GUI. Deloc.

După ce ați descărcat botul, trebuie să îl rulați. Pentru aceasta ai nevoie de:

  • Restaurați toate dependențele: restaurare dotnet
  • Creați aplicația: dotnet build name_project.sln -c Release
  • Accesați DLL-ul construit;
  • dotnet name_of_file.dll

Felicitări! Botul tău rulează. Cu toate acestea, botul, din păcate, ocupă consola și nu este ușor să ieși din serverul VPS. De asemenea, în cazul unei reporniri a serverului, va trebui să porniți botul într-un mod nou. Există câteva căi de ieșire din situație. Toate sunt legate de lansarea la pornirea serverului:

  • Adăugați scriptul de rulare în /etc/init.d
  • Creați un serviciu care va rula la pornire.

Nu văd rostul să mă oprim asupra lor în detaliu, totul este descris suficient de detaliat pe Internet.

Constatări

Mă bucur că mi-am asumat această sarcină. Aceasta a fost prima mea experiență de dezvoltare de bot și mă bucur că am obținut cunoștințe noi în C # și că am lucrat cu Linux.

Link la serverul Discord. Pentru cei care joacă jocuri Wargaming.
Link către depozitul în care se află botul Discord.
Link către depozitul DSharpPlus.
Vă mulțumim pentru atenție!

Sursa: www.habr.com

Adauga un comentariu