はじめに
「Discordでコミュニティを運営していて、入退室のたびに手動で挨拶を送っている」「フォーラムの質問にBotで自動応答したい」——そんな悩みを抱えたことはありませんか。
Discordの公式APIは強力ですが、生のWebSocket通信やREST APIを直接扱うのは骨が折れます。そこで登場するのがDiscord.jsです。Node.js製のライブラリとして、Discord APIの複雑さを隠蔽し、直感的なコードでBotを組み立てられるようにしてくれます。今回はDiscord.jsの基本から、実際に使えるBotの実装例まで紹介します。
Discord.jsとは
Discord.jsは、Discord APIをNode.jsから扱うための人気ライブラリです。イベント駆動のシンプルなAPI設計と、TypeScriptによる型定義が充実している点が特徴で、個人のBotから大規模なサーバー運用まで幅広く使われています。
主な特徴
- TypeScript完全対応 - 型定義が同梱されており、補完を効かせながら安全にBotを実装できます
- 豊富な機能カバレッジ - スラッシュコマンド、ボイスチャンネル、Embed、ボタンやセレクトメニューなどのUIコンポーネントまで幅広くサポートしています
- 活発なメンテナンス - Discord APIの仕様変更に追従したアップデートが継続的に行われています
- 柔軟なキャッシュ設定 -
GatewayIntentBitsによって受け取るイベントを絞り込め、メモリ消費を最適化できます
インストール
Node.js 18以上が必要です。パッケージマネージャーに合わせてインストールしてください。
# npm
npm install discord.js
# yarn
yarn add discord.js
# pnpm
pnpm add discord.js
TypeScriptで開発する場合は、あわせてtypescriptやts-nodeもプロジェクトに追加しておくと快適です。
npm install -D typescript ts-node @types/node
基本的な使い方
まずはBotを起動し、特定のメッセージに反応するだけのシンプルな例です。Discord Developer Portalでアプリケーションを作成し、Botトークンを取得しておいてください。
import { Client, GatewayIntentBits, Events } from "discord.js";
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent,
],
});
client.once(Events.ClientReady, (readyClient) => {
console.log(`Botとしてログインしました: ${readyClient.user.tag}`);
});
client.on(Events.MessageCreate, async (message) => {
if (message.author.bot) return;
if (message.content === "!ping") {
await message.reply("Pong!");
}
});
// トークンは環境変数から読み込む
client.login(process.env.DISCORD_BOT_TOKEN);
GatewayIntentBitsは、Botがどのイベントを受け取るかを宣言する仕組みです。必要なIntentだけを指定することで、無駄な通信やメモリ消費を抑えられます。
実践的なユースケース
近年のDiscord Botでは、プレフィックス付きメッセージよりもスラッシュコマンドが主流です。ここでは/greetコマンドを実装し、Embedで応答する例を紹介します。
import {
Client,
GatewayIntentBits,
Events,
SlashCommandBuilder,
EmbedBuilder,
REST,
Routes,
} from "discord.js";
const commands = [
new SlashCommandBuilder()
.setName("greet")
.setDescription("指定したユーザーに挨拶します")
.addUserOption((option) =>
option.setName("target").setDescription("挨拶する相手").setRequired(true)
),
].map((command) => command.toJSON());
// スラッシュコマンドをDiscordに登録
async function registerCommands(clientId: string, token: string) {
const rest = new REST().setToken(token);
await rest.put(Routes.applicationCommands(clientId), { body: commands });
}
const client = new Client({ intents: [GatewayIntentBits.Guilds] });
client.on(Events.InteractionCreate, async (interaction) => {
if (!interaction.isChatInputCommand()) return;
if (interaction.commandName !== "greet") return;
const target = interaction.options.getUser("target", true);
const embed = new EmbedBuilder()
.setTitle("挨拶")
.setDescription(`${target}さん、ようこそ!`)
.setColor(0x5865f2);
await interaction.reply({ embeds: [embed] });
});
const token = process.env.DISCORD_BOT_TOKEN!;
const clientId = process.env.DISCORD_CLIENT_ID!;
registerCommands(clientId, token).then(() => client.login(token));
このように、コマンド定義(SlashCommandBuilder)とインタラクション処理を分けて書けるため、コマンド数が増えてもコードの見通しを保ちやすくなっています。ボタンやセレクトメニューを組み合わせれば、投票機能やチケット発行システムといった実用的な機能にも発展させられます。
まとめ
Discord.jsは、TypeScriptとの親和性の高さとイベント駆動のシンプルな設計により、Discord Bot開発における事実上の標準ライブラリとなっています。今回紹介したメッセージ応答とスラッシュコマンドの実装は基本の一部に過ぎず、ボイスチャンネル操作やコンポーネントインタラクションなど、まだまだ多くの機能が用意されています。まずは小さなBotから作り始めて、少しずつ機能を拡張していくのがおすすめです。
