使用 TypeScript 创建你的第一个 Discord 机器人

2025-06-05

使用 TypeScript 创建你的第一个 Discord 机器人

Discord 是一个流行的游戏玩家和社区交流平台。Discord 的一大关键功能是能够托管机器人,这些机器人可以自动执行任务并为用户提供实用的服务。在本教程中,我们将逐步介绍如何使用 TypeScript 创建你的第一个 Discord 机器人。

先决条件

在开始之前,您需要具备以下条件:

设置新机器人

要创建新的机器人,您需要按照以下步骤操作:

1. 转到Discord 开发者门户并创建一个新的应用程序。

Discord 开发者门户截图

2. 为您的应用程序命名,然后单击“创建”。

新 Discord 应用程序对话框截图

3. 复制您的应用程序 ID,选择并复制或直接单击“复制”按钮。

Discord 应用程序

4. 在左侧点击“Bot”,然后点击“添加Bot”。

Discord 应用程序

5. 根据需要自定义机器人的名称和个人资料图片,然后单击“保存更改”。

6. 在“令牌”部分下,点击“复制”,将机器人的令牌复制到剪贴板。此令牌稍后将用于验证您的机器人。

Discord 应用程序

设置项目

现在我们有了机器人的令牌和应用程序客户端 ID,接下来让我们设置 TypeScript 项目。请按照以下步骤操作:

1. 为您的项目创建一个新目录并导航到该目录。

2. 运行npm init以使用文件初始化您的项目package.json

3.安装以下软件包:



npm install discord.js dotenv


Enter fullscreen mode Exit fullscreen mode

4.安装以下开发依赖项:



npm install -D typescript tsx tsup


Enter fullscreen mode Exit fullscreen mode

5. 添加一些脚本到你的package.json



{
  "dev": "tsx watch src/index.ts",
  "start": "node dist/index.js",
  "build": "tsup src/index.ts --minify"
}


Enter fullscreen mode Exit fullscreen mode

6.创建一个tsconfig.json文件来配置TypeScript:



{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "rootDir": "./src",
    "outDir": "./dist",
    "removeComments": true,
    "resolveJsonModule": true,
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "strictNullChecks": true,
    "skipLibCheck": true
  }
}


Enter fullscreen mode Exit fullscreen mode

设置环境变量

为了确保机器人令牌等敏感信息的安全,我们将使用环境变量。请按照以下步骤进行设置:

.env在项目目录的根目录中创建一个文件。

将以下行添加到文件,将 DISCORD_TOKEN 替换为您之前复制的机器人令牌,将 DISCORD_CLIENT_ID 替换为机器人客户端 ID:



DISCORD_TOKEN=<DISCORD_TOKEN>
DISCORD_CLIENT_ID=<DISCORD_CLIENT_ID>


Enter fullscreen mode Exit fullscreen mode

现在,创建一个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,
};


Enter fullscreen mode Exit fullscreen mode

创建您的第一个命令

在本教程中,我将创建一个名为 ping 的命令,它将返回“Pong!”。为此,您只需导出一个 SlashCommand 数据,其中包含有关该命令的所有信息以及一个处理该命令的函数。commands在该文件夹中创建一个文件夹,并在其中src创建一个文件。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!");
}


Enter fullscreen mode Exit fullscreen mode

您可以在文件夹内创建一个index.ts文件commands,将所有命令导出到一个文件中。



import * as ping from "./ping";

export const commands = {
  ping,
};


Enter fullscreen mode Exit fullscreen mode

太棒了!你做到了!但是还有一个问题。机器人所添加的服务器如何知道它拥有的命令?为了解决这个问题,我们需要将所有命令注册到每个服务器。

部署你的命令

为了部署你的命令,我们将创建一个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);
  }
}


Enter fullscreen mode Exit fullscreen mode

初始化你的机器人

要初始化你的机器人,你可以在文件夹中创建一个bot.tsindex.ts文件src。在本教程中,我将创建一个index.ts

为了使机器人正常工作,您需要遵循以下步骤:

1. 创建一个新的 Discord 客户端,并设置其意图,以确定机器人将接收哪些事件的信息。在此示例中,机器人将接收有关公会、公会消息和私信的信息:



import { Client } from "discord.js";

const client = new Client({
  intents: ["Guilds", "GuildMessages", "DirectMessages"],
});


Enter fullscreen mode Exit fullscreen mode

2. 当机器人准备就绪时添加 console.log:



client.once("ready", () => {
  console.log("Discord bot is ready! 🤖");
});


Enter fullscreen mode Exit fullscreen mode

3. 新公会创建后部署命令:



client.on("guildCreate", async (guild) => {
  await deployCommands({ guildId: guild.id });
});


Enter fullscreen mode Exit fullscreen mode

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);
  }
});


Enter fullscreen mode Exit fullscreen mode

5.使用您的令牌登录客户端:



client.login(config.DISCORD_TOKEN);


Enter fullscreen mode Exit fullscreen mode

完成所有步骤后,您的文件应如下所示:



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);


Enter fullscreen mode Exit fullscreen mode

非常好!现在你只需要运行npm run dev并将你的机器人添加到某个服务器,然后在某个文本频道中使用 /ping 即可。

如果您只想克隆该仓库,请点击下方链接前往 GitHub 仓库。如果您留下一颗星,我将非常高兴。

https://github.com/fellipeutaka/discord-bot-template

文章来源:https://dev.to/fellipeutaka/creating-your-first-discord-bot-using-typescript-1eh6
PREV
获得多种形式的程序的能力:10 个游戏以获取程序
NEXT
作为软件工程师,如何保持最新状态 Feedly - 组织、阅读和分享对您重要的事情 Pocket