Discord.Net 中的按钮已构建后如何重新启用它?

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

我在 Discord.Net 应用程序中创建了一个禁用按钮。我想重新启用它以响应某些用户交互。我已经知道如何响应用户交互,甚至可以获取已添加到消息中的组件。但似乎没有任何方法或可编辑属性来重新启用该按钮。文档似乎没有指出任何这样做的方法,但如果按钮永远无法再次启用,则禁用按钮似乎是一个非常无用的功能。是否可以?或者 Discord.Net 未能实现 Discord API 的这一部分?我在 StackOverflow、视频教程或我在 google 搜索答案时尝试过的其他网站中找不到答案,甚至找不到问题。

禁用代码:

private async Task ManageLeague(SocketInteraction command, Foo bar) {
    SelectMenuBuilder menuBuilder = RecurringSelectMenus.ServerUsers(Client, com, "Select...", "select-menu");
    ComponentBuilder builder = new();
    builder.WithSelectMenu(menuBuilder, 0);
    builder.WithButton("Perform Action", "my-button", disabled : true, row : 1);

    try {
        await command.RespondAsync($"Managing {bar.Name}:", components: builder.Build(), ephemeral: true);
    } catch (HttpException e) {
        Console.WriteLine(JsonConvert.SerializeObject(e.Errors, Formatting.Indented));
    }
}

如您所见,我创建了按钮并内联禁用了它。理论上,我可以执行以下操作:

ButtonBuilder button = new();
button.WithDisabled(false);

这将禁用该按钮。然而,这都是预先构建的。一旦我构建了组件(我必须这样做才能发送消息),它从根本上转变为我认为的

ButtonComponent
。但是,当我响应用户与消息的交互并检索我的组件(以更抽象的形式
IMessageComponent
)时,无论我是否转换为
ButtonComponent
,似乎都没有任何禁用或启用方法,并且
button.IsDisabled
ButtonComponent
属性是只读的。任何答案、解决方案或解决方法将不胜感激。

discord discord.net discord-buttons
1个回答
0
投票

我找到了一个解决方法。这看起来确实很笨重,但话又说回来,也许这就是预期的方法。无论如何,这是通过修改消息并完全替换所有组件来完成的。 (对我来说,这意味着重建选择菜单,但这次找到所选值并将其设置为默认值,因为替换组件将覆盖选择。这些是我觉得这很笨拙的主要原因。)

public async Task SelectOwnerForNewTeam(SocketMessageComponent component) {
    SelectMenuBuilder menuBuilder = RecurringSelectMenus.ServerUsers(Client, component, "Select...", "select-menu");
    SelectMenuOptionBuilder? selection = menuBuilder.Options.Find(o => o.Value == component.Data.Values.First()); // Get the selected option
    if (selection != null) selection.IsDefault = true;
    ComponentBuilder builder = new();
    builder.WithSelectMenu(menuBuilder, 0);
    builder.WithButton("Perform Action", "my-button", row : 1);

    await component.DeferAsync(); // Must be done prior to modifying
    await component.ModifyOriginalResponseAsync(msg => msg.Components = builder.Build());
}

这确实感觉不像是应该是正确的答案,但我想现在是这样。我在 Discord.js 问题中看到了与此类似的内容,所以可能是 Discord API 不允许您修改单个组件。

© www.soinside.com 2019 - 2024. All rights reserved.