
Здравейте, Хабровци!
Днес ще се запознаете с статия, в която ще се разказва как да създадете бот, използвайки C# на .NET Core, и как да го стартирате на отдалечен сървър.
Статията ще се състои от предистория, подготвителен етап, написване на логиката и пренасяне на бота на отдалечен сървър.
Надявам се, че тази статия ще помогне на много начинаещи.
Предистория
Всичко започна в една безсънна есенна нощ, която прекарах в Discord – сървър. Тъй като бях сравнително нов в него, започнах да го изследвам от край до край. Открих текстов канал „Свободни позиции“, заинтересувах се, отворих го и сред предложенията, които не ме интересуваха, открих това:
„Програмист (разработчик на ботове)
Изисквания:
- знание на програмни езици;
- способност за самообучение.
Изисквания:
- умение да разбирате чужд код;
- знание на функционалността на DISCORD.
Задачи:
- разработка на бот;
- поддръжка и сопровождане на работата на бота.
Вашата полза:
- Възможност да подкрепите и повлияете на проект, който ви харесва;
- Придобиване на опит в работа в екип;
- Възможност да демонстрирате и подобрите съществуващите си умения.“
Това моментално ме заинтересува. Да, за тази работа не плащаха, но не се изискваха никакви задължения от вас и от това в портфолиото няма да е излишно. Затова написах на администратора на сървъра и той ме помоли да направя бот, който ще показва статистиката на играча в World of Tanks.
Подготвителен етап

Discrod
Преди да започнем да пишем нашия бот, трябва да го създадем за Discord. Вие трябва:
- Да влезете в вашия Discord акаунт
- В раздела “Applications” да натиснете бутона “New Application” и да назовете бота
- Да получите токен на бота, влизайки в бот акаунта си и намирайки в списъка “Settings” раздела “Bot”
- Да запазите токена на друго място
Wargaming
Също така е необходимо да създадете приложение в Wargaming, за да получите достъп до API на Wargaming. И тук е просто:
- Влизате в акаунта Wargaming
- Влизате в ‘Моите приложения’ и натискате бутона ‘Добавяне на ново приложение’, давате име на приложението и избирате типа му
- Запазвате ID на приложението
Софтвер
Тук вече имате свобода на избор. Някой ползва Visual Studio, друг - Rider, а трети пише код в мощен редактор Vim (все пак истинските програмисти използват само клавиатура, нали?). Въпреки това, за да не се реализира Discord API, можете да използвате неофициална библиотека за C# “DSharpPlus”. Можете да я инсталирате или от NuGet, или да компилирате сами изходния код от репозитория.
За тези, които не знаят или са забравили как да инсталират приложения от NuGet.Инструкция за Visual Studio
- Преминете на раздел Проект – Управление на пакети NuGet;
- Натиснете на преглед и в полето за търсене напишете “DSharpPlus”;
- Избирайте и инсталирайте framework;
- ПЕЧЕЛЕНЕ!
Подготовителният етап е завършен, можете да преминете към написването на бота.
Написване на логика

Няма да разглеждаме цялата логика на приложението, просто ще покажа как да работите с перехват на съобщения от бота и как да работите с 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 – сървър

След като приключите с бота, той трябва да бъде разположен на сървър, който работи 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 сървър.
Благодаря за вниманието!
Източник: habr.com
