/// <summary> /// Precondition to disable the source of an interaction. /// </summary> /// <param name="context"></param> /// <param name="commandInfo"></param> /// <param name="services"></param> /// <returns></returns> public override async Task <PreconditionResult> CheckRequirementsAsync(IInteractionContext context, ICommandInfo commandInfo, IServiceProvider services) { if (context.Interaction is not IComponentInteraction messageComponent) { return(PreconditionResult.FromError("This attribute does not work for application commands!")); } var builder = new ComponentBuilder(); var rows = ComponentBuilder.FromMessage(messageComponent.Message).ActionRows; for (int i = 0; i < rows.Count; i++) { foreach (var component in rows[i].Components) { switch (component) { case ButtonComponent button: builder.WithButton(button.ToBuilder() .WithDisabled(!button.CustomId.StartsWith("delete-message-")), i); break; case SelectMenuComponent menu: builder.WithSelectMenu(menu.ToBuilder() .WithDisabled(true), i); break; } } } try { await messageComponent.Message.ModifyAsync(x => x.Components = builder.Build()); return(PreconditionResult.FromSuccess()); } catch (Exception ex) { return(PreconditionResult.FromError(ex)); } }