自定义Discord考勤机器人Embed字段修改及多频道适配问题
Discord考勤机器人问题修复方案
问题1:同一团队成员签到名字被覆盖,需支持多人追加
原代码更新字段时直接替换为新成员名字,导致覆盖已有内容。修改逻辑:
- 检查字段当前值:若为初始的
'-',直接替换为成员名字 - 若已有成员,追加换行和新名字,同时避免重复添加同一用户
问题2:按钮绑定固定频道ID,不支持多活动同时签到
原代码通过固定频道ID获取消息,无法区分多活动的签到Embed。修改方式:
- 利用按钮交互的
interaction.message直接获取当前按钮所在的Embed消息,无需通过频道ID查找 - 移除固定频道ID的硬编码,直接从交互上下文获取目标消息
修改后的完整代码
const customEmojiTeam1 = '<:Team1:team1ID>'; const customEmojiTeam2 = '<:Team2:team2ID>'; const customEmojiTeam3 = '<:Team3:team3ID>'; const customEmojiAvailable = '<:yes:availableID>'; const customEmojiUnavailable = '<:no:unavailableID>'; const customEmojiReserve = '<:Reserve:reserveID>'; client.on('interactionCreate', (interaction) => { if (!interaction.isChatInputCommand()) return; if (interaction.commandName === 'embed') { const embed = new EmbedBuilder() .setTitle("Generic Title") .setDescription('Event 1 - timestamp') .setColor(0xffffff) .addFields({ name: `${customEmojiTeam1} Team1`, value: '-', }, { name: `${customEmojiTeam2} Team2`, value: '-', }, { name: `${customEmojiTeam3} Team3`, value: '-', }, { name: `${customEmojiUnavailable} Unavailable`, value: '-', }, { name: `${customEmojiReserve} Reserves`, value: '-', }); const yesButton = new ButtonBuilder() .setStyle(ButtonStyle.Secondary) .setEmoji(customEmojiAvailable) .setCustomId('yes-button'); const noButton = new ButtonBuilder() .setEmoji(customEmojiUnavailable) .setStyle(ButtonStyle.Secondary) .setCustomId('no-button'); const buttonRow = new ActionRowBuilder().addComponents(yesButton, noButton); interaction.reply({ content: 'Your check-in has been created. If you encounter any issues, please message @user.', ephemeral: true }); interaction.channel.send({ content: `<@role1ID> <@role2ID>`, embeds: [embed], components: [buttonRow] }); } }); client.on('interactionCreate', async (interaction) => { if (!interaction.isButton()) return; const member = interaction.guild.members.cache.get(interaction.user.id); const team1Role = interaction.guild.roles.cache.find(role => role.name === 'Team 1'); const team2Role = interaction.guild.roles.cache.find(role => role.name === 'Team 2'); const team3Role = interaction.guild.roles.cache.find(role => role.name === 'Team 3'); const reserveRole = interaction.guild.roles.cache.find(role => role.name === 'Reserve'); if (interaction.customId === 'yes-button') { if (member.roles.cache.has(team1Role.id)) { await updateEmbedField(interaction.message, 'Team 1', `- ${member.displayName}`); } else if (member.roles.cache.has(team2Role.id)) { await updateEmbedField(interaction.message, 'Team 2', `- ${member.displayName}`); } else if (member.roles.cache.has(team3Role.id)) { await updateEmbedField(interaction.message, 'Team 3', `- ${member.displayName}`); } else if (member.roles.cache.has(reserveRole.id)) { await updateEmbedField(interaction.message, 'Reserves', `- ${member.displayName}`); } await interaction.reply({ content: '签到成功!', ephemeral: true }); } }); async function updateEmbedField(targetMessage, roleName, newEntry) { const embed = targetMessage.embeds[0]; const field = embed.fields.find(f => f.name.includes(roleName)); if (field) { if (field.value === '-') { field.value = newEntry; } else if (!field.value.includes(newEntry)) { field.value += `\n${newEntry}`; } } await targetMessage.edit({ embeds: [embed] }); }
关键修改说明
- 解决名字覆盖问题:
- 在
updateEmbedField函数中增加初始值判断和重复检查,实现成员名字追加而非替换
- 在
- 解决固定频道问题:
- 按钮交互时直接传递
interaction.message给更新函数,无需硬编码频道ID查找消息 - 新增用户签到反馈,提升交互体验
- 按钮交互时直接传递
内容的提问来源于stack exchange,提问作者Faded
相关产品推荐
相关产品推荐

