実現したいこと
スラッシュコマンドを動作できるようにする
発生している問題・分からないこと
スラッシュコマンドを実行するとDiscord内ではアプリケーションが応答しませんでした。とでて、下記のエラーメッセージが出てくる。
エラーメッセージ
error
1throw er; // Unhandled ‘error’ event ^
該当のソースコード
JavaScript
1const { Client, IntentsBitField, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, ModalBuilder, TextInputBuilder, TextInputStyle, ChannelType } = require('discord.js'); 2const { token } = require('./config.json'); // Bot tokenをconfig.jsonに保存 3 4const client = new Client({ intents: [IntentsBitField.Flags.Guilds, IntentsBitField.Flags.GuildMessages] }); 5 6client.on('ready', () => { 7 console.log(`Logged in as ${client.user.tag}!`); 8 9 // スラッシュコマンドを登録 (グローバルコマンドとして登録) 10 client.application.commands.create({ 11 name: 'mcid', 12 description: 'MCID認証モーダルを表示します', 13 }); 14 15 client.application.commands.create({ 16 name: 'ticket', 17 description: 'チケット作成ボタンを表示します', 18 }); 19 20 client.application.commands.create({ 21 name: 'help', 22 description: 'コマンド一覧を表示します', 23 }); 24 25 client.application.commands.create({ 26 name: 'userinfo', 27 description: 'ユーザー情報', 28 options: [{ 29 name: 'user', 30 description: '情報を見たいユーザー', 31 type: 6, // USER TYPE 32 }] 33 }); 34 35 client.application.commands.create({ 36 name: 'serverinfo', 37 description: 'サーバー情報', 38 }); 39 40 client.application.commands.create({ 41 name: 'ping', 42 description: 'ボットのping値を表示します', 43 }); 44}); 45 46client.on('interactionCreate', async interaction => { 47 if (!interaction.isChatInputCommand()) return; 48 49 if (interaction.commandName === 'mcid') { 50 // MCID認証モーダル 51 const modal = new ModalBuilder() 52 .setCustomId('mcidModal') 53 .setTitle('MCID認証'); 54 55 const mcidInput = new TextInputBuilder() 56 .setCustomId('mcidInput') 57 .setLabel("MCIDを入力してください") 58 .setStyle(TextInputStyle.Short); 59 60 const firstActionRow = new ActionRowBuilder().addComponents(mcidInput); 61 modal.addComponents(firstActionRow); 62 63 await interaction.showModal(modal); 64 } else if (interaction.commandName === 'ticket') { 65 // チケット作成ボタン 66 const row = new ActionRowBuilder() 67 .addComponents( 68 new ButtonBuilder() 69 .setCustomId('ticketButton') 70 .setLabel('チケットを作成') 71 .setStyle(ButtonStyle.Primary), 72 ); 73 74 await interaction.reply({ content: 'チケットを作成するには、下のボタンをクリックしてください。', components: [row] }); 75 } else if (interaction.commandName === 'help') { 76 // ヘルプコマンド 77 const embed = new EmbedBuilder() 78 .setColor(0x0099FF) 79 .setTitle('コマンド一覧') 80 .addFields( 81 { name: '/mcid', value: 'MCID認証モーダルを表示します', inline: true }, 82 { name: '/ticket', value: 'チケット作成ボタンを表示します', inline: true }, 83 { name: '/userinfo [user]', value: 'ユーザー情報を表示します', inline: true }, 84 { name: '/serverinfo', value: 'サーバー情報を表示します', inline: true }, 85 { name: '/ping', value: 'ボットのping値を表示します', inline: true }, 86 ); 87 88 await interaction.reply({ embeds: [embed] }); 89 } else if (interaction.commandName === 'userinfo') { 90 // ユーザー情報コマンド 91 const user = interaction.options.getUser('user') || interaction.user; 92 const embed = new EmbedBuilder() 93 .setColor(0x0099FF) 94 .setTitle(`${user.username}の情報`) 95 .setThumbnail(user.displayAvatarURL()) 96 .addFields( 97 { name: 'ユーザー名', value: user.username, inline: true }, 98 { name: 'Discriminator', value: user.discriminator, inline: true }, 99 { name: 'ID', value: user.id, inline: true }, 100 { name: 'Bot?', value: user.bot ? 'はい' : 'いいえ', inline: true }, 101 { name: 'アカウント作成日', value: user.createdAt.toLocaleDateString(), inline: true }, 102 ); 103 104 await interaction.reply({ embeds: [embed] }); 105 } else if (interaction.commandName === 'serverinfo') { 106 // サーバー情報コマンド 107 const guild = interaction.guild; 108 const embed = new EmbedBuilder() 109 .setColor(0x0099FF) 110 .setTitle(`${guild.name}の情報`) 111 .setThumbnail(guild.iconURL()) 112 .addFields( 113 { name: 'サーバー名', value: guild.name, inline: true }, 114 { name: 'ID', value: guild.id, inline: true }, 115 { name: 'オーナー', value: `<@${guild.ownerId}>`, inline: true }, 116 { name: 'メンバー数', value: guild.memberCount, inline: true }, 117 { name: 'チャンネル数', value: guild.channels.cache.size, inline: true }, 118 { name: 'ロール数', value: guild.roles.cache.size, inline: true }, 119 { name: '作成日', value: guild.createdAt.toLocaleDateString(), inline: true }, 120 ); 121 122 await interaction.reply({ embeds: [embed] }); 123 } else if (interaction.commandName === 'ping') { 124 // pingコマンド 125 await interaction.reply(`🏓 Pong! ${client.ws.ping}ms`); 126 } 127}); 128 129client.on('interactionCreate', async interaction => { 130 if (!interaction.isModalSubmit()) return; 131 132 if (interaction.customId === 'mcidModal') { 133 const mcid = interaction.fields.getTextInputValue('mcidInput'); 134 135 // 特定のメッセージチャンネルに送信 (チャンネルIDを指定) 136 const channel = client.channels.cache.get('認証メッセージを送信するチャンネルID'); 137 if (channel) { 138 channel.send(`<@${interaction.user.id}> が認証されました!\nMCID: ${mcid}`); 139 await interaction.reply({ content: '認証が完了しました!', ephemeral: true }); 140 } else { 141 await interaction.reply({ content: '認証に失敗しました。', ephemeral: true }); 142 } 143 } 144}); 145 146client.on('interactionCreate', async interaction => { 147 if (!interaction.isButton()) return; 148 149 if (interaction.customId === 'ticketButton') { 150 // チケットチャンネルを作成 151 const guild = interaction.guild; 152 const channel = await guild.channels.create({ 153 name: `ticket-${interaction.user.username}`, 154 type: ChannelType.GuildText, 155 // 必要に応じて、親カテゴリや権限を設定 156 }); 157 158 await interaction.reply({ content: `${channel} にチケットを作成しました。`, ephemeral: true }); 159 160 // チケットチャンネルにメッセージを送信 161 channel.send(`<@${interaction.user.id}>さん、チケットを作成しました。\n管理者を待機してください。`); 162 } 163}); 164 165client.login(token); 166 167// ソース: 168// 1. https://github.com/FabioSmuu/discord-ticket-bot subject to MIT 169// 2. https://github.com/nicti/NW-RtA-Tracker 170// 3. https://github.com/oneforall-bot/oneforall
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
teratailで検索したが出てこなかった
補足
特になし
あなたの回答
tips
プレビュー