ื™ืฆื™ืจืช ื‘ื•ื˜ Discord ื‘-.NET Core ืขื ืคืจื™ืกื” ืœืฉืจืช VPS

ื™ืฆื™ืจืช ื‘ื•ื˜ Discord ื‘-.NET Core ืขื ืคืจื™ืกื” ืœืฉืจืช VPS

ืฉืœื•ื ื—ื‘ืจื•ื‘ื™ื˜ื™ื!

ื”ื™ื•ื ืชืจืื• ืžืืžืจ ืฉื™ืจืื” ืœื›ื ื›ื™ืฆื“ ืœื™ืฆื•ืจ ื‘ื•ื˜ ื‘ืืžืฆืขื•ืช C# ื‘-.NET Core ื•ื›ื™ืฆื“ ืœื”ืคืขื™ืœ ืื•ืชื• ืขืœ ืฉืจืช ืžืจื•ื—ืง.

ื”ืžืืžืจ ื™ื•ืจื›ื‘ ืžืจืงืข, ืฉืœื‘ ื”ื›ื ื”, ื›ืชื™ื‘ืช ืœื•ื’ื™ืงื” ื•ื”ืขื‘ืจืช ื”ื‘ื•ื˜ ืœืฉืจืช ืžืจื•ื—ืง.

ืื ื™ ืžืงื•ื•ื” ืฉืžืืžืจ ื–ื” ื™ืขื–ื•ืจ ืœืžืชื—ื™ืœื™ื ืจื‘ื™ื.

ืคืจื”ื™ืกื˜ื•ืจื™ื”

ื”ื›ืœ ื”ืชื—ื™ืœ ื‘ืœื™ืœ ืกืชื™ื• ืื—ื“ ืœืœื ืฉื™ื ื” ืฉื‘ื™ืœื™ืชื™ ื‘ืฉืจืช ื”ื“ื™ืกืงื•ืจื“. ืžืื– ืฉื”ืฆื˜ืจืคืชื™ ืืœื™ื• ืœืื—ืจื•ื ื”, ื”ืชื—ืœืชื™ ืœืœืžื•ื“ ืื•ืชื• ืžืขืœื” ื•ืžื˜ื”. ืœืื—ืจ ืฉืžืฆืืชื™ ืืช ืขืจื•ืฅ ื”ื˜ืงืกื˜ "ืžืงื•ืžื•ืช ืคื ื•ื™ื™ื", ื”ืชืขื ื™ื™ื ืชื™, ืคืชื—ืชื™ ืื•ืชื• ื•ืžืฆืืชื™ ื‘ื™ืŸ ื”ื”ืฆืขื•ืช ืฉืœื ืขื ื™ื™ื ื• ืื•ืชื™, ืืœื•:

"ืžืชื›ื ืช (ืžืคืชื— ืจื•ื‘ื•ื˜)
ื“ืจื™ืฉื•ืช:

  • ื™ื“ืข ื‘ืฉืคื•ืช ืชื›ื ื•ืช;
  • ื™ื›ื•ืœืช ืœืžื™ื“ื” ืขืฆืžื™ืช.

ะŸะพะถะตะปะฐะฝะธั:

  • ื™ื›ื•ืœืช ืœื”ื‘ื™ืŸ ืงื•ื“ ืฉืœ ืื ืฉื™ื ืื—ืจื™ื;
  • ื™ื“ืข ื‘ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช DISCORD.

ืžื˜ืจื•ืช:

  • ืคื™ืชื•ื— ื‘ื•ื˜ื™ื;
  • ืชืžื™ื›ื” ื•ืชื—ื–ื•ืงื” ืฉืœ ื”ื‘ื•ื˜.

ื”ื™ืชืจื•ืŸ ืฉืœืš:

  • ื”ื–ื“ืžื ื•ืช ืœืชืžื•ืš ื•ืœื”ืฉืคื™ืข ืขืœ ื”ืคืจื•ื™ืงื˜ ืฉืืชื” ืื•ื”ื‘;
  • ืฆื‘ื™ืจืช ื ื™ืกื™ื•ืŸ ื‘ืขื‘ื•ื“ื” ื‘ืฆื•ื•ืช;
  • ื”ื–ื“ืžื ื•ืช ืœื”ืคื’ื™ืŸ ื•ืœืฉืคืจ ืžื™ื•ืžื ื•ื™ื•ืช ืงื™ื™ืžื•ืช.


ื–ื” ืขื ื™ื™ืŸ ืื•ืชื™ ืžื™ื“. ื›ืŸ, ื”ื ืœื ืฉื™ืœืžื• ืขืœ ื”ืขื‘ื•ื“ื” ื”ื–ื•, ืื‘ืœ ืœื ื“ืจืฉื• ืžืžืš ืฉื•ื ื”ืชื—ื™ื™ื‘ื•ืช, ื•ื–ื” ืœื ื™ื”ื™ื” ืžื™ื•ืชืจ ื‘ืชื™ืง. ืœื›ืŸ, ื›ืชื‘ืชื™ ืœืžื ื”ืœ ื”ืฉืจืช, ื•ื”ื•ื ื‘ื™ืงืฉ ืžืžื ื™ ืœื›ืชื•ื‘ ื‘ื•ื˜ ืฉื™ืฆื™ื’ ืืช ื”ืกื˜ื˜ื™ืกื˜ื™ืงื” ืฉืœ ื”ืฉื—ืงืŸ ื‘-World of Tanks.

ืฉืœื‘ ื”ื”ื›ื ื”

ื™ืฆื™ืจืช ื‘ื•ื˜ Discord ื‘-.NET Core ืขื ืคืจื™ืกื” ืœืฉืจืช VPS
Discrod
ืœืคื ื™ ืฉื ืชื—ื™ืœ ืœื›ืชื•ื‘ ืืช ื”ื‘ื•ื˜ ืฉืœื ื•, ืขืœื™ื ื• ืœื™ืฆื•ืจ ืื•ืชื• ืขื‘ื•ืจ Discord. ืืชื” ืฆืจื™ืš:

  1. ื”ื™ื›ื ืก ืœื—ืฉื‘ื•ืŸ ื“ื™ืกืงื•ืจื“ ะฟะพ ััั‹ะปะบะต
  2. ื‘ืœืฉื•ื ื™ืช "ื™ื™ืฉื•ืžื™ื", ืœื—ืฅ ืขืœ ื›ืคืชื•ืจ "ื™ื™ืฉื•ื ื—ื“ืฉ" ื•ืฉื ืœื‘ื•ื˜
  3. ืงื‘ืœ ืืกื™ืžื•ืŸ ื‘ื•ื˜ ืขืœ ื™ื“ื™ ื›ื ื™ืกื” ืœื‘ื•ื˜ ืฉืœืš ื•ืžืฆื™ืืช ื”ื›ืจื˜ื™ืกื™ื™ื” "ื‘ื•ื˜" ื‘ืจืฉื™ืžืช "ื”ื’ื“ืจื•ืช"
  4. ืฉืžื•ืจ ืืช ื”ืืกื™ืžื•ืŸ ืื™ืคืฉื”ื•

Wargaming

ื›ืžื• ื›ืŸ, ืขืœื™ืš ืœื™ืฆื•ืจ ืืคืœื™ืงืฆื™ื” ื‘-Wargaming ื›ื“ื™ ืœืงื‘ืœ ื’ื™ืฉื” ืœ-Wargaming API. ื’ื ื›ืืŸ ื”ื›ืœ ืคืฉื•ื˜:

  1. ื”ื™ื›ื ืก ืœื—ืฉื‘ื•ืŸ Wargaming ืฉืœืš ืขืœ ื™ื“ื™ ืงื™ืฉื•ืจ ื–ื”
  2. ื ืขื‘ื•ืจ ืœ"ื”ืืคืœื™ืงืฆื™ื•ืช ืฉืœื™" ื•ื ืœื—ืฅ ืขืœ ื›ืคืชื•ืจ "ื”ื•ืกืฃ ืืคืœื™ืงืฆื™ื” ื—ื“ืฉื”", ื ื•ืชืŸ ืืช ืฉื ื”ืืคืœื™ืงืฆื™ื” ื•ื‘ื—ืจ ืืช ืกื•ื’ื”
  3. ืฉืžื™ืจืช ืžื–ื”ื” ื”ืืคืœื™ืงืฆื™ื”

ืชื•ื›ื ื”

ื™ืฉ ื›ื‘ืจ ื—ื•ืคืฉ ื‘ื—ื™ืจื”. ืžื™ืฉื”ื• ืžืฉืชืžืฉ ื‘-Visual Studio, ืžื™ืฉื”ื• ื‘-Rider, ืžื™ืฉื”ื• ื”ื•ื ื‘ื“ืจืš ื›ืœืœ ื—ื–ืง, ื•ื›ื•ืชื‘ ืงื•ื“ ื‘-Vim (ืื—ืจื™ ื”ื›ืœ, ืžืชื›ื ืชื™ื ืืžื™ืชื™ื™ื ืžืฉืชืžืฉื™ื ืจืง ื‘ืžืงืœื“ืช, ื ื›ื•ืŸ?). ืขื ื–ืืช, ื›ื“ื™ ืœื ืœื™ื™ืฉื ืืช Discord API, ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืกืคืจื™ื™ืช C# ื”ืœื ืจืฉืžื™ืช "DSharpPlus". ืืชื” ื™ื›ื•ืœ ืœื”ืชืงื™ืŸ ืื•ืชื• ืž-NuGet, ืื• ืขืœ ื™ื“ื™ ื‘ื ื™ื™ืช ื”ืžืงื•ืจื•ืช ื‘ืขืฆืžืš ืžื”ืžืื’ืจ.

ืœืžื™ ืฉืœื ื™ื•ื“ืข ืื• ืฉื›ื— ืื™ืš ืœื”ืชืงื™ืŸ ืืคืœื™ืงืฆื™ื•ืช ืž-NuGet.ื”ื•ืจืื•ืช ืขื‘ื•ืจ Visual Studio

  1. ืขื‘ื•ืจ ืœืœืฉื•ื ื™ืช ืคืจื•ื™ืงื˜ - ื ื™ื”ื•ืœ ื—ื‘ื™ืœื•ืช NuGet;
  2. ืœื—ืฅ ืขืœ ื”ื‘ื™ืงื•ืจืช ื•ื‘ืฉื“ื” ื”ื—ื™ืคื•ืฉ ื”ื–ืŸ "DSharpPlus";
  3. ื‘ื—ืจ ื•ื”ืชืงืŸ ืืช ื”ืžืกื’ืจืช;
  4. ืจื•ื•ื—!

ืฉืœื‘ ื”ื”ื›ื ื” ื”ืกืชื™ื™ื, ืืชื” ื™ื›ื•ืœ ืœื”ืžืฉื™ืš ืœื›ืชื™ื‘ืช ื”ื‘ื•ื˜.

ื”ื™ื’ื™ื•ืŸ ื›ืชื™ื‘ื”

ื™ืฆื™ืจืช ื‘ื•ื˜ Discord ื‘-.NET Core ืขื ืคืจื™ืกื” ืœืฉืจืช VPS

ืœื ื ืฉืงื•ืœ ืืช ื›ืœ ื”ื”ื™ื’ื™ื•ืŸ ืฉืœ ื”ืืคืœื™ืงืฆื™ื”, ืื ื™ ืจืง ืืจืื” ืื™ืš ืขื•ื‘ื“ื™ื ืขื ื™ื™ืจื•ื˜ ื”ื•ื“ืขื•ืช ืขืœ ื™ื“ื™ ื”ื‘ื•ื˜, ื•ืื™ืš ืขื•ื‘ื“ื™ื ืขื Wargaming API.

ื”ืขื‘ื•ื“ื” ืขื ื”ื‘ื•ื˜ ืฉืœ 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
});

ืื™ืคื” ื”ืืกื™ืžื•ืŸ ื”ื•ื ื”ืืกื™ืžื•ืŸ ืฉืœ ื”ื‘ื•ื˜ ืฉืœืš.
ืœืื—ืจ ืžื›ืŸ, ื“ืจืš ื”ืœืžื‘ื“ื”, ืื ื• ื›ื•ืชื‘ื™ื ืืช ื”ืคืงื•ื“ื•ืช ื”ื“ืจื•ืฉื•ืช ืฉื”ื‘ื•ื˜ ืฆืจื™ืš ืœื‘ืฆืข:

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

ืชืฉื•ืžืช ื”ืœื‘! ื‘ื”ื—ืœื˜ ืœื ืžื•ืžืœืฅ ืœืื—ืกืŸ ืืช ื›ืœ ื”ืืกื™ืžื•ื ื™ื ื•ืžื–ื”ื™ ื”ืืคืœื™ืงืฆื™ื” ื‘ื˜ืงืกื˜ ื‘ืจื•ืจ! ืœื›ืœ ื”ืคื—ื•ืช, ื“ื™ืกืงื•ืจื“ ืื•ืกืจ ืขืœ ืืกื™ืžื•ื ื™ื ื›ืืœื” ื›ืฉื”ื ื ื›ื ืกื™ื ืœืจืฉืช ื”ืขื•ืœืžื™ืช, ื•ืœื›ืœ ื”ื™ื•ืชืจ, ื”ื‘ื•ื˜ ืžืชื—ื™ืœ ืœื”ื™ื•ืช ื‘ืฉื™ืžื•ืฉ ืขืœ ื™ื“ื™ ืชื•ืงืคื™ื.

ืคืจื™ืกื” ืœ-VPS - ืฉืจืช

ื™ืฆื™ืจืช ื‘ื•ื˜ Discord ื‘-.NET Core ืขื ืคืจื™ืกื” ืœืฉืจืช VPS

ืœืื—ืจ ืฉืชืกื™ื™ื ืขื ื”ื‘ื•ื˜, ื”ื•ื ืฆืจื™ืš ืœื”ืชืืจื— ื‘ืฉืจืช ืฉืคื•ืขืœ ื›ืœ ื”ื–ืžืŸ 24/7. ื–ืืช ื‘ืฉืœ ื”ืขื•ื‘ื“ื” ืฉื›ืืฉืจ ื”ืืคืœื™ืงืฆื™ื” ืฉืœืš ืคื•ืขืœืช, ื’ื ื”ื‘ื•ื˜ ืคื•ืขืœ. ื‘ืจื’ืข ืฉืืชื” ืžื›ื‘ื” ืืช ื”ืืคืœื™ืงืฆื™ื”, ื’ื ื”ื‘ื•ื˜ ืฉืœืš ื ืจื“ื.

ืฉืจืชื™ VPS ืจื‘ื™ื ืงื™ื™ืžื™ื ื‘ืขื•ืœื ื”ื–ื”, ื’ื ื‘-Windows ื•ื’ื ื‘ืœื™ื ื•ืงืก, ืขื ื–ืืช, ื‘ืจื•ื‘ ื”ืžืงืจื™ื, ื”ืจื‘ื” ื™ื•ืชืจ ื–ื•ืœ ืœืืจื— ื‘ืœื™ื ื•ืงืก.

ื‘ืฉืจืช ื”ื“ื™ืกืงื•ืจื“ ื™ืขืฆื• ืœื™ ืขืœ vscale.io ื•ืžื™ื“ ื™ืฆืจืชื™ ืขืœื™ื• ืฉืจืช ื•ื™ืจื˜ื•ืืœื™ ื‘ืื•ื‘ื•ื ื˜ื• ื•ื”ืขืœื™ืชื™ ืืช ื”ื‘ื•ื˜. ืœื ืืชืืจ ืื™ืš ื”ืืชืจ ื”ื–ื” ืขื•ื‘ื“, ืืœื ืืขื‘ื•ืจ ื™ืฉืจ ืœื”ื’ื“ืจื•ืช ื”ื‘ื•ื˜.

ืงื•ื“ื ื›ืœ, ืขืœื™ืš ืœื”ืชืงื™ืŸ ืืช ื”ืชื•ื›ื ื” ื”ื“ืจื•ืฉื” ืฉืชืคืขื™ืœ ืืช ื”ื‘ื•ื˜ ืฉืœื ื• ืฉื ื›ืชื‘ ื‘-.NET Core. ื›ื™ืฆื“ ืœืขืฉื•ืช ื–ืืช ืžืชื•ืืจ ื›ืืŸ.

ืœืื—ืจ ืžื›ืŸ, ืขืœื™ืš ืœื”ืขืœื•ืช ืืช ื”ื‘ื•ื˜ ืœืฉื™ืจื•ืช Git, ื›ืžื• GitHub ื•ื›ื“ื•ืžื”, ื•ืœืฉื›ืคืœ ืื•ืชื• ืœืฉืจืช VPS, ืื• ืœื”ื•ืจื™ื“ ืืช ื”ื‘ื•ื˜ ืฉืœืš ื‘ื“ืจื›ื™ื ืื—ืจื•ืช. ืฉื™ื ืœื‘ ืฉืชื”ื™ื” ืœืš ืจืง ืงื•ื ืกื•ืœื”, ืœืœื GUI. ื‘ื›ืœืœ.

