Stvaranje Discord bota na .NET Coreu s implementacijom na VPS poslužitelj

Stvaranje Discord bota na .NET Coreu s implementacijom na VPS poslužitelj

Pozdrav Khabrovcima!

Danas ćete vidjeti članak koji će vam pokazati kako stvoriti bota pomoću C# na .NET Core i kako ga pokrenuti na udaljenom poslužitelju.

Članak će se sastojati od pozadine, pripremne faze, logike pisanja i prijenosa bota na udaljeni poslužitelj.

Nadam se da će ovaj članak pomoći mnogim početnicima.

prapovijest

Sve je počelo jedne besane jesenske noći koju sam proveo na Discord serveru. Budući da sam mu se nedavno pridružio, počeo sam ga proučavati od glave do pete. Pronašavši tekstualni kanal "Slobodna radna mjesta" zainteresirao sam se, otvorio sam ga i među ponudama koje me nisu zanimale pronašao su:

"Programer (programer botova)
Zahtjevi:

  • poznavanje programskih jezika;
  • sposobnost za samoučenje.

Пожелания:

  • sposobnost razumijevanja koda drugih ljudi;
  • poznavanje funkcionalnosti DISCORD-a.

ciljevi:

  • razvoj botova;
  • podrška i održavanje bota.

Vaša korist:

  • Mogućnost podrške i utjecaja na projekt koji vam se sviđa;
  • Stjecanje iskustva rada u timu;
  • Prilika za demonstraciju i poboljšanje postojećih vještina.


Ovo me odmah zainteresiralo. Da, nisu platili za ovaj posao, ali od vas nisu tražili nikakve obveze, a neće biti suvišan u portfelju. Stoga sam pisao administratoru servera, a on me zamolio da napišem bota koji će prikazivati ​​statistiku igrača u World of Tanks.

Pripremna faza

Stvaranje Discord bota na .NET Coreu s implementacijom na VPS poslužitelj
Discrod
Prije nego počnemo pisati našeg bota, moramo ga izraditi za Discord. Trebaš:

  1. Prijavite se na Discord račun по ссылке
  2. U kartici "Aplikacije" kliknite na gumb "Nova aplikacija" i dodijelite naziv botu
  3. Dobijte token bota tako da se prijavite u svoj bot i pronađete karticu "Bot" na popisu "Postavke".
  4. Spremite token negdje

igre rata

Također, trebate izraditi aplikaciju u Wargamingu da biste dobili pristup Wargaming API-ju. I ovdje je sve jednostavno:

  1. Prijavite se na svoj Wargaming račun ovim linkom
  2. Idemo na "Moje aplikacije" i kliknemo na gumb "Dodaj novu aplikaciju", dajući naziv aplikacije i odabir njezine vrste
  3. Spremanje ID-a aplikacije

softver

Već postoji sloboda izbora. Netko koristi Visual Studio, netko Rider, netko je općenito moćan, a piše kod u Vimu (uostalom, pravi programeri koriste samo tipkovnicu, zar ne?). Međutim, kako ne biste implementirali Discord API, možete koristiti neslužbenu C# biblioteku “DSharpPlus”. Možete ga instalirati iz NuGet-a ili sami izgraditi izvore iz repozitorija.

Za one koji ne znaju ili su zaboravili kako instalirati aplikacije iz NuGeta.Upute za Visual Studio

  1. Idite na karticu Projekt - Upravljanje NuGet paketima;
  2. Kliknite na recenziju i u polje za pretraživanje unesite “DSharpPlus”;
  3. Odaberite i instalirajte okvir;
  4. DOBIT!

Pripremna faza je gotova, možete nastaviti s pisanjem bota.

Logika pisanja

Stvaranje Discord bota na .NET Coreu s implementacijom na VPS poslužitelj

Nećemo razmatrati cijelu logiku aplikacije, samo ću pokazati kako raditi s presretanjem poruka od strane bota i kako raditi s Wargaming API-jem.

