Closed7

[TypeScript] Discord.jsでスラッシュコマンドを使ってボタンを実装する

ななねななね

TypeScriptのモジュールはES2022
Discord.jsのバージョンは14.3.0
Node.jsのバージョンは19

ななねななね

冒頭に貼ったガイドの中にある
https://github.com/discordjs/guide/tree/main/code-samples/creating-your-bot/slash-commands
これをベースに少しアレンジ

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にクローズされました