誰でも作れる!Discord Bot 2024(カスタマイズ編/初級)

この記事では、誰でも作れる!Discord Bot 2024(初期設定編) で作成した Bot のカスタマイズ方法を紹介します!

初級では、基本的な Bot のカスタマイズについて紹介します。

リンク


Glitch のダークモード

左上の「🎏Settings」から、ダークモードを有効にすることができます。
この note で紹介しているスクリーンショットは、ダークモードになっています。

Glitch アプリケーションの再読み込み方法

Bot のソースコードや設定を変更した際は、基本的に Glitch でアプリケーションを再読み込みする必要があります。

Glitch のプロジェクトの下側にある「💻TERMINAL」を押し、「refresh」と入力後エンターキーを押すことで、再読み込みを行えます。
しばらく待ち、「📝LOGS」に「<Botの名前> がログインしました!」と出力されれば再読み込み完了です。


Bot の名前、アイコンを変更する

Bot の名前、アイコンは Discord のデベロッパーポータルから設定できます。

アプリケーションを選択し、「Bot」ページから編集してください。
編集後は、しばらくすると反映されるはずです。(Glitch の再読み込みも必要かも)


Bot のステータスを変更する

client.on("ready", async () => {
  await client.user.setActivity('🥔', { type: ActivityType.Custom, state: "🥔を栽培中" });
  console.log(`${client.user.tag} がログインしました!`);
});

main.mjs 内の下のほうにある client.user.setActivity() メソッドで、「〇〇をプレイ中」といったようなステータスを設定することができます。
様々なオプションがあり、実際に表示されるステータスは以下のようになります。(※執筆時点の情報です)

client.user.setActivity('てすと');
// てすとをプレイ中

client.user.setActivity('てすと', { type: ActivityType.Listening });
// てすとを再生中

client.user.setActivity('てすと', { type: ActivityType.Watching });
// てすとを視聴中

client.user.setActivity('てすと', { type: ActivityType.Competing });
// てすとに参戦中です

client.user.setActivity('てすと', { type: ActivityType.Custom, state: "🥔を栽培中" });
// 🥔を栽培中

特定のキーワードに反応する

Bot が参加しているテキストチャンネルで、特定のキーワードがチャットされた際に反応するようになっています。

この動作は、Glitch プロジェクトにおける、handlers フォルダ内の messageCreate.mjs というファイル内で定義されています。

if (message.content.match(/ぽてと|ポテト|じゃがいも|ジャガイモ|🥔|🍟/)) {
  await message.react("🥔");
}

このコードでは、「ぽてと・ポテト・じゃがいも・ジャガイモ・🥔・🍟」のどれかがメッセージに含まれる場合、そのメッセージに「🥔」の絵文字でリアクションします。

if (message.content.match(/にゃん|にゃーん|にゃ~ん/)) {
  await message.reply("にゃ~ん");
}

このコードでは、「にゃん・にゃーん・にゃ~ん」のどれかがメッセージに含まれている場合に、「にゃ~ん」というメッセージで返信します。

  if (message.content.match(/^\d+[d]\d+$/)) {
    await message.reply(ndnDice(message.content));
  }

「1d6」のようなメッセージに反応してダイスロールを行います。
処理としては、「/dice」コマンドの処理を呼び出して利用しています。

その他の反応方法

・ロールを付与する
「しゅうまい」がメッセージに含まれる場合に、メッセージ投稿者に「しゅうまい君」ロールを付与します。

  if (message.content.match(/しゅうまい/)) {
    if (!message.guild || !message.member) {
      return;
    }
    
    const role = message.guild.roles.cache.find(role => role.name === 'しゅうまい君');
    
    if (role){
      await message.member.roles.add(role);
    }
  }

・DMする
メッセージ投稿者にDMします。

  if (message.content.match(/おやすみ/)) {
    await message.author.send('おやすみ~');
  }

DM に反応する

デフォルトでは、DM されても反応することができません。
Bot に DM で送信されたメッセージを取得したい場合は、Gateway Intent を指定する必要があります。
公式の解説は↓
https://discord.com/developers/docs/topics/gateway#gateway-intents

有効化する際は「GatewayIntentBits.DirectMessages」を、Client インスタンス作成時の引数に渡してあげてください。

const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent,
    GatewayIntentBits.GuildVoiceStates,
    GatewayIntentBits.DirectMessages,
  ],
});

DM にメッセージが送信された場合も、上記の「特定のキーワードに反応する」と同じく、 handlers フォルダ内の messageCreate.mjs の動作が行われます。

スラッシュコマンドについて

/nyan というコマンドを実行すると、Bot が返信してくれます。

これは、Glitch アプリ内の commands/samples/nyan.mjs にソースコードがあります。

import { SlashCommandBuilder } from 'discord.js';

export const data = new SlashCommandBuilder()
  .setName('nyan')
  .setDescription('Botが返事してくれるよ');

この部分で、スラッシュコマンドの名前「/nyan」と、説明文を設定しています。

export async function execute(interaction){
	await interaction.reply('にゃ~ん');
}

スラッシュコマンドを実行すると、execute 関数が実行されます。
「await interaction.reply('にゃ~ん');」の部分で、返信をしています。

追加方法

コマンドを追加するときは、「commands/<任意のフォルダ>/<コマンド名>.mjs」にファイルを作成してください。
※ フォルダは、コマンドを管理しやすくするためのものです。分けても分けなくても良いですが、コマンドのプログラムは何かしらのフォルダに入っている必要があります。

Glitch アプリ内の Files の右側のプラスマークを押し、ファイル名を指定して「Add This File」を押すとファイルが作成されます。

例えば、「/dog」コマンドを追加する場合は以下のようになります。

新しく作成したファイルには、nyan.mjs からコードをコピーし、カスタマイズしていきましょう。

import { SlashCommandBuilder } from 'discord.js';

export const data = new SlashCommandBuilder()
  .setName('dog')
  .setDescription('犬コマンド');

export async function execute(interaction){
    const sleep = (time) => new Promise((resolve) => setTimeout(resolve, time));
  
	await interaction.reply('グルルルル...');
	await sleep(2000);
	await interaction.followUp('ワン!');
}

コードの入力まで完了したら、Glitch アプリを再読み込みしましょう。
しばらくすると、「/dog」コマンドが使えるようになっています。

このサンプルコードは、返信後に2秒待機し、もう一度返信する動作になっています。
Bot から何度も返信する際は、interaction.reply() を連続で実行するとエラーになってしまうので、2回目以降は interaction.followUp() を使いましょう。

削除方法

「commands/<任意のフォルダ>/<コマンド名>.mjs」のファイルを削除すると、そのファイルで登録されていたスラッシュコマンドが削除されます。(Glitch アプリの再読み込みが必要です。)

ランダム要素

「/uranai」「/gacha」コマンドは、ランダムな内容を返信します。

// commands/samples/uranai.mjs

import { SlashCommandBuilder } from 'discord.js';

export const data = new SlashCommandBuilder()
  .setName('uranai')
  .setDescription('ラッキーカラーを占うよ~');

export async function execute(interaction){
  const arr = ["赤色", "青色", "緑色", "黄色", "水色"]
  const random = Math.floor( Math.random() * arr.length);
  const color = arr[random];

	await interaction.reply(`ラッキーカラーは${color}だよ~`);
}

「/uranai」は、簡単なランダム要素を返信するサンプルです。
arr 配列の中から、どれか一つをランダムで出力するコードになっています。

// commands/samples/gacha.mjs

import { SlashCommandBuilder } from "discord.js";

export const data = new SlashCommandBuilder()
  .setName("gacha")
  .setDescription("ガチャを引くよ~");

export async function execute(interaction) {
  const arr = ["SSR 金のじゃがいも", "SR 銀のじゃがいも", "R 銅のじゃがいも", "N ただのじゃがいも"];
  const weight = [2, 4, 8, 16];
  let result = "";

  let totalWeight = 0;
  for (let i = 0; i < weight.length; i++) {
    totalWeight += weight[i];
  }
  let random = Math.floor(Math.random() * totalWeight);
  
  for (let i = 0; i < weight.length; i++) {
    if (random < weight[i]) {
      result = arr[i];
      break;
    } else {
      random -= weight[i];
    }
  }

  await interaction.reply(`${result} が当選しました!`);
}

「/gacha」は、確率に差があるランダム要素を返信するサンプルです。
「const weight = [2, 4, 8, 16];」にて、当選率を設定しています。

例えば「const weight = [1, 5, 14, 80];」にすると、SSR が 1 %、N が 80 % で選ばれます。

さいごに

誰でも作れる!Discord Bot 2024(カスタマイズ編/中級)」以降の note
 にて、より高度なカスタマイズについて解説しているので、そちらもぜひご覧ください。

この記事で紹介している Bot「MiniPotato」の Discord サーバーでは、紹介している Bot を実際に操作できます。
要望や質問等も可能な範囲で受け付けていますので、お気軽にご参加ください!
https://discord.gg/UDf4R5fgqr

この記事が気に入ったらサポートをしてみませんか?