Rad s Discord botom odvija se kroz statički asinkroni zadatak MainTask(string[] args);
Za pozivanje ove funkcije morate se registrirati u glavnom

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

Zatim morate inicijalizirati svog bota:

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

Gdje je token token vašeg bota.
Zatim kroz lambdu ispisujemo potrebne naredbe koje bot treba izvršiti:

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

Gdje e.Author.Username dobiva korisnikov nadimak.

Na ovaj način, kada pošaljete bilo koju poruku koja počinje sa &, bot će vas pozdraviti.

Na kraju ove funkcije morate napisati await discord.ConnectAsync(); i čekaj Task.Delay(-1);

To će vam omogućiti izvršavanje naredbi u pozadini bez zauzimanja glavne niti.

Sada se moramo pozabaviti Wargaming API-jem. Ovdje je sve jednostavno - napišite CURL zahtjeve, dobijte odgovor u obliku JSON niza, izvucite potrebne podatke od tamo i izvršite manipulacije na njima.

Primjer rada s 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;
        }

Pažnja! Strogo se ne preporučuje pohranjivanje svih tokena i ID-ova aplikacija u čistom tekstu! Minimalno, Discord zabranjuje takve tokene kada uđu u svjetsku mrežu, a maksimalno, bot počinju koristiti napadači.

Postavite na VPS - poslužitelj

Stvaranje Discord bota na .NET Coreu s implementacijom na VPS poslužitelj

Nakon što završite s botom, potrebno ga je smjestiti na poslužitelj koji neprestano radi 24/7. To je zbog činjenice da kada je vaša aplikacija pokrenuta, bot također radi. Čim isključite aplikaciju, i vaš bot zaspi.

Mnogi VPS poslužitelji postoje u ovom svijetu, i na Windowsima i na Linuxu, međutim, u većini slučajeva mnogo je jeftinije hostirati na Linuxu.

Na Discord serveru savjetovali su mi vscale.io i odmah sam na njemu napravio virtualni server na Ubuntuu i postavio bot. Neću opisivati ​​kako ova stranica radi, već ću ići ravno na postavke bota.

Prije svega, potrebno je instalirati potreban softver koji će pokretati našeg bota napisanog u .NET Core. Ovdje je opisano kako to učiniti.

Zatim trebate prenijeti bot na Git servis, kao što je GitHub i slično, i klonirati ga na VPS poslužitelj ili preuzeti svoj bot na druge načine. Imajte na umu da ćete imati samo konzolu, a ne GUI. Uopće.

Nakon što ste preuzeli svoj bot, trebate ga pokrenuti. Za ovo vam je potrebno:

  • Vraćanje svih ovisnosti: dotnet vraćanje
  • Izrada aplikacije: dotnet build name_project.sln -c Izdanje
  • Idite na ugrađeni DLL;
  • dotnet naziv_datoteke.dll

Čestitamo! Vaš bot radi. Međutim, bot, nažalost, zauzima konzolu, a nije lako izaći s VPS poslužitelja. Također, u slučaju ponovnog pokretanja poslužitelja, morat ćete pokrenuti bot na novi način. Postoji nekoliko izlaza iz situacije. Svi su oni povezani s pokretanjem pri pokretanju poslužitelja:

  • Dodajte skriptu za pokretanje u /etc/init.d
  • Napravite uslugu koja će se pokrenuti pri pokretanju.

Ne vidim smisla da se o njima detaljno bavim, sve je dovoljno detaljno opisano na Internetu.

Zaključci

Drago mi je što sam prihvatio ovaj zadatak. Ovo je bilo moje prvo iskustvo u razvoju botova i drago mi je da sam stekao nova znanja o C#-u i radu s Linuxom.

Link na Discord server. Za one koji igraju Wargaming igre.
Link na repozitorij u kojem se nalazi Discord bot.
Link na DSharpPlus repozitorij.
Hvala vam!

Izvor: www.habr.com

Dodajte komentar