Эҷоди як боти Discord дар .NET Core бо ҷойгиркунӣ дар сервери VPS

Эҷоди як боти Discord дар .NET Core бо ҷойгиркунӣ дар сервери VPS

Салом Хабровиён!

Имрӯз шумо мақолаеро хоҳед дид, ки ба шумо чӣ гуна сохтани бот бо истифода аз C# дар .NET Core ва чӣ гуна онро дар сервери дурдаст иҷро карданро нишон медиҳад.

Мақола аз замина, марҳилаи омодагӣ, навиштани мантиқ ва интиқоли бот ба сервери дурдаст иборат хоҳад буд.

Ман умедворам, ки ин мақола ба бисёр шурӯъкунандагон кӯмак хоҳад кард.

prehistory

Ҳамааш дар як шаби бехоби тирамоҳ оғоз шуд, ки ман дар сервери Discord гузаронидам. Азбаски ман ба наздикӣ ба ӯ ҳамроҳ шудам, ман ба омӯхтани ӯ шурӯъ кардам. Пас аз пайдо кардани канали матнии "Вакансияҳо" ман таваҷҷӯҳ пайдо кардам, онро кушодам ва дар байни пешниҳодҳое пайдо кардам, ки ба ман таваҷҷӯҳ надоштанд, инҳоянд:

"Барномасоз (таҳиягари бот)
Талабот:

  • донистани забонҳои барномасозӣ;
  • қобилияти худомӯзӣ.

Орзуҳо:

  • қобилияти фаҳмидани рамзи одамони дигар;
  • донистани функсияи DISCORD.

Мақсадҳо:

  • рушди бот;
  • дастгирӣ ва нигоҳдории бот.

Фоидаи шумо:

  • Имконияти дастгирӣ ва таъсир расонидан ба лоиҳаи ба шумо маъқул;
  • Гирифтани таҷрибаи кор дар як гурӯҳ;
  • Имконияти нишон додан ва такмил додани малакаҳои мавҷуда.


Ин дарҳол маро ҷалб кард. Бале, онҳо барои ин кор пул надоданд, аммо аз шумо ҳеҷ гуна ӯҳдадорӣ талаб накарданд ва ин дар портфел зиёдатӣ нахоҳад буд. Аз ин рӯ, ман ба администратори сервер навиштам ва ӯ аз ман хоҳиш кард, ки бот нависам, ки омори бозигарро дар World of Tanks нишон диҳад.

Марҳилаи омодагӣ

Эҷоди як боти Discord дар .NET Core бо ҷойгиркунӣ дар сервери VPS
Discrod
Пеш аз оғози навиштани боти худ, мо бояд онро барои Discord эҷод кунем. Ба шумо лозим аст:

  1. Ба ҳисоби Discord ворид шавед пайванд
  2. Дар ҷадвали "Барномаҳо" тугмаи "Барномаи нав" -ро клик кунед ва ботро номбар кунед
  3. Бо ворид шудан ба боти худ ва пайдо кардани ҷадвали "Бот" дар рӯйхати "Танзимот" аломати ботро гиред
  4. Токенро дар ҷое захира кунед

Варшава

Инчунин, шумо бояд дар Wargaming барнома эҷод кунед, то ба API Wargaming дастрасӣ пайдо кунед. Дар ин ҷо ҳам ҳама чиз оддӣ аст:

  1. Ба ҳисоби Wargaming-и худ ворид шавед бо ин пайванд
  2. Мо ба "Барномаҳои ман" меравем ва тугмаи "Иловаи замимаи нав" -ро пахш карда, номи барномаро дода, навъи онро интихоб мекунем.
  3. Нигоҳ доштани ID-и барнома

Барнома

Аллакай озодии интихоб вуҷуд дорад. Касе Visual Studio, касе Rider -ро истифода мебарад, касе умуман тавоност ва дар Vim код менависад (охир, барномасозони воқеӣ танҳо клавиатураро истифода мебаранд, дуруст?). Аммо, барои татбиқ накардани API Discord, шумо метавонед китобхонаи ғайрирасмии C # "DSharpPlus" -ро истифода баред. Шумо метавонед онро ё аз NuGet насб кунед, ё тавассути сохтани манбаъҳо худ аз анбор.

Барои онҳое, ки чӣ гуна насб кардани барномаҳоро аз NuGet намедонанд ё фаромӯш кардаанд.Дастурҳо барои Visual Studio

  1. Ба ҷадвал равед Лоиҳа - Идоракунии бастаҳои NuGet;
  2. Баррасиро клик кунед ва дар майдони ҷустуҷӯ "DSharpPlus" -ро ворид кунед;
  3. Чорчӯба интихоб ва насб кунед;
  4. ФАҚАТ!

Марҳилаи омодагӣ ба охир расид, шумо метавонед ба навиштани бот идома диҳед.

Мантиқи навиштан

Эҷоди як боти Discord дар .NET Core бо ҷойгиркунӣ дар сервери VPS

Мо тамоми мантиқи барномаро баррасӣ намекунем, ман танҳо нишон медиҳам, ки чӣ гуна кор кардан бо боздошти паёмҳо аз ҷониби бот ва чӣ гуна кор кардан бо Wargaming API.

Кор бо боти Discord тавассути 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
});

Дар куҷо нишона аломати боти шумост.
Сипас, тавассути ламбда, мо фармонҳои заруриро менависем, ки бот бояд иҷро кунад:

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);

Ин ба шумо имкон медиҳад, ки фармонҳоро дар замина бидуни гирифтани риштаи асосӣ иҷро кунед.

Ҳоло мо бояд бо 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 - сервер ҷойгир кунед

Эҷоди як боти 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 Варақаи
  • Ба DLL-и сохташуда гузаред;
  • dotnet name_of_file.dll

Табрик мекунем! Боти шумо кор мекунад. Аммо, мутаассифона, бот консолро ишғол мекунад ва баромадан аз сервери VPS осон нест. Инчунин, дар сурати бозоғозкунии сервер, шумо бояд ботро бо роҳи нав оғоз кунед. Якчанд роҳи баромадан аз вазъият вуҷуд дорад. Ҳамаи онҳо бо оғозёбӣ дар оғози сервер алоқаманданд:

  • Ба /etc/init.d скрипти иҷро илова кунед
  • Эҷоди хидмате, ки ҳангоми оғозёбӣ кор мекунад.

Ман нуқтаи муфассалро дар бораи онҳо намебинам, ҳама чиз дар Интернет ба таври муфассал тавсиф шудааст.

натиҷаҳои

Ман шодам, ки ин вазифаро ба ӯҳда гирифтам. Ин аввалин таҷрибаи таҳияи ботҳои ман буд ва ман шодам, ки ман дар C # дониши нав гирифтам ва бо Linux кор кардам.

Истинод ба сервери Discord. Барои онҳое, ки бозиҳои Wargaming бозӣ мекунанд.
Истинод ба репозиторий, ки дар он боти Discord ҷойгир аст.
Истинод ба анбори DSharpPlus.
Ташаккур барои таваҷҷӯҳатон!

Манбаъ: will.com

Илова Эзоҳ