Discord-bot létrehozása .NET Core-ban, VPS-szerverre történő telepítéssel

Discord-bot létrehozása .NET Core-ban, VPS-szerverre történő telepítéssel

Helló, Habr-rajongók!

Ma egy olyan cikket ismerhettek meg, amelyben bemutatom, hogyan lehet botot készíteni C# nyelven a .NET Core-on, és arról, hogyan lehet azt egy távoli szerveren üzembe helyezni.

A cikk felépítése a háttér történetéből, az előkészítési fázisból, a logika megírásából és a bot távoli szerverre történő áthelyezéséből fog állni.

Remélem, ez a cikk sok kezdőnek segíteni fog.

Háttér

Minden egy álmatlan őszi éjszakán kezdődött, amelyet a Discord szerveren töltöttem. Mivel viszonylag nemrég csatlakoztam, alaposan megkeztem felfedezni. Felfedeztem a „Munkaajánlatok” szöveges csatornát, ami felkeltette az érdeklődésemet, kinyitottam, és az érdektelen ajánlatok között találtam ezt:

„Programozó (bot fejlesztő)
Elvárások:

  • programozási nyelvek ismerete;
  • önálló tanulási képesség.

Elvárások:

  • képesség mások kódjának megértésére;
  • a DISCORD funkcióinak ismerete.

Feladatok:

  • bot fejlesztése;
  • a bot működésének támogatása és karbantartása.

Előnyök:

  • Lehetőség arra, hogy támogass és befolyásold egy tetsző projektet;
  • Tapasztalat megszerzése csapatmunkában;
  • Lehetőség arra, hogy bemutasd és fejleszd meglévő készségeidet.”


Ez azonnal felkeltette az érdeklődésemet. Igen, ezért a munkaért nem fizettek, de nem is vártak el tőled semmilyen kötelezettséget, és a portfóliódban sem lesz haszontalan. Ezért írtam a szerver adminisztrátorának, és ő megkért, hogy írjak egy botot, amely megmutatja a játékos statisztikáit a World of Tanks-ban.

Előkészítési fázis

Discord-bot létrehozása .NET Core-ban, VPS-szerverre történő telepítéssel
Discord
Mielőtt elkezdjük írni a botunkat, létre kell hoznunk azt a Discord számára. Ehhez szükséges:

  1. Bejelentkezni a Discord fiókba a linken
  2. Az 'Applications' fülön kattints a 'New Application' gombra, és nevezd el a botot
  3. Szerezd meg a bot tokenjét, bejelentkezve a botodba, és keresd meg a 'Settings' menü 'Bot' fülét
  4. Tartsd meg valahol a tokenet

Wargaming

Ezen kívül létre kell hozni egy alkalmazást a Wargamingnél, hogy hozzáférj a Wargaming API-hoz. Itt is minden egyszerű:

  1. Lépj be a Wargaming fiókba ezen a linken
  2. Lépj a 'Saját alkalmazások' oldalra, és kattints az 'Új alkalmazás hozzáadása' gombra, adj nevet az alkalmazásnak, és válaszd ki a típusát
  3. Mentse el az alkalmazás ID-jét

Szoftver

Itt már van választási lehetőség. Valaki Visual Studiot használ, valaki Rider-t, mások pedig akár Vim-ben írnak kódot (mert a valódi programozók csak a billentyűzetet használják, ugye?). Azonban, hogy ne kelljen megvalósítani a Discord API-t, használhatunk egy nem hivatalos C# könyvtárat, az "DSharpPlus"-t. Ezt telepíthetjük NuGet-ből, vagy magunk is összegyűjthetjük a forrást a repóból.

Azok számára, akik nem tudják, vagy elfelejtették, hogyan kell alkalmazásokat telepíteni a NuGet-ból.Útmutató Visual Studio-hoz

  1. Lépjünk a Projekt fülre – NuGet csomagkezelés;
  2. Kattintsunk a böngészésre, és a keresőmezőbe írjuk be az "DSharpPlus"-t;
  3. Válasszuk ki és telepítsük a keretrendszert;
  4. NYERESÉG!

A felkészülési szakasz véget ért, folytathatjuk a bot írását.

A logika megírása

Discord-bot létrehozása .NET Core-ban, VPS-szerverre történő telepítéssel

A program logikáját nem fogjuk teljesen átbeszélni, csak megmutatom, hogyan lehet a bot üzeneteit megkísérelni, és hogyan lehet használni a Wargaming API-t.

