VPS ์„œ๋ฒ„์— ๋ฐฐํฌํ•˜์—ฌ .NET Core์—์„œ Discord ๋ด‡ ๋งŒ๋“ค๊ธฐ

VPS ์„œ๋ฒ„์— ๋ฐฐํฌํ•˜์—ฌ .NET Core์—์„œ Discord ๋ด‡ ๋งŒ๋“ค๊ธฐ

์•ˆ๋…• ํ•˜๋ธŒ๋กœ๋น„ํ…Œ์Šค!

์˜ค๋Š˜์€ .NET Core์—์„œ C#์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ด‡์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๊ณผ ์›๊ฒฉ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ์‚ฌ๋ฅผ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ์‚ฌ๋Š” ๋ฐฐ๊ฒฝ, ์ค€๋น„ ๋‹จ๊ณ„, ๋…ผ๋ฆฌ ์ž‘์„ฑ ๋ฐ ๋ด‡์„ ์›๊ฒฉ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ด ๊ธ€์ด ๋งŽ์€ ์ดˆ๋ณด์ž๋“ค์—๊ฒŒ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

์„ ์‚ฌ ์‹œ๋Œ€

์ด ๋ชจ๋“  ๊ฒƒ์€ ๋‚ด๊ฐ€ Discord ์„œ๋ฒ„์—์„œ ๋ณด๋‚ธ ์ž  ๋ชป ์ด๋ฃจ๋Š” ๊ฐ€์„ ๋ฐค์— ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ์— ๊ทธ์™€ ํ•ฉ๋ฅ˜ํ•œ ์ดํ›„๋กœ ๊ทธ๋ฅผ ์œ„์•„๋ž˜๋กœ ์—ฐ๊ตฌํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ ์ฑ„๋„ "๊ณต์„"์„ ์ฐพ์€ ํ›„ ๊ด€์‹ฌ์„ ๊ฐ–๊ณ  ์—ด์—ˆ๊ณ  ๊ด€์‹ฌ์ด์—†๋Š” ์ œ์•ˆ ์ค‘์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

"ํ”„๋กœ๊ทธ๋ž˜๋จธ(๋ด‡ ๊ฐœ๋ฐœ์ž)
์š”๊ตฌ ์‚ฌํ•ญ :

  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋Œ€ํ•œ ์ง€์‹;
  • ์ž๊ธฐ ํ•™์Šต ๋Šฅ๋ ฅ.

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

  • ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋Šฅ๋ ฅ;
  • DISCORD ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ง€์‹.

๋ชฉํ‘œ :

  • ๋ด‡ ๊ฐœ๋ฐœ;
  • ๋ด‡์˜ ์ง€์› ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ.

๊ท€ํ•˜์˜ ํ˜œํƒ:

  • ์›ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์›ํ•˜๊ณ  ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ
  • ํŒ€์—์„œ ์ผํ•˜๋Š” ๊ฒฝํ—˜์„ ์Œ“๋Š” ๊ฒƒ;
  • ๊ธฐ์กด ๊ธฐ์ˆ ์„ ์‹œ์—ฐํ•˜๊ณ  ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ.


์ด๊ฒƒ์€ ์ฆ‰์‹œ ๊ด€์‹ฌ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ์˜ˆ, ๊ทธ๋“ค์€์ด ์ž‘์—…์— ๋Œ€ํ•œ ๋น„์šฉ์„ ์ง€๋ถˆํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๊ท€ํ•˜์—๊ฒŒ ์–ด๋– ํ•œ ์˜๋ฌด๋„ ์š”๊ตฌํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ ํฌํŠธํด๋ฆฌ์˜ค์—์„œ ๋ถˆํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์„œ๋ฒ„ ๊ด€๋ฆฌ์ž์—๊ฒŒ ํŽธ์ง€๋ฅผ ์ผ๊ณ  ๊ทธ๋Š” World of Tanks์—์„œ ํ”Œ๋ ˆ์ด์–ด์˜ ํ†ต๊ณ„๋ฅผ ๋ณด์—ฌ์ค„ ๋ด‡์„ ์ž‘์„ฑํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค.

์ค€๋น„ ๋‹จ๊ณ„

VPS ์„œ๋ฒ„์— ๋ฐฐํฌํ•˜์—ฌ .NET Core์—์„œ Discord ๋ด‡ ๋งŒ๋“ค๊ธฐ
๋””์Šค๋กœ๋“œ
๋ด‡ ์ž‘์„ฑ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— Discord์šฉ์œผ๋กœ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋””์Šค์ฝ”๋“œ ๊ณ„์ •์— ๋กœ๊ทธ์ธ ๋งํฌ
  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. ์ด์ต!

์ค€๋น„ ๋‹จ๊ณ„๊ฐ€ ๋๋‚˜๋ฉด ๋ด‡ ์ž‘์„ฑ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ผ๋ฆฌ ์ž‘์„ฑ

VPS ์„œ๋ฒ„์— ๋ฐฐํฌํ•˜์—ฌ .NET Core์—์„œ Discord ๋ด‡ ๋งŒ๋“ค๊ธฐ

์šฐ๋ฆฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์ฒด ๋กœ์ง์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ๋ด‡์ด ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€๋กœ์ฑ„๋Š” ๋ฐฉ๋ฒ•๊ณผ 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;
        }

์ฃผ๋ชฉ! ๋ชจ๋“  ํ† ํฐ๊ณผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ID๋ฅผ ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ์ ˆ๋Œ€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ์ตœ์†Œํ•œ Discord๋Š” ์ด๋Ÿฌํ•œ ํ† ํฐ์ด ์ „ ์„ธ๊ณ„ ๋„คํŠธ์›Œํฌ์— ๋“ค์–ด๊ฐˆ ๋•Œ ๊ธˆ์ง€ํ•˜๊ณ  ์ตœ๋Œ€๋กœ ๊ณต๊ฒฉ์ž๊ฐ€ ๋ด‡์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

VPS์— ๋ฐฐํฌ - ์„œ๋ฒ„

VPS ์„œ๋ฒ„์— ๋ฐฐํฌํ•˜์—ฌ .NET Core์—์„œ Discord ๋ด‡ ๋งŒ๋“ค๊ธฐ

๋ด‡ ์ž‘์—…์„ ๋งˆ์น˜๋ฉด 24/7 ์ง€์†์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์„œ๋ฒ„์—์„œ ํ˜ธ์ŠคํŒ…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰ ์ค‘์ผ ๋•Œ ๋ด‡๋„ ์‹คํ–‰ ์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋„์ž๋งˆ์ž ๋ด‡๋„ ์ž ์ด ๋“ญ๋‹ˆ๋‹ค.

์ด ์„ธ์ƒ์—๋Š” Windows์™€ Linux ๋ชจ๋‘์— ๋งŽ์€ VPS ์„œ๋ฒ„๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ Linux์—์„œ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ €๋ ดํ•ฉ๋‹ˆ๋‹ค.

๋””์Šค์ฝ”๋“œ ์„œ๋ฒ„์—์„œ vscale.io๋กœ ์กฐ์–ธ์„ ๋ฐ›์•˜๊ณ , ๋ฐ”๋กœ ๊ทธ ์œ„์— ์šฐ๋ถ„ํˆฌ์— ๊ฐ€์ƒ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ณ  ๋ด‡์„ ์—…๋กœ๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์‚ฌ์ดํŠธ์˜ ์ž‘๋™ ๋ฐฉ์‹์€ ์„ค๋ช…ํ•˜์ง€ ์•Š๊ณ  ๋ด‡ ์„ค์ •์œผ๋กœ ๋ฐ”๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € .NET Core๋กœ ์ž‘์„ฑ๋œ ๋ด‡์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜ํ–‰ ๋ฐฉ๋ฒ•์€ ์—ฌ๊ธฐ์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค..

๋‹ค์Œ์œผ๋กœ GitHub ๋“ฑ๊ณผ ๊ฐ™์€ Git ์„œ๋น„์Šค์— ๋ด‡์„ ์—…๋กœ๋“œํ•˜๊ณ  VPS ์„œ๋ฒ„์— ๋ณต์ œํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ด‡์„ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฝ˜์†”๋งŒ ์žˆ๊ณ  GUI๋Š” ์—†๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ์กฐ๊ธˆ๋„.

๋ด‡์„ ๋‹ค์šด๋กœ๋“œํ•œ ํ›„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ์ข…์†์„ฑ ๋ณต์›: dotnet restore
  • ๋นŒ๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜: dotnet build name_project.sln -c Release
  • ๋นŒ๋“œ๋œ DLL๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ท๋„ท ์ด๋ฆ„_of_file.dll

์ถ•ํ•˜ํ•ด์š”! ๋ด‡์ด ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„์‰ฝ๊ฒŒ๋„ ๋ด‡์ด ์ฝ˜์†”์„ ์ ์œ ํ•˜๊ณ  ์žˆ์–ด VPS ์„œ๋ฒ„๋ฅผ ๋น ์ ธ๋‚˜๊ฐ€๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š๋‹ค. ๋˜ํ•œ ์„œ๋ฒ„ ์žฌ์‹œ์ž‘ ์‹œ ์ƒˆ๋กœ์šด ๋ฐฉ์‹์œผ๋กœ ๋ด‡์„ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒํ™ฉ์—์„œ ๋ฒ—์–ด๋‚˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ์„œ๋ฒ„ ์‹œ์ž‘ ์‹œ ์‹œ์ž‘๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • /etc/init.d์— ์‹คํ–‰ ์Šคํฌ๋ฆฝํŠธ ์ถ”๊ฐ€
  • ์‹œ์ž‘ํ•  ๋•Œ ์‹คํ–‰ํ•  ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๋“ค์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์ƒ๊ฐํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ๋ชจ๋“  ๊ฒƒ์ด ์ธํ„ฐ๋„ท์— ์ถฉ๋ถ„ํžˆ ์ž์„ธํžˆ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์กฐ์‚ฌ ๊ฒฐ๊ณผ

์ด ์ž„๋ฌด๋ฅผ ๋งก๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚˜์˜ ์ฒซ ๋ด‡ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์ด์—ˆ๊ณ  C#์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์ง€์‹์„ ์–ป์—ˆ๊ณ  Linux๋กœ ์ž‘์—…ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

Discord ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. Wargaming ๊ฒŒ์ž„์„ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด.
Discord ๋ด‡์ด ์žˆ๋Š” ์ €์žฅ์†Œ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
DSharpPlus ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€