ืœืื—ืจ ืฉื”ื•ืจื“ืช ืืช ื”ื‘ื•ื˜ ืฉืœืš, ืขืœื™ืš ืœื”ืคืขื™ืœ ืื•ืชื•. ื‘ืฉื‘ื™ืœ ื–ื”, ืืชื” ืฆืจื™ืš:

  • ืฉื—ื–ืจ ืืช ื›ืœ ื”ืชืœื•ืช: ืฉื—ื–ื•ืจ dotnet
  • ื‘ื ื™ื™ืช ื™ื™ืฉื•ื: dotnet build name_project.sln -c ืฉื—ืจื•ืจ
  • ืขื‘ื•ืจ ืืœ DLL ื‘ื ื•ื™;
  • dotnet name_of_file.dll

ืžื–ืœ ื˜ื•ื‘! ื”ื‘ื•ื˜ ืฉืœืš ืคื•ืขืœ. ืขื ื–ืืช, ื”ื‘ื•ื˜, ืœืžืจื‘ื” ื”ืฆืขืจ, ืชื•ืคืก ืืช ื”ืงื•ื ืกื•ืœื”, ื•ืœื ืงืœ ืœืฆืืช ืžืฉืจืช ื”-VPS. ื›ืžื• ื›ืŸ, ื‘ืžืงืจื” ืฉืœ ื”ืคืขืœื” ืžื—ื“ืฉ ืฉืœ ื”ืฉืจืช, ืชืฆื˜ืจืš ืœื”ืคืขื™ืœ ืืช ื”ื‘ื•ื˜ ื‘ืฆื•ืจื” ื—ื“ืฉื”. ื™ืฉื ืŸ ื›ืžื” ื“ืจื›ื™ื ืœืฆืืช ืžื”ืžืฆื‘. ื›ื•ืœื ืงืฉื•ืจื™ื ืœื”ืคืขืœื” ื‘ืขืช ื”ืคืขืœืช ื”ืฉืจืช:

  • ื”ื•ืกืฃ ืกืงืจื™ืคื˜ ื”ืคืขืœื” ืœ-/etc/init.d
  • ืฆื•ืจ ืฉื™ืจื•ืช ืฉื™ืคืขืœ ื‘ืขืช ื”ื”ืคืขืœื”.

ืื ื™ ืœื ืจื•ืื” ื˜ืขื ืœื”ืชืขื›ื‘ ืขืœื™ื”ื ื‘ืคื™ืจื•ื˜, ื”ื›ืœ ืžืชื•ืืจ ื‘ืคื™ืจื•ื˜ ืžืกืคื™ืง ื‘ืื™ื ื˜ืจื ื˜.

ืžืžืฆืื™ื

ืื ื™ ืฉืžื— ืฉืœืงื—ืชื™ ืขืœ ืขืฆืžื™ ืืช ื”ืžืฉื™ืžื” ื”ื–ื•. ื–ื” ื”ื™ื” ื”ื ื™ืกื™ื•ืŸ ื”ืจืืฉื•ืŸ ืฉืœื™ ื‘ืคื™ืชื•ื— ื‘ื•ื˜ื™ื, ื•ืื ื™ ืฉืžื— ืฉืงื™ื‘ืœืชื™ ื™ื“ืข ื—ื“ืฉ ื‘-C# ื•ืขื‘ื•ื“ื” ืขื ืœื™ื ื•ืงืก.

ืงื™ืฉื•ืจ ืœืฉืจืช ื“ื™ืกืงื•ืจื“. ืœืžื™ ืฉืžืฉื—ืง ืžืฉื—ืงื™ Wargaming.
ืงื™ืฉื•ืจ ืœืžืื’ืจ ืฉื‘ื• ื ืžืฆื ื”ื‘ื•ื˜ ืฉืœ Discord.
ืงื™ืฉื•ืจ ืœืžืื’ืจ DSharpPlus.
ืชื•ื“ื” ืœืš!

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”