在 .NET Core 上創建 Discord 機器人並部署到 VPS 服務器

在 .NET Core 上創建 Discord 機器人並部署到 VPS 服務器

你好 Khabrovites!

今天您將看到一篇文章,向您展示如何在 .NET Core 上使用 C# 創建機器人以及如何在遠程服務器上運行它。

文章將包括背景、準備階段、編寫邏輯和將機器人傳輸到遠程服務器。

我希望這篇文章能幫助很多初學者。

這一切都始於我在 Discord 服務器上度過的一個不眠的秋夜。 自從我最近加入他,我開始上下研究他。 找到文本頻道“職位空缺”後,我開始感興趣,打開它,發現我不感興趣的報價是:

“程序員(機器人開發者)
要求:

  • 編程語言知識;
  • 自學能力。

Пожелания:

  • 理解他人代碼的能力;
  • DISCORD 功能的知識。

目標:

  • 機器人開發;
  • 機器人的支持和維護。

你的好處:

  • 有機會支持和影響你喜歡的項目;
  • 獲得在團隊中工作的經驗;
  • 展示和提高現有技能的機會。


這立即引起了我的興趣。 是的,他們沒有為這項工作付費,但他們沒有要求您承擔任何義務,並且在投資組合中不會是多餘的。 因此,我寫信給服務器管理員,他讓我寫一個機器人來顯示《坦克世界》中玩家的統計數據。

準備階段

在 .NET Core 上創建 Discord 機器人並部署到 VPS 服務器
迪斯科
在我們開始編寫我們的機器人之前,我們需要為 Discord 創建它。 你需要:

  1. 登錄 Discord 帳戶 鏈接
  2. 在“應用程序”選項卡中,單擊“新建應用程序”按鈕並為機器人命名
  3. 通過登錄您的機器人並在“設置”列表中找到“機器人”選項卡來獲取機器人令牌
  4. 將令牌保存在某處

戰爭遊戲

此外,您需要在 Wargaming 中創建一個應用程序以訪問 Wargaming API。 在這裡,一切都很簡單:

  1. 登錄您的 Wargaming 帳戶 通過此鏈接
  2. 我們轉到“我的應用程序”並單擊“添加新應用程序”按鈕,給出應用程序的名稱並選擇其類型
  3. 保存應用程序 ID

軟體

已經有了選擇的自由。 有人用Visual Studio,有人用Rider,有人實力一般,用Vim寫代碼(畢竟真正的程序員只會用鍵盤,對吧?)。 但是,為了不實現 Discord API,您可以使用非官方的 C# 庫“DSharpPlus”。 您可以從 NuGet 或通過自己從存儲庫構建源來安裝它。

對於那些不知道或忘記如何從 NuGet 安裝應用程序的人。Visual Studio 說明

  1. 轉到選項卡項目 - 管理 NuGet 包;
  2. 單擊評論並在搜索字段中輸入“DSharpPlus”;
  3. 選擇並安裝框架;
  4. 利潤!

準備階段結束,可以繼續寫bot了。

寫邏輯

在 .NET Core 上創建 Discord 機器人並部署到 VPS 服務器

我們不會考慮應用程序的整個邏輯,我只會展示如何使用機器人攔截消息,以及如何使用 Wargaming API。

通過 static async Task MainTask(string[] args); 使用 Discord 機器人進行工作
要調用此函數,您需要在 Main 中註冊

MainTask(args).ConfigureAwait(false).GetAwaiter().GetResult();

接下來,您需要初始化您的機器人:

discord = new DiscordClient(new DiscordConfiguration
{
    Token = token,
    TokenType = TokenType.Bot,
    UseInternalLogHandler = true,
    LogLevel = LogLevel.Debug
});

其中 token 是您的機器人的令牌。
然後,通過 lambda,我們編寫機器人應該執行的必要命令:

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 - 服務器

在 .NET Core 上創建 Discord 機器人並部署到 VPS 服務器

一旦你完成了這個機器人,它需要託管在一個持續運行 24/7 的服務器上。 這是因為當您的應用程序運行時,機器人也在運行。 一旦您關閉應用程序,您的機器人也會睡著。

這個世界上存在許多 VPS 服務器,包括 Windows 和 Linux,但是,在大多數情況下,託管在 Linux 上要便宜得多。

在 Discord 服務器上,我被告知 vscale.io,我立即在 Ubuntu 上創建了一個虛擬服務器並上傳了機器人。 我不會描述這個網站是如何工作的,但會直接進入機器人設置。

首先,您需要安裝必要的軟件來運行我們用 .NET Core 編寫的機器人。 此處描述瞭如何操作.

接下來,您需要將機器人上傳到 Git 服務,如 GitHub 等,並將其克隆到 VPS 服務器,或者通過其他方式下載您的機器人。 請注意,您將只有一個控制台,沒有 GUI。 完全沒有。

下載機器人後,您需要運行它。 為此,您需要:

  • 恢復所有依賴項:dotnet restore
  • 構建應用程序:dotnet build name_project.sln -c Release
  • 轉到構建的 DLL;
  • dotnet 文件名.dll

恭喜! 你的機器人正在運行。 然而,不幸的是,殭屍程序佔據了控制台,退出 VPS 服務器並不容易。 此外,如果服務器重新啟動,您將必須以新方式啟動機器人。 有幾種方法可以擺脫這種情況。 所有這些都與服務器啟動時的啟動有關:

  • 將運行腳本添加到/etc/init.d
  • 創建將在啟動時運行的服務。

我看不出詳細討論它們有什麼意義,互聯網上對所有內容都進行了足夠詳細的描述。

發現

我很高興接受了這個任務。 這是我的第一次機器人開發經歷,我很高興我在 C# 和 Linux 方面獲得了新知識。

鏈接到 Discord 服務器。 對於那些玩 Wargaming 遊戲的人。
鏈接到 Discord 機器人所在的存儲庫。
鏈接到 DSharpPlus 存儲庫。
謝謝你的關注!

來源: www.habr.com

添加評論