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

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

Здравейте, Хабровчани!

Днес ще се запознаете със статия, в която ще разкажем как да създадете бот, използвайки C# на .NET Core, и как да го пуснете на отдалечен сървър.

Статията ще се състои от предистория, подготвителен етап, написване на логиката и прехвърляне на бота на отдалечения сървър.

Надявам се, че тази статия ще помогне на много начинаещи.

Предистория

Всичко започна в една безсънна есенна нощ, която прекарах в Discord – сървър. Тъй като бях относително нов в него, започнах да го изследвам от край до край. Откривайки текстов канал „Вакансии“, се заинтересувах, отворих го и открих сред неинтересуващите ме предложения това:

„Програмист (разработчик на бота)"
Изисквания:

  • знание на програмни езици;
  • способност за самообучение.

Изисквания:

  • умение да разбирате чужд код;
  • знание на функционалността на DISCORD.

Задачи:

  • разработка на бот;
  • поддръжка и съпровождане на работата на бота.

Вашата полза:

  • Възможност да подкрепите и повлияете на проекта, който ви интересува;
  • Придобиване на опит в работа в екип;
  • Възможност да демонстрирате и усъвършенствате наличните умения.


Това веднага ме заинтересува. Да, за тази работа не плащаха, но не изискваха от мен никакви задължения, а и в портфолиото няма да е излишно. Затова написах на администратора на сървъра, и той ми помоли да напиша бот, който да показва статистиката на играча в World of Tanks.

Подготвителен етап

Създаване на Discord-бот на .NET Core с деплой на VPS-сървър
Discord
Преди да започнем да пишем нашия бот, трябва да го създадем за 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. ПЕЧАЛБА!

Подготвителният етап приключи, може да преминем към написването на бота.

Написване на логика

Създаване на 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

публичен 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("Нещо се обърка.");
                }
            }

            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 бот.
Връзка към репозитория DSharpPlus.
Благодаря за вниманието!

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster