Discord 斜杠命令
Discord 有一个名为斜杠命令的新功能。它允许您键入
/
,然后是命令名称来执行一些操作。例如,您可以键入
/giphy cats
(内置命令)以获取一些猫的 GIF 图像。
Discord 斜杠命令通过向 URL 发出请求来工作,每当有人发出命令时。您无需一直运行应用程序以使斜杠命令起作用,这使得 Deno Deploy 成为构建此类命令的理想解决方案。
在本篇文章中,让我们看看如何使用 Deno Deploy 构建一个你好世界斜杠命令。
步骤 1: 在 Discord 开发者门户上创建应用程序
- 转到 https://discord.com/developers/applications (如果需要,请使用您的 Discord 帐户登录)。
- 单击您的个人资料图片左侧可用的新应用程序按钮。
- 命名您的应用程序,然后单击创建。
- 转到机器人部分,单击添加机器人,最后单击是的,执行!以确认。
就这样。一个新的应用程序被创建,将保存我们的斜杠命令。不要关闭选项卡,因为我们需要从此应用程序页面获取信息,贯穿整个开发过程。
步骤 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 请求。
转到 https://dash.deno.com/new 并在Playground卡下单击Play。
在下一页中,在编辑器中,单击顶部菜单上的设置图标。在弹出的模态对话框中,选择+添加变量。
将
DISCORD_PUBLIC_KEY
输入为键。VALUE 应为 Discord 应用程序页面的通用信息部分中提供的公钥。将以下代码复制并粘贴到编辑器中:
// 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) 上与我们分享。