You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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] });
}

关键修改说明

  1. 解决名字覆盖问题:
    • 在updateEmbedField函数中增加初始值判断和重复检查,实现成员名字追加而非替换
  2. 解决固定频道问题:
    • 按钮交互时直接传递interaction.message给更新函数,无需硬编码频道ID查找消息
    • 新增用户签到反馈,提升交互体验

内容的提问来源于stack exchange,提问作者Faded

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:50:55