Хабрахабр

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


Привет, Хабровчани!

NET Core, и о том, как его завести на удаленном сервере. Сегодня вы ознакомитесь со статьей, в которой будет рассказано, как создать бота, используя C# на .

Статья будет состоять из предыстории, подготовительного этапа, написании логики и перенос бота на удаленный сервер.

Надеюсь, данная статья поможет многим начинающим.

Предыстория

Все началось в одну бессонную осеннюю ночь, которую я проводил на Discord – сервере. Так как, я только относительно недавно к нему присоединился, я стал его изучать вдоль и поперёк. Обнаружив текстовый канал «Вакансии», я заинтересовался, открыл его, и отыскав среди не интересующих меня предложений, это:
«Программист (разработчик бота)
Требования:
• знание языков программирования;
• способность к самообучению.
Пожелания:
• умение разбираться в чужом коде;
• знание функционала DISCORD.
Задачи:
• разработка бота;
• поддержка и сопровождение работы бота.
Ваша выгода:
• Возможность поддержать и повлиять на приглянувшийся проект;
• Приобретение опыта работы в команде;
• Возможность продемонстрировать и улучшить имеющиеся навыки.»

Да, за данную работу не платили, но от тебя никаких обязательств не требовали, да и в портфолио лишним не будет. Это мгновенно меня заинтересовало. Поэтому, я написал админу сервера, и он попросили написать бота, который будет показывать статистику игрока в World of Tanks.

Подготовительный этап


Discrod
Прежде, чем приступить к написанию нашего бота, его необходимо создать для Discord. Вам необходимо:
1. Войти в Discord аккаунт по ссылке
2. Во вкладе “Applications” нажать на кнопку “New Application” и назвать бота;
3. Получить токен бота, войдя в вашего бота и найдя в списке “Settings” вкладку “Bot”.
4. Сохранить где-нибудь токен.
Wargaming
Также, необходимо создать приложение в Wargaming, чтобы получить доступ к API Wargaming. Тут тоже все просто:
1. Заходим в аккаунт Wargaming по данной ссылке
2. Заходим в «Мои приложением» и нажимаем на кнопку «Добавить новое приложение», дав имя приложения и выбрав его тип;
3. Сохранить ID приложения.
Software
Тут уже имеется свобода выбора. Кто-то использует Visual Studio, кто – то Rider, кто то вообще мощный, и пишет код в Vim (все же настоящие программисты используют только клавиатуру, верно?). Однако, чтобы не реализовывать Discord API, можно использовать неофициальную библиотеку для C# “DSharpPlus”. Его можно установить либо из NuGet, либо самому собрав исходники с репозитория.

Для тех, кто не знает, или забыл, как устанавливать приложения из NuGet.

Переходим во вкладку Проект – Управление пакетами NuGet;
2. Инструкция для Visual Studio
1. Выбираем и устанавливаем framework;
4. Нажимаем на обзор и в поле поиска вводим “DSharpPlus”;
3. PROFIT!

Подготовительный этап окончен, можно переходить к написанию бота.

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


Всю логику приложения рассматривать не будем, я лишь покажу, как работать с перехватом сообщений ботом, и как работать с 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 =>

};

Где 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 – сервер


После того, как вы закончили с ботом, его необходимо разместить на сервере, который постоянно работает 24/7. Это связанно с тем, что когда работает ваше приложение, то работает и бот. Как только вы выключаете приложение, засыпает и ваш бот.
Много VPS серверов существует на этом свете, как на Windows, так и на Linux, однако в большинстве случаев, на Linux в разы дешевле размещать.
На Discord – сервере мне посоветовали vscale.io, и я тут же создал на нем виртуальный сервер на Ubuntu и залил бота. Я не буду описывать, как работает данный сайт, а сразу перейду к настройки бота.
Первым делом, вам необходимо установить необходимый софт, который будет запускать нашего бота, написанного на .NET Core. Как это сделать, описано здесь: docs.microsoft.com/ru-ru/dotnet/core/install/linux-package-manager-ubuntu-1804
Далее, вам необходимо залить бота на Git – сервис, вроде GitHub и ему подобных, или, другими путями скачать вашего бота. Учтите, что у вас будет только консоль, 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.
Спасибо за внимание!

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть