Closed7
[TypeScript] Discord.jsでスラッシュコマンドを使ってボタンを実装する
TypeScriptのモジュールはES2022
Discord.jsのバージョンは14.3.0
Node.jsのバージョンは19
冒頭に貼ったガイドの中にある
これをベースに少しアレンジClientの型定義を拡張し、buttonsというプロパティを追加し、読み込む。
コマンドも同じ方法で追加している。
client.buttons = new Collection();
const path = "/app/src/buttons"
const files = readdirSync(path, { withFileTypes: true })
.filter(dirent => dirent.isFile()).map(({ name }) => name);
files.forEach(async (name: string,) => {
const myButton = await import(`${path}/${name}`);
client.buttons.set(myButton.button.name, myButton.button);
})
btn.ts(ボタンが押された時に実行されるやつ)の中身
ボタンをクリックされたら、executeの中身が実行される。
nameはButtonBuildeに.setCustomIdしたIDと同じものを指定する。
冒頭のガイドの場合だとprimaryになる
import { ButtonInteraction, SlashCommandBuilder } from "discord.js";
export const button = {
name:"primary",
execute: async (interaction: ButtonInteraction) => {
await interaction.reply({ content: "これはテストです!", ephemeral: true });
},
};
interactionCreate.tsの中身をかい摘む
この振り分けはもうちょっとなんかスマートにできそうだけど良いアイデアが思いつかない
import { Interaction } from "discord.js";
export const event = {
name: "interactionCreate",
once: false,
execute: async (interaction: Interaction) => {
//コマンドの場合
if (interaction.isChatInputCommand()) {
// ...
}
//ボタンの場合
if (interaction.isButton()) {
const btn = interaction.client.buttons.get(interaction.customId);
if (!btn) return;
try {await btn.execute(interaction);}
catch (error) {
//...
}
}
}
}
構成はざっくりこんな感じ
.
├── README.md
├── app
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ │ ├── @types
│ │ │ └── client.d.ts
│ │ ├── buttons
│ │ │ └── btn.ts
│ │ ├── commands
│ │ │ └── test.ts
│ │ ├── events
│ │ │ ├── guildMemberAdd.ts
│ │ │ ├── guildScheduledEventCreate.ts
│ │ │ ├── interactionCreate.ts
│ │ │ ├── messageCreate.ts
│ │ │ ├── ready.ts
│ │ │ └── voiceStateUpdate.ts
│ │ ├── index.ts
│ └── tsconfig.json
├── docker-compose.yml
このスクラップは2023/01/28にクローズされました