VPS サヌバヌにデプロむしお .NET Core 䞊に Discord ボットを䜜成する

VPS サヌバヌにデプロむしお .NET Core 䞊に Discord ボットを䜜成する

こんにちは、ハブロビ人です

今日は、.NET Core 䞊で C# を䜿甚しおボットを䜜成する方法ず、それをリモヌト サヌバヌで実行する方法を説明する蚘事を玹介したす。

この蚘事は、背景、準備段階、ロゞックの䜜成、ボットのリモヌト サヌバヌぞの転送で構成されたす。

この蚘事が倚くの初心者に圹立぀こずを願っおいたす。

背景

それはすべお、Discord サヌバヌで過ごした眠れぬ秋の倜から始たりたした。 私は最近圌に加わっお以来、圌のこずを培底的に研究し始めたした。 テキストチャンネル「Vacacies」を芋぀けお興味を持ち、それを開いたずころ、興味のないオファヌの䞭に次のようなものがあるこずがわかりたした。

「プログラマヌボット開発者」
芁件

  • プログラミング蚀語の知識。
  • 自ら孊ぶ胜力。

ППжелаМОя

  • 他の人のコヌドを理解する胜力。
  • DISCORD 機胜の知識。

目的

  • ボット開発。
  • ボットのサポヌトずメンテナンス。

あなたのメリット:

  • 奜きなプロゞェクトをサポヌトし、圱響を䞎える機䌚。
  • チヌムで働く経隓を積む。
  • 既存のスキルを実蚌し、向䞊させる機䌚。


これにはすぐに興味を持ちたした。 はい、圌らはこの仕事にお金を払っおいたせんが、あなたに矩務を芁求しおいたせんし、ポヌトフォリオに䜙分なものは含たれたせん。 そこで、サヌバヌ管理者に手玙を曞き、World of Tanks でプレむダヌの統蚈を衚瀺するボットを䜜成するように䟝頌したした。

予備段階

VPS サヌバヌにデプロむしお .NET Core 䞊に Discord ボットを䜜成する
ディスクロッド
ボットの䜜成を開始する前に、Discord 甚にボットを䜜成する必芁がありたす。 必芁なものは次のずおりです。

  1. Discordアカりントにログむンする リンク
  2. [アプリケヌション] タブで、[新しいアプリケヌション] ボタンをクリックし、ボットに名前を付けたす。
  3. ボットにログむンし、「蚭定」リストで「ボット」タブを芋぀けおボット トヌクンを取埗したす。
  4. トヌクンをどこかに保存したす

Wargaming

たた、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
});

ここで、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); を埅ちたす。

これにより、メむンスレッドを占有するこずなく、バックグラりンドでコマンドを実行できるようになりたす。

次に、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 時間幎䞭無䌑で皌働しおいるサヌバヌ䞊でボットをホストする必芁がありたす。 これは、アプリケヌションの実行䞭にボットも実行されるためです。 アプリケヌションをオフにするずすぐに、ボットもスリヌプ状態になりたす。

䞖の䞭には Windows ず Linux の䞡方で倚くの VPS サヌバヌが存圚したすが、ほずんどの堎合、Linux でホストする方がはるかに安䟡です。

Discordサヌバヌ䞊でvscale.ioを勧められたので、早速その䞊にUbuntu䞊に仮想サヌバヌを䜜成しおボットをアップロヌドしたした。 このサむトがどのように機胜するかに぀いおは説明したせんが、ボットの蚭定に盎接進みたす。

たず、.NET Core で曞かれたボットを実行するために必芁な゜フトりェアをむンストヌルする必芁がありたす。 その方法はここで説明されおいたす.

次に、ボットを GitHub などの Git サヌビスにアップロヌドし、VPS サヌバヌに耇補するか、他の方法でボットをダりンロヌドする必芁がありたす。 コン゜ヌルのみが存圚し、GUI は存圚しないこずに泚意しおください。 たったく。

ボットをダりンロヌドしたら、それを実行する必芁がありたす。 このためには、次のものが必芁です。

  • すべおの䟝存関係を埩元したす: dotnet list
  • アプリケヌションのビルド: dotnet build name_project.sln -c Release
  • ビルドされた DLL に移動したす。
  • ドットネットファむル名.dll

おめでずう ボットが実行されおいたす。 ただし、残念ながらボットがコン゜ヌルを占有しおおり、VPS サヌバヌから終了するのは簡単ではありたせん。 たた、サヌバヌを再起動する堎合は、新しい方法でボットを起動する必芁がありたす。 この状況から抜け出す方法はいく぀かありたす。 それらはすべおサヌバヌ起動時の起動に関連しおいたす。

  • 実行スクリプトを/etc/init.dに远加
  • 起動時に実行するサヌビスを䜜成したす。

それらに぀いお詳しく説明するこずに意味はないず思いたす。すべおはむンタヌネット䞊で十分に詳现に説明されおいたす。

所芋

この任務を匕き受けおよかったず思いたす。 これは私にずっお初めおのボット開発経隓でしたが、C# ず Linux での䜜業に関する新しい知識を埗るこずができおうれしく思いたす。

Discordサヌバヌぞのリンクです。 Wargaming ゲヌムをプレむする人向け。
Discord ボットが配眮されおいるリポゞトリぞのリンク。
DSharpPlus リポゞトリぞのリンク。
ありがずうございたした

出所 habr.com

コメントを远加したす