Стварэнне Discord – робата на .NET Core з дэплоем на VPS-сервер

Стварэнне Discord – робата на .NET Core з дэплоем на VPS-сервер

Прывітанне, Хабраўчане!

Сёння вы азнаёміцеся з артыкулам, у якім будзе расказана, як стварыць робата, выкарыстоўваючы C# на .NET Core, і пра тое, як яго завесці на выдаленым серверы.

Артыкул будзе складацца з перадгісторыі, падрыхтоўчага этапу, напісання логікі і пераносу бота на выдалены сервер.

Спадзяюся, дадзены артыкул дапаможа шматлікім пачаткоўцам.

перадгісторыя

Усё пачалося ў адну бяссонную восеньскую ноч, якую я праводзіў на Discord - серверы. Паколькі я адносна нядаўна да яго далучыўся, я пачаў яго вывучаць уздоўж і ўпоперак. Выявіўшы тэкставы канал «Вакансіі», я зацікавіўся, адкрыў яго, і адшукаў сярод прапаноў, якія не цікавяць мяне, гэта:

«Праграміст (распрацоўшчык бота)
патрабаванні:

  • веданне моў праграмавання;
  • здольнасць да саманавучання.

пажаданні:

  • ўменне разбірацца ў чужым кодзе;
  • веданне функцыяналу DISCORD.

задачы:

  • тэхналогія робата;
  • падтрымка і суправаджэнне працы бота.

Ваша выгада:

  • Магчымасць падтрымаць і паўплываць на які спадабаўся праект;
  • Набыццё досведу працы ў камандзе;
  • Магчымасць прадэманстраваць і палепшыць наяўныя навыкі.»


Гэта імгненна мяне зацікавіла. Так, за дадзеную працу не плацілі, але ад цябе ніякіх абавязацельстваў не патрабавалі, ды і ў партфоліё лішнім не будзе. Таму я напісаў адміну сервера, і ён папрасіў напісаць робата, які будзе паказваць статыстыку гульца ў World of Tanks.

Падрыхтоўчы этап

Стварэнне Discord – робата на .NET Core з дэплоем на VPS-сервер
Дыскрод
Перш, чым прыступіць да напісання нашага робата, яго неабходна стварыць для Discord. Вам неабходна:

  1. Увайсці ў Discord рахунак па спасылцы
  2. Ва ўкладзе "Applications" націснуць на кнопку "New Application" і назваць бота
  3. Атрымаць токен бота, увайшоўшы ў вашага бота і знайшоўшы ў спісе "Settings" ўкладку "Bot"
  4. Захаваць дзе-небудзь токен

Wargaming

Таксама, неабходна стварыць дадатак у Wargaming, каб атрымаць доступ да API Wargaming. Тут таксама ўсё проста:

  1. Заходзім у акаўнт Wargaming па дадзенай спасылцы
  2. Заходзім у «Мае прыкладанні» і націскаем на кнопку «Дадаць новае прыкладанне», даўшы імя прыкладання і выбраўшы яго тып
  3. Захоўваем ID прыкладання

праграмнае забеспячэнне

Тут ужо ёсць свабода выбару. Хтосьці выкарыстоўвае Visual Studio, хтосьці Rider, хтосьці наогул магутны, і піша код у Vim (усё ж сапраўдныя праграмісты выкарыстоўваюць толькі клавіятуру, праўда?). Аднак, каб не рэалізоўваць Discord API, можна выкарыстоўваць неафіцыйную бібліятэку для C# "DSharpPlus". Яго можна ўсталяваць альбо з NuGet, альбо самому сабраўшы зыходнікі з рэпазітара.

Для тых, хто не ведае, ці забыўся, як усталёўваць прыкладанні з NuGet.Інструкцыя для Visual Studio

  1. Пераходзім ва ўкладку Праект - Упраўленне пакетамі NuGet;
  2. Націскаем на агляд і ў поле пошуку ўводзім "DSharpPlus";
  3. Выбіраемы і ўсталёўваны framework;
  4. PROFIT!

Падрыхтоўчы этап скончаны, можна пераходзіць да напісання робата.

Напісанне логікі

Стварэнне Discord – робата на .NET Core з дэплоем на VPS-сервер

