在 .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 存储库。
谢谢你!

来源: habr.com

添加评论