跳到主要内容

Discord 斜杠命令

Discord 有一个名为斜杠命令的新功能。它允许您键入 /,然后是命令名称来执行一些操作。例如,您可以键入 /giphy cats(内置命令)以获取一些猫的 GIF 图像。

Discord 斜杠命令通过向 URL 发出请求来工作,每当有人发出命令时。您无需一直运行应用程序以使斜杠命令起作用,这使得 Deno Deploy 成为构建此类命令的理想解决方案。

在本篇文章中,让我们看看如何使用 Deno Deploy 构建一个你好世界斜杠命令。

步骤 1: 在 Discord 开发者门户上创建应用程序

  1. 转到 https://discord.com/developers/applications (如果需要,请使用您的 Discord 帐户登录)。
  2. 单击您的个人资料图片左侧可用的新应用程序按钮。
  3. 命名您的应用程序,然后单击创建
  4. 转到机器人部分,单击添加机器人,最后单击是的,执行!以确认。

就这样。一个新的应用程序被创建,将保存我们的斜杠命令。不要关闭选项卡,因为我们需要从此应用程序页面获取信息,贯穿整个开发过程。

步骤 2: 在 Discord 应用程序中注册斜杠命令

在我们可以编写代码之前,我们需要使用 Discord 端点来注册应用程序中的斜杠命令。

BOT_TOKEN 填充为机器人部分提供的令牌,将 CLIENT_ID 填充为页面的通用信息部分提供的 ID,并在终端上运行以下命令。

BOT_TOKEN='replace_me_with_bot_token'
CLIENT_ID='replace_me_with_client_id'
curl -X POST \
-H 'Content-Type: application/json' \
-H "Authorization: Bot $BOT_TOKEN" \
-d '{"name":"hello","description":"Greet a person","options":[{"name":"name","description":"The name of the person","type":3,"required":true}]}' \
"https://discord.com/api/v8/applications/$CLIENT_ID/commands"

这将注册一个名为 hello 的斜杠命令,接受一个名为 name 的字符串类型参数。

步骤 3: 创建并部署 Deno Deploy 上的你好世界斜杠命令

接下来,我们需要创建一个服务器,以响应 Discord 在发出某人的斜杠命令时发出的 POST 请求。

  1. 转到 https://dash.deno.com/new 并在Playground卡下单击Play

  2. 在下一页中,在编辑器中,单击顶部菜单上的设置图标。在弹出的模态对话框中,选择+添加变量

  3. DISCORD_PUBLIC_KEY 输入为键。VALUE 应为 Discord 应用程序页面的通用信息部分中提供的公钥。

  4. 将以下代码复制并粘贴到编辑器中:

    // Sift 是一个小型路由库,它抽象了启动端口监听器等详细信息,并提供了一个简单的函数(serve),
    // 用于为特定路径调用函数的 API。
    import {
    json,
    serve,
    validateRequest,
    } from "https://deno.land/x/sift@0.6.0/mod.ts";
    // TweetNaCl 是我们用来验证来自 Discord 的请求的密码库。
    import nacl from "https://cdn.skypack.dev/tweetnacl@v1.0.3?dts";

    // 对于所有对 "/" 端点的请求,我们希望调用 home() 处理程序。
    serve({
    "/": home,
    });

    // Discord 斜杠命令的主要逻辑在此函数中定义。
    async function home(request: Request) {
    // validateRequest() 确保请求是 POST 方法,并且具有以下标头。
    const { error } = await validateRequest(request, {
    POST: {
    headers: ["X-Signature-Ed25519", "X-Signature-Timestamp"],
    },
    });
    if (error) {
    return json({ error: error.message }, { status: error.status });
    }

    // verifySignature() 验证请求是否来自 Discord。
    // 当请求的签名无效时,我们返回 401,这很重要,因为 Discord 会发送无效请求来测试我们的验证。
    const { valid, body } = await verifySignature(request);
    if (!valid) {
    return json(
    { error: "Invalid request" },
    {
    status: 401,
    },
    );
    }

    const { type = 0, data = { options: [] } } = JSON.parse(body);
    // Discord 执行 Ping 交互以测试我们的应用程序。
    // 请求中的 Type 1 意味着 Ping 交互。
    if (type === 1) {
    return json({
    type: 1, // 响应中的 Type 1 是 Pong 交互响应类型。
    });
    }

    // 请求中的 Type 2 是 ApplicationCommand 交互。
    // 它意味着用户发出了一个命令。
    if (type === 2) {
    const { value } = data.options.find((option) => option.name === "name");
    return json({
    // 响应中的 Type 4 包含下面的消息,保留用户的输入在顶部。
    type: 4,
    data: {
    content: `你好,${value}`,
    },
    });
    }

    // 我们将返回一个坏请求错误,因为有效的 Discord 请求不应该到达这里。
    return json({ error: "bad request" }, { status: 400 });
    }

    /** 验证请求是否来

自 Discord。 */ async function verifySignature( request: Request, ): Promise<{ valid: boolean; body: string }> { const PUBLIC_KEY = Deno.env.get("DISCORD_PUBLIC_KEY")!; // Discord 在每个请求中发送这些标头。 const signature = request.headers.get("X-Signature-Ed25519")!; const timestamp = request.headers.get("X-Signature-Timestamp")!; const body = await request.text(); const valid = nacl.sign.detached.verify( new TextEncoder().encode(timestamp + body), hexToUint8Array(signature), hexToUint8Array(PUBLIC_KEY), );

return { valid, body };

}

/* 将十六进制字符串转换为 Uint8Array。 / function hexToUint8Array(hex: string) { return new Uint8Array( hex.match(/.{1,2}/g)!.map((val) => parseInt(val, 16)), ); }

5. 单击**保存并部署**以部署服务器
6. 一旦文件已经部署,注意项目 URL。它将位于编辑器右上角,以 `.deno.dev` 结尾。

## **步骤 3:** 配置 Discord 应用程序以将我们的 URL 用作交互端点 URL

1. 返回 Discord Developer Portal 上 Discord 应用程序(Greeter)页面
2. 在**通用信息**部分填写**交互端点 URL**字段与上面 Deno Deploy 项目 URL 并单击**保存更改**。

应用程序现在已准备好。让我们继续到下一节来安装它。

## **步骤 4:** 在您的 Discord 服务器上安装斜杠命令

因此,为了使用 `hello` 斜杠命令,我们需要在我们的 Discord 服务器上安装我们的 Greeter 应用程序。以下是步骤:

1. 转到 Discord Developer Portal 上 Discord 应用程序页面的**OAuth2**部分
2. 选择 `applications.commands` 范围并单击下方的**复制**按钮。
3. 现在在浏览器中粘贴并访问 URL。选择您的服务器,然后单击**授权**。

打开 Discord,键入 `/hello Deno Deploy`,然后按**输入**。输出将如下所示。

![Hello, Deno Deploy!](../docs-images/discord-slash-command.png)

恭喜您完成本教程!继续构建一些令人惊叹的 Discord 斜杠命令!并在 [Deno Discord 服务器的 deploy 频道](https://discord.gg/deno) 上与我们分享。