Създаване на Discord бот на .NET Core с внедряване на VPS сървър

Създаване на Discord бот на .NET Core с внедряване на VPS сървър

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

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

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

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

праистория

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

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

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

Пожелания:

  • способност за разбиране на кода на други хора;
  • познаване на функционалността на DISCORD.

цели:

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

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

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


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

В подготвителната фаза

Създаване на Discord бот на .NET Core с внедряване на VPS сървър
Дискрод
Преди да започнем да пишем нашия бот, трябва да го създадем за Discord. Имате нужда от:

  1. Влезте в Discord акаунт по ссылке
  2. В раздела „Приложения“ щракнете върху бутона „Ново приложение“ и наименувайте бота
  3. Вземете токен за бот, като влезете в своя бот и намерите раздела „Бот“ в списъка „Настройки“
  4. Запазете токена някъде

военни игри

Освен това трябва да създадете приложение в 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. Изберете и инсталирайте рамка;
  4. ПЕЧАЛБА!

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

Логика на писане

Създаване на Discord бот на .NET Core с внедряване на VPS сървър

Няма да разглеждаме цялата логика на приложението, ще покажа само как да работим с прихващането на съобщения от бота и как да работим с API на Wargaming.

Работата с бота Discord става чрез статичната асинхронна задача 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
});

Where 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(); и изчакайте Task.Delay(-1);

Това ще ви позволи да изпълнявате команди във фонов режим, без да заемате основната нишка.

Сега трябва да се справим с API на Wargaming. Тук всичко е просто - напишете 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;
        }

внимание! Строго не се препоръчва да съхранявате всички токени и идентификатори на приложения в чист текст! Като минимум Discord забранява такива токени, когато влязат в световната мрежа, и като максимум ботът започва да се използва от нападатели.

Разположете на VPS - сървър

Създаване на Discord бот на .NET Core с внедряване на VPS сървър

След като приключите с бота, той трябва да бъде хостван на сървър, който работи постоянно 24/7. Това се дължи на факта, че когато вашето приложение работи, ботът също работи. Веднага след като изключите приложението, вашият бот също заспива.

Много VPS сървъри съществуват в този свят, както на Windows, така и на Linux, но в повечето случаи е много по-евтино да се хоства на Linux.

На сървъра на Discord ме посъветваха vscale.io и аз веднага създадох виртуален сървър на Ubuntu върху него и качих бота. Няма да описвам как работи този сайт, а ще отида направо към настройките на бота.

На първо място, трябва да инсталирате необходимия софтуер, който ще стартира нашия бот, написан на .NET Core. Как да го направите е описано тук.

След това трябва да качите бота в Git услуга, като GitHub и други подобни, и да го клонирате към VPS сървър или да изтеглите своя бот по други начини. Моля, имайте предвид, че ще имате само конзола, без GUI. Изобщо.

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

  • Възстановяване на всички зависимости: възстановяване на dotnet
  • Приложение за изграждане: dotnet build name_project.sln -c Release
  • Отидете до вградената DLL;
  • dotnet име_на_файл.dll

Честито! Вашият бот работи. Въпреки това, ботът, за съжаление, заема конзолата и не е толкова лесно да излезете от VPS сървъра. Също така, в случай на рестартиране на сървъра, ще трябва да стартирате бота по нов начин. Има няколко изхода от ситуацията. Всички те са свързани със стартирането при стартиране на сървъра:

  • Добавете стартиращ скрипт към /etc/init.d
  • Създайте услуга, която ще работи при стартиране.

Не виждам смисъл да се спирам на тях подробно, всичко е описано достатъчно подробно в Интернет.

Данни

Радвам се, че поех тази задача. Това беше първият ми опит в разработката на ботове и се радвам, че получих нови знания в C # и работата с Linux.

Връзка към Discord сървър. За тези, които играят игри на Wargaming.
Връзка към хранилището, където се намира ботът Discord.
Връзка към хранилището на DSharpPlus.
Спасибо за внимание!

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

Добавяне на нов коментар