Усю логіку прыкладання разглядаць не будзем, я толькі пакажу, як працаваць з перахопам паведамленняў ботам, і як працаваць з Wargaming API.

Праца з Discord бот адбываецца праз функцыю static async Task MainTask(string[] args);
Каб выклікаць дадзеную функцыю, у Main неабходна прапісаць

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

Далей, вам неабходна ініцыялізаваць свайго робата:

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

Дзе token – токен вашага робата.
Потым, праз лямбду, прапісваем неабходныя каманды, якія павінен выконваць бот:

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

Дзе e.Author.Username - атрыманне нікнэйма карыстальніка.

Такім чынам, калі вы адправіце любое паведамленне, якое пачынаецца з &, бот будзе вітаць вас.

У канцы дадзенай функцыі, неабходна прапісаць await discord.ConnectAsync(); і await Task.Delay(-1);

Гэта дазволіць выконваць каманды на фоне, не займаючы асноўны паток.

Цяпер неабходна разабрацца з Wargaming API. Тут усё проста - пішаце CURL-запыты, атрымліваеце адказ у выглядзе JSON - радкі, выцягваеце адтуль неабходныя дадзеныя і робіце над імі маніпуляцыі.

Прыклад працы з 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;
        }

Увага! Усе токены і ID прыкладанняў захоўваць у адкрытым выглядзе строга не рэкамендуецца! Прынамсі – Discord баніць такія токены, калі яны пападаюць у сусветную сетку, як максімум – бот пачынае карыстацца зламыснікамі.

Дэплой на VPS - сервер

Стварэнне Discord – робата на .NET Core з дэплоем на VPS-сервер

Пасля таго, як вы скончылі з ботам, яго неабходна размясціць на серверы, які ўвесь час працуе 24/7. Гэта звязана з тым, што калі працуе ваша дадатак, то працуе і бот. Як толькі вы выключаеце дадатак, засынае і ваш бот.

Шмат VPS сервераў існуе на гэтым свеце, як на Windows, так і на Linux, аднак у большасці выпадкаў, на Linux у разы танней размяшчаць.

На Discord - серверы мне параілі vscale.io, і я тут жа стварыў на ім віртуальны сервер на Ubuntu і заліў робата. Я не буду апісваць, як працуе дадзены сайт, а адразу перайду да налады робата.

Перш за ўсё, вам неабходна ўсталяваць неабходны софт, які будзе запускаць нашага робата, напісанага на .NET Core. Як гэта зрабіць, апісана тут.

Далей, вам неабходна заліць робата на Git – сэрвіс, накшталт GitHub і яму падобныя і схіляваць на VPS – сервер, ці, іншымі шляхамі спампаваць вашага робата. Улічыце, што ў вас будзе толькі кансоль, GUI не будзе. Зусім.

Пасля таго, як вы спампавалі вашага робата, вам неабходна яго запусціць. Для гэтага, вам неабходна:

  • Аднавіць усе залежнасці: dotnet restore
  • Пабудаваць дадатак: dotnet build name_project.sln -c Release
  • Перайсці да пабудаванай DLL;
  • dotnet name_of_file.dll

Віншую! Ваш бот запушчаны. Аднак, робат, на няшчасце, займае кансоль, і выйсці з VPS – сервера так проста не выйдзе. Таксама, у выпадку перазагрузкі сервера, прыйдзецца па-новаму запускаць робата. Тут ёсць некалькі выхадаў з сітуацыі. Усе яны звязаны з запускам пры старце сервера:

  • Дадаць запуск скрыпту ў /etc/init.d
  • Стварыць сэрвіс, які будзе запускацца пры старце.

Падрабязна спыняцца на іх не бачу сэнсу, дастаткова падрабязна ўсё апісана ў інтэрнэце.

Высновы

Я рады, што я ўзяўся за гэтае заданне. Гэта быў мой першы досвед распрацоўкі бота, і рады, што атрымаў новыя веды па C#, і працы з Linux.

Спасылка на Discord - сервер. Для тых, хто гуляе ў гульні Wargaming.
Спасылка на рэпазітар, дзе ляжыць Discord bot.
Спасылка на рэпазітар DSharpPlus.
Дзякуй за ўвагу!

Крыніца: habr.com

Дадаць каментар