A Discord bottal való munka a static async Task MainTask(string[] args); függvényen keresztül történik;
A függvény meghívásához a Main-ben be kell írni

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

Ezután inicializálnia kell a botját:

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

Ahol a token a botod tokenje.
Ezután, egy lábda segítségével, megadjuk a szükséges parancsokat, amelyeket a botnak végre kell hajtania:

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

Ahol e.Author.Username a felhasználó nickjének meg szerzését jelenti.

Így amikor bármilyen üzenetet küldesz, amely "&"-el kezdődik, a bot üdvözölni fog.

A függvény végén szükséges beírni await discord.ConnectAsync(); és await Task.Delay(-1);

Ez lehetővé teszi a parancsok háttérben való végrehajtását, anélkül, hogy a fő szálat lefoglalnánk.

Most foglalkozzunk a Wargaming API-val. Itt minden egyszerű – CURL kéréseket írsz, JSON formátumban kapod meg a választ, kinyered belőle a szükséges adatokat, és manipulálsz velük.

Példa a WargamingAPI használatára

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("A játékos nem található");
                }
            }
            else
            {
                string error = parsed.error.message;
                if (error == "NOT_ENOUGH_SEARCH_LENGTH")
                {
                    throw new PlayerNotFound("Legalább három karakter szükséges");
                }
                else if (error == "INVALID_SEARCH")
                {
                    throw new PlayerNotFound("Érvénytelen keresés");
                }
                else if (error == "SEARCH_NOT_SPECIFIED")
                {
                    throw new PlayerNotFound("Üres felhasználónév");
                }
                else
                {
                    throw new Exception("Valami hiba történt.");
                }
            }

            return player;
        }

Figyelem! Az összes token és alkalmazás ID tárolása nyilvános formában szigorúan nem ajánlott! Legalább is – a Discord blokkolja az ilyen tokeneket, amikor bekerülnek a világhálóra, legrosszabb esetben – a botot rosszindulatú felhasználók használják.

VPS telepítése – szerver

Discord-bot létrehozása .NET Core-ban, VPS-szerverre történő telepítéssel

Miután befejezted a botot, azt egy folyamatosan működő szerverre kell telepíteni, amely 24/7 elérhető. Ennek oka, hogy amikor az alkalmazás működik, a bot is működik. Amint leállítod az alkalmazást, a botod is aludni tér.

Sok VPS szerver létezik ezen a világon, mind Windows, mind Linux alatt, de a legtöbb esetben Linux alatt sokkal olcsóbb a telepítés.

A Discord szerveren ajánlották nekem a vscale.io-t, és azonnal létrehoztam rajta egy virtuális szervert Ubuntu alatt, és feltöltöttem a botot. Nem írom le, hogyan működik ez az oldal, hanem azonnal rátérek a bot beállítására.

Először is, szükség van a megfelelő szoftver telepítésére, amely elindítja a .NET Core-ra írt botunkat. Hogyan kell ezt megtenni, itt le van írva.

Ezután fel kell töltened a botot egy Git szolgáltatásba, mint például a GitHub, és klónoznod kell a VPS szerverre, vagy más módon letöltheted a botodat. Ne feledd, hogy csak konzol lesz, GUI nem lesz. Egyáltalán.

Miután letöltötted a botodat, el kell indítanod. Ehhez szükséged van:

  • Minden függőség helyreállítása: dotnet restore
  • Az alkalmazás felépítése: dotnet build name_project.sln -c Release
  • Lépj a felépített DLL-hez;
  • dotnet name_of_file.dll

Gratulálok! A botod elindult. Azonban a bot sajnos elfoglalja a konzolt, így a VPS szerverről való kilépés nem lesz olyan egyszerű. Továbbá, a szerver újraindítása esetén a botot újra kell indítani. Itt van néhány megoldás. Mindegyik a szerver indításakor való elindításra vonatkozik:

  • Futtass le egy scriptet a /etc/init.d mappában
  • Hozz létre egy szolgáltatást, amely indításkor fut.

Nem látom értelmét, hogy részletesen belemerüljek, az interneten elég részletesen le van írva.

Következtetések

Örülök, hogy ezt a feladatot vállaltam. Ez volt az első tapasztalatom egy bot fejlesztésében, és örülök, hogy új ismereteket szereztem C#-ban és Linux használatában.

Link a Discord szerverhez. A Wargaming játékokkal játszók számára.
Link a repóhoz, ahol a Discord bot található.
Link a DSharpPlus repóhoz.
Köszönöm a figyelmet!

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster