使用 Discord.js v14 中的选择菜单更新消息

问题描述 投票:0回答:2

Discord.js 版本:14.6.0

我目前正在使用选择菜单。当我与菜单交互时,假设应该对消息进行编辑,而且确实如此。我目前遇到的问题是选择菜单的重置。每次我与菜单交互时,菜单本身都会重置为默认设置。

预期输出:(在所选项目上打勾并编辑原始消息)

当前输出:(编辑了原始消息,但重置了菜单)

我只能得到回复新消息然后让菜单正常工作更新原始机器人消息但重置菜单栏。下面我插入我正在使用的代码。如果您需要更多信息,请告诉我。

index.js:

client.on('interactionCreate', async interaction => {
// ... Command Handler here
})

测试.js:

    const row = new Discord.ActionRowBuilder()
        .addComponents(new Discord.SelectMenuBuilder()
            .setCustomId('test')
            .setPlaceholder('test 1')
            .setMinValues(1)
            .setMaxValues(1)
            .addOptions(
                {
                    label: 'test 1',
                    value: 'first_option'
                },
                {
                    label: 'test 2',
                    value: 'second_option'
                }
            ))

    const testEmbed = new Discord.EmbedBuilder()
        .setTitle('Testing')

    interaction.reply({ embeds: [testEmbed], components: [row] })

selectMenu.js:

    const Embed = new Discord.EmbedBuilder()
        .setTitle('Testing 2')
    interaction.update({ embeds: [Embed] })

PS:预期输出的形象并不完美,因为我无法做我想做的事。想象一下,我想要像第二张照片一样的编辑消息和像第一张照片一样的选择菜单。

javascript discord discord.js
2个回答
0
投票

您必须将其中一个菜单选项上的布尔值

default
设置为true,然后它将突出显示。
所以如果你想突出显示第一个选项,那就是

const row = new Discord.ActionRowBuilder()
.addComponents(new Discord.SelectMenuBuilder()
    .setCustomId('test')
    .setPlaceholder('test 1')
    .setMinValues(1)
    .setMaxValues(1)
    .addOptions(
        {
            label: 'test 1',
            value: 'first_option',
            default: true
        },
        {
            label: 'test 2',
            value: 'second_option'
        }
    )
);

如果您想突出显示第二个选项,那就是

const row = new Discord.ActionRowBuilder()
.addComponents(new Discord.SelectMenuBuilder()
    .setCustomId('test')
    .setPlaceholder('test 1')
    .setMinValues(1)
    .setMaxValues(1)
    .addOptions(
        {
            label: 'test 1',
            value: 'first_option'
        },
        {
            label: 'test 2',
            value: 'second_option',
            default: true
        }
    )
);

0
投票

我是这样解决的。我发送初始消息,当选择时触发 InteractionCreate 事件时,我从交互中提取原始 stringselectmenu,更新默认值,然后在更新中重新发送它

const gameName = interaction.values ? interaction.values[0]: null;
const recentGameSelect = interaction.component;

var otherGamersEmbed = await GetGamersWithGamesEmbed(interaction, gameName);

//update default to new selection
recentGameSelect.options.forEach(option => option.default = (!!option.value && option.value == gameName));
const gamesSelectActionRow = new ActionRowBuilder().addComponents(recentGameSelect);

const inviteButton = new ActionRowBuilder();
inviteButton.addComponents(
    new ButtonBuilder()
        .setCustomId('invite-button')
        .setStyle(ButtonStyle.Primary)
        .setLabel('Create Voice Channel + Invite Others'),
);

interaction.update({
    embeds: [otherGamersEmbed],
    components: [gamesSelectActionRow, inviteButton]
});
© www.soinside.com 2019 - 2024. All rights reserved.