使用打字稿创建第一个Discord机器人
#教程 #typescript #node #discord

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.tsindex.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>