如何为Disnake Bot发送至其他频道的消息添加按钮
如何在频道消息中添加交互按钮实现昵称审批功能
核心思路是利用Discord机器人开发库提供的**消息组件(Message Components)**创建按钮,并监听按钮交互事件完成审批操作。下面以Discord.js v14为例给出具体实现步骤:
1. 创建并发送带按钮的审批消息
当用户发送!nick [name]命令后,构造包含"Accept"和"Reject"按钮的消息并发送到管理频道:
const { ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js'); // 监听!nick命令 client.on('messageCreate', async (message) => { if (!message.content.startsWith('!nick') || message.author.bot) return; const newNick = message.content.split(' ')[1]; if (!newNick) return message.reply('请提供你想要修改的昵称!'); // 构建Accept按钮(绿色成功样式) const acceptBtn = new ButtonBuilder() .setCustomId('nick_accept') .setLabel('Accept') .setStyle(ButtonStyle.Success); // 构建Reject按钮(红色危险样式) const rejectBtn = new ButtonBuilder() .setCustomId('nick_reject') .setLabel('Reject') .setStyle(ButtonStyle.Danger); // 将按钮放入ActionRow容器(Discord要求按钮必须包裹在ActionRow中) const actionRow = new ActionRowBuilder().addComponents(acceptBtn, rejectBtn); // 获取目标管理频道(替换为你的管理频道ID) const modChannel = client.channels.cache.get('123456789012345678'); if (!modChannel) return message.reply('无法找到管理频道,请检查配置!'); // 发送带按钮的审批消息 await modChannel.send({ content: `用户 ${message.author.tag} (ID: ${message.author.id}) 请求修改昵称为:${newNick}`, components: [actionRow] }); message.reply('你的昵称修改请求已提交,等待管理员审批!'); });
2. 监听按钮交互事件处理审批
按钮发送后,监听点击操作,根据自定义ID区分审批类型并执行对应逻辑:
// 监听所有交互事件 client.on('interactionCreate', async (interaction) => { // 只处理按钮类型的交互 if (!interaction.isButton()) return; // 处理昵称审批按钮 if (['nick_accept', 'nick_reject'].includes(interaction.customId)) { // 从审批消息中提取用户ID和请求的新昵称 const content = interaction.message.content; const userIdMatch = content.match(/ID: (\d+)/); const nickMatch = content.match(/修改昵称为:(.+)/); if (!userIdMatch || !nickMatch) return interaction.reply({ content: '无法解析审批消息内容', ephemeral: true }); const userId = userIdMatch[1]; const newNick = nickMatch[1]; const targetMember = interaction.guild.members.cache.get(userId); const targetUser = await client.users.fetch(userId); if (interaction.customId === 'nick_accept') { try { // 修改用户昵称 await targetMember.setNickname(newNick); // 向管理员发送私密回复 await interaction.reply({ content: `已批准 ${targetUser.tag} 的昵称修改请求,新昵称:${newNick}`, ephemeral: true }); // 通知用户审批结果 targetUser.send(`你的昵称修改请求已通过,新昵称:${newNick}`).catch(() => {}); } catch (err) { await interaction.reply({ content: `修改昵称失败:${err.message}`, ephemeral: true }); } } else { // 处理拒绝请求 await interaction.reply({ content: `已拒绝 ${targetUser.tag} 的昵称修改请求`, ephemeral: true }); targetUser.send(`你的昵称修改请求已被拒绝`).catch(() => {}); } // 禁用按钮,防止重复点击 await interaction.message.edit({ components: [ ActionRowBuilder.from(interaction.message.components[0]).setComponents( interaction.message.components[0].components.map(btn => btn.setDisabled(true)) ) ] }); } });
关键注意事项
- 自定义ID:每个按钮的
setCustomId需唯一,用于区分不同操作。 - ActionRow容器:Discord要求所有按钮必须放在
ActionRowBuilder中,单个ActionRow最多容纳5个按钮。 - 权限控制:确保机器人拥有修改成员昵称、向管理频道发送消息的权限。
- Ephemeral回复:
ephemeral: true让管理员的回复仅自己可见,避免频道消息杂乱。 - 错误处理:处理修改昵称失败、用户关闭DM无法接收通知的情况。
内容的提问来源于stack exchange,提问作者Nuestr1k
相关产品推荐
相关产品推荐

