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

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

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

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

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

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

Предистория

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

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

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

Изисквания:

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

Задачи:

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

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

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


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

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

Създаване на Discord – бот на .NET Core с деплой на VPS-сервер
Discrod
Преди да започнем да пишем нашия бот, трябва да го създадем за 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 – сървър, или, по други начини, да изтеглите вашия бот. Имайте предвид, че ще имате само конзола, интерфейс за потребител не ще има. Въобще.

След като изтеглите бота, е необходимо да го стартирате. За целта, трябва да:

  • Възстановите всички зависимости: 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