Discord是游戏玩家和社区之间交流的流行平台。不和谐的关键特征之一是它可以托管机器人的能力,该机器人可以自动化任务并为用户提供有用的服务。在本教程中,我们将仔细研究使用Typescript创建您的第一个Discord机器的步骤。
先决条件
我们开始之前,您需要以下内容:
-
Discord帐户
-
托管机器人的Discord服务器
-
安装在计算机上的node.js
设置新机器人
要创建一个新的机器人,您需要按照以下步骤操作:
1。转到Discord Developer Portal并创建一个新应用程序。
2。给您的应用程序一个名称,然后单击“创建”。
3。在左侧,单击“ bot”,然后单击“添加bot”。
4。根据需要自定义机器人的姓名和配置图片,然后单击“保存更改”。
5。在“令牌”部分下,单击“复制”以将机器人令牌复制到剪贴板。该令牌将在稍后使用以验证您的bot。
设置项目
现在我们拥有机器人的代币,让我们设置打字稿项目。按照以下步骤:
1。为您的项目创建一个新目录并导航到它。
2。运行npm init
以使用package.json
文件初始化项目。
3。安装以下软件包:
npm install discord.js dotenv
4。安装以下DEV依赖项:
npm install -D typescript tsx tsup
5。将一些脚本添加到您的package.json
:
{
"dev": "tsx watch src/index.ts",
"start": "node dist/index.js",
"build": "tsup src/index.ts --minify"
}
6。创建一个tsconfig.json
文件以配置打字稿:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"rootDir": "./src",
"outDir": "./dist",
"removeComments": true,
"resolveJsonModule": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"strictNullChecks": true,
"skipLibCheck": true
}
}
设置环境变量
为了保持敏感信息,例如我们的机器人的代币安全,我们将使用环境变量。按照以下步骤设置它们:
在项目目录的根部创建一个.env
文件。
将以下行添加到文件中,用您先前复制的bot令牌替换discord_token,并使用bot client iD clisord_client_id:
DISCORD_TOKEN=<DISCORD_TOKEN>
DISCORD_CLIENT_ID=<DISCORD_CLIENT_ID>
现在,创建一个src
文件夹和一个config.ts
文件来获取它们。
import dotenv from "dotenv";
dotenv.config();
const { DISCORD_TOKEN, DISCORD_CLIENT_ID } = process.env;
if (!DISCORD_TOKEN || !DISCORD_CLIENT_ID) {
throw new Error("Missing environment variables");
}
export const config = {
DISCORD_TOKEN,
DISCORD_CLIENT_ID,
};
创建您的第一个命令
在本教程中,我将创建一个名为Ping的命令,该命令将返回“ Pong!”。为此,您只需要导出包含有关您命令的所有信息和处理它的功能的SlashCommand数据即可。在src
文件夹内创建一个commands
文件夹,然后在其中创建一个ping.ts
文件。
import { CommandInteraction, SlashCommandBuilder } from "discord.js";
export const data = new SlashCommandBuilder()
.setName("ping")
.setDescription("Replies with Pong!");
export async function execute(interaction: CommandInteraction) {
return interaction.reply("Pong!");
}
您可以在commands
文件夹中创建一个index.ts
文件以导出一个文件中的所有命令。
import * as ping from "./ping";
export const commands = {
ping,
};
太好了!你做到了!但有一个问题。添加机器人的服务器如何知道其具有的命令?要解决此问题,我们需要向每个服务器注册所有命令。
部署您的命令
要部署您的命令,我们将创建一个deploy-commands.ts
文件,以在相应的服务器中注册命令。让我们去做:
import { REST, Routes } from "discord.js";
import { config } from "./config";
import { commands } from "./commands";
const commandsData = Object.values(commands).map((command) => command.data);
const rest = new REST({ version: "10" }).setToken(config.DISCORD_TOKEN);
type DeployCommandsProps = {
guildId: string;
};
export async function deployCommands({ guildId }: DeployCommandsProps) {
try {
console.log("Started refreshing application (/) commands.");
await rest.put(
Routes.applicationGuildCommands(config.DISCORD_CLIENT_ID, guildId),
{
body: commandsData,
}
);
console.log("Successfully reloaded application (/) commands.");
} catch (error) {
console.error(error);
}
}
初始化机器人
要初始化机器人,您可以在src
文件夹中创建bot.ts
或index.ts
文件。在本教程中,我将创建一个index.ts
。
对于机器人的工作正常,您需要遵循以下步骤:
1。创建一个新的Discord客户端,并设置其意图,以确定该机器人将接收有关的信息。在此示例中,机器人将接收有关行会,公会消息和直接消息的信息:
import { Client } from "discord.js";
const client = new Client({
intents: ["Guilds", "GuildMessages", "DirectMessages"],
});
2。当机器人准备就绪时添加台。log:
client.once("ready", () => {
console.log("Discord bot is ready! 🤖");
});
3。创建新公会时部署命令:
client.on("guildCreate", async (guild) => {
await deployCommands({ guildId: guild.id });
});
4。创建新用户互动时运行相应的命令:
client.on("interactionCreate", async (interaction) => {
if (!interaction.isCommand()) {
return;
}
const { commandName } = interaction;
if (commands[commandName as keyof typeof commands]) {
commands[commandName as keyof typeof commands].execute(interaction);
}
});
5。使用您的令牌登录客户端:
client.login(config.DISCORD_TOKEN);
在所有步骤之后,您的文件应该看起来像:
import { Client } from "discord.js";
import { config } from "./config";
import { commands } from "./commands";
import { deployCommands } from "./deploy-commands";
const client = new Client({
intents: ["Guilds", "GuildMessages", "DirectMessages"],
});
client.once("ready", () => {
console.log("Discord bot is ready! 🤖");
});
client.on("guildCreate", async (guild) => {
await deployCommands({ guildId: guild.id });
});
client.on("interactionCreate", async (interaction) => {
if (!interaction.isCommand()) {
return;
}
const { commandName } = interaction;
if (commands[commandName as keyof typeof commands]) {
commands[commandName as keyof typeof commands].execute(interaction);
}
});
client.login(config.DISCORD_TOKEN);
很好!现在,您只需要运行npm run dev
并将机器人添加到某些服务器中并在某些文本频道中使用 /ping。< /p>