diff --git a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ActionRowBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ActionRowBuilder.cs index 66fb6546..9fca1db1 100644 --- a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ActionRowBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ActionRowBuilder.cs @@ -10,8 +10,10 @@ namespace Discord; /// public class ActionRowBuilder : IMessageComponentBuilder, IInteractableComponentContainer { + /// public ComponentType Type => ComponentType.ActionRow; + /// public int? Id { get; set; } /// @@ -41,7 +43,24 @@ public class ActionRowBuilder : IMessageComponentBuilder, IInteractableComponent } } + /// + /// Initializes a new . + /// + public ActionRowBuilder(params IMessageComponentBuilder[] components) + { + Components = components?.ToList(); + } + /// + /// Initializes a new from existing component. + /// + public ActionRowBuilder(ActionRowComponent actionRow) + { + Components = actionRow.Components.Select(x => x.ToBuilder()).ToList(); + Id = actionRow.Id; + } + + /// public ActionRowBuilder AddComponents(params IMessageComponentBuilder[] components) { foreach (var component in components) @@ -49,6 +68,7 @@ public class ActionRowBuilder : IMessageComponentBuilder, IInteractableComponent return this; } + /// public ActionRowBuilder WithComponents(IEnumerable components) { Components = components.ToList(); diff --git a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ComponentBuilderExtensions.cs b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ComponentBuilderExtensions.cs index 2c930feb..4e0c6d07 100644 --- a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ComponentBuilderExtensions.cs +++ b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ComponentBuilderExtensions.cs @@ -1,3 +1,7 @@ +using System; +using System.Collections.Generic; +using System.Linq; + namespace Discord; public static class ComponentBuilderExtensions @@ -14,4 +18,102 @@ public static class ComponentBuilderExtensions builder.Id = id; return builder; } + + /// + /// Converts a to a builder. + /// + /// Unknown component type + public static IMessageComponentBuilder ToBuilder(this IMessageComponent component) + => component switch + { + ActionRowComponent actionRow => actionRow.ToBuilder(), + ButtonComponent button => button.ToBuilder(), + SelectMenuComponent select => select.ToBuilder(), + SectionComponent section => section.ToBuilder(), + TextDisplayComponent textDisplay => textDisplay.ToBuilder(), + ThumbnailComponent thumbnail => thumbnail.ToBuilder(), + MediaGalleryComponent mediaGallery => mediaGallery.ToBuilder(), + FileComponent file => file.ToBuilder(), + SeparatorComponent separator => separator.ToBuilder(), + ContainerComponent container => container.ToBuilder(), + _ => throw new ArgumentException("Unknown component type") + }; + + /// + /// Converts a to a . + /// + public static FileComponentBuilder ToBuilder(this FileComponent file) + => new(file); + + /// + /// Converts a to a . + /// + public static SeparatorBuilder ToBuilder(this SeparatorComponent separator) + => new(separator); + + /// + /// Converts a to a . + /// + public static MediaGalleryBuilder ToBuilder(this MediaGalleryComponent mediaGallery) + => new(mediaGallery); + + /// + /// Converts a to a . + /// + public static ButtonBuilder ToBuilder(this ButtonComponent button) + => new(button); + + /// + /// Converts a to a . + /// + public static SelectMenuBuilder ToBuilder(this SelectMenuComponent select) + => new(select); + + /// + /// Converts a to a . + /// + public static ActionRowBuilder ToBuilder(this ActionRowComponent actionRow) + => new(actionRow); + + /// + /// Converts a to a . + /// + public static ContainerBuilder ToBuilder(this ContainerComponent container) + => new(container); + + /// + /// Converts a to a . + /// + public static SectionBuilder ToBuilder(this SectionComponent section) + => new(section); + + /// + /// Converts a to a . + /// + public static ThumbnailBuilder ToBuilder(this ThumbnailComponent thumbnail) + => new(thumbnail); + + /// + /// Converts a to a . + /// + public static TextDisplayBuilder ToBuilder(this TextDisplayComponent textDisplay) + => new (textDisplay); + + /// + /// Converts a to a . + /// + public static MediaGalleryItemProperties ToProperties(this MediaGalleryItem item) + => new(item.Media.ToProperties(), item.Description, item.IsSpoiler); + + /// + /// Converts a to a . + /// + public static UnfurledMediaItemProperties ToProperties(this UnfurledMediaItem item) + => new(item.Url); + + /// + /// Converts a collection of to a . + /// + public static ComponentBuilderV2 ToBuilder(this IEnumerable components) + => new(components); } diff --git a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ComponentBuilderV2.cs b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ComponentBuilderV2.cs index 8689d708..e1501f0d 100644 --- a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ComponentBuilderV2.cs +++ b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ComponentBuilderV2.cs @@ -26,7 +26,18 @@ public class ComponentBuilderV2 : IStaticComponentContainer /// /// Initializes a new instance of . /// - public ComponentBuilderV2() { } + public ComponentBuilderV2(params IEnumerable components) + { + Components = components?.ToList(); + } + + /// + /// Initializes a new instance of from existing components. + /// + public ComponentBuilderV2(IEnumerable components) + { + Components = components?.Select(x => x.ToBuilder()).ToList(); + } /// public ComponentBuilderV2 AddComponent(IMessageComponentBuilder component) diff --git a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ContainerBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ContainerBuilder.cs index a94a5ad8..7b3ece09 100644 --- a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ContainerBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ContainerBuilder.cs @@ -32,6 +32,25 @@ public class ContainerBuilder : IMessageComponentBuilder, IStaticComponentContai /// public bool? IsSpoiler { get; set; } + /// + /// Initializes a new . + /// + public ContainerBuilder(params IEnumerable components) + { + Components = components?.ToList(); + } + + /// + /// Initializes a new from existing component. + /// + public ContainerBuilder(ContainerComponent container) + { + Components = container.Components.Select(x => x.ToBuilder()).ToList(); + AccentColor = container.AccentColor; + IsSpoiler = container.IsSpoiler; + Id = container.Id; + } + /// /// Sets the accent color of this container. /// @@ -50,7 +69,7 @@ public class ContainerBuilder : IMessageComponentBuilder, IStaticComponentContai /// /// The current builder. /// - public ContainerBuilder WithSpoiler(bool isSpoiler) + public ContainerBuilder WithSpoiler(bool? isSpoiler) { IsSpoiler = isSpoiler; return this; diff --git a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/FileComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/FileComponentBuilder.cs index d2851b7b..951ef063 100644 --- a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/FileComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/FileComponentBuilder.cs @@ -26,7 +26,7 @@ public class FileComponentBuilder : IMessageComponentBuilder /// /// Initializes a new instance of the . /// - public FileComponentBuilder() {} + public FileComponentBuilder() { } /// /// Initializes a new instance of the . @@ -38,6 +38,16 @@ public class FileComponentBuilder : IMessageComponentBuilder IsSpoiler = isSpoiler; } + /// + /// Initializes a new from existing component. + /// + public FileComponentBuilder(FileComponent file) + { + File = file.File.ToProperties(); + IsSpoiler = file.IsSpoiler; + Id = file.Id; + } + /// /// Sets the file for the component. /// diff --git a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/MediaGalleryBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/MediaGalleryBuilder.cs index b6121acc..a6fcb65b 100644 --- a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/MediaGalleryBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/MediaGalleryBuilder.cs @@ -28,10 +28,18 @@ public class MediaGalleryBuilder : IMessageComponentBuilder /// /// Initializes a new instance of the . /// - public MediaGalleryBuilder(IEnumerable items, int? id = null) + public MediaGalleryBuilder(params IEnumerable items) { - Items = items.ToList(); - Id = id; + Items = items?.ToList(); + } + + /// + /// Initializes a new from existing component. + /// + public MediaGalleryBuilder(MediaGalleryComponent mediaGallery) + { + Items = mediaGallery.Items.Select(x => x.ToProperties()).ToList(); + Id = mediaGallery.Id; } /// diff --git a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/SectionBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/SectionBuilder.cs index 6c9727f9..6a053624 100644 --- a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/SectionBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/SectionBuilder.cs @@ -38,6 +38,25 @@ public class SectionBuilder : IMessageComponentBuilder, IStaticComponentContaine set => _components = value ?? throw new ArgumentNullException(nameof(value), $"{nameof(Components)} cannot be null."); } + /// + /// Initializes a new . + /// + public SectionBuilder(IMessageComponentBuilder accessory = null, params IEnumerable components) + { + Accessory = accessory; + Components = components?.ToList(); + } + + /// + /// Initializes a new from existing component. + /// + public SectionBuilder(SectionComponent section) + { + Components = section.Components.Select(x => x.ToBuilder()).ToList(); + Accessory = section.Accessory.ToBuilder(); + Id = section.Id; + } + /// /// /// Only is supported. diff --git a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/SeparatorBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/SeparatorBuilder.cs index d308eddc..75a3d97f 100644 --- a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/SeparatorBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/SeparatorBuilder.cs @@ -18,6 +18,25 @@ public class SeparatorBuilder : IMessageComponentBuilder /// public int? Id { get; set; } + /// + /// Initializes a new . + /// + public SeparatorBuilder(bool isDivider = true, SeparatorSpacingSize spacing = SeparatorSpacingSize.Small) + { + IsDivider = isDivider; + Spacing = spacing; + } + + /// + /// Initializes a new from existing component. + /// + public SeparatorBuilder(SeparatorComponent separator) + { + IsDivider = separator.IsDivider; + Spacing = separator.Spacing; + Id = separator.Id; + } + /// /// Sets whether the component is a divider. /// diff --git a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/TextDisplayBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/TextDisplayBuilder.cs index eb2234eb..5a601007 100644 --- a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/TextDisplayBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/TextDisplayBuilder.cs @@ -34,6 +34,15 @@ public class TextDisplayBuilder : IMessageComponentBuilder Id = id; } + /// + /// Initializes a new from existing component. + /// + public TextDisplayBuilder(TextDisplayComponent textDisplay) + { + Content = textDisplay.Content; + Id = textDisplay.Id; + } + /// /// Sets the content of the text display. /// diff --git a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ThumbnailBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ThumbnailBuilder.cs index 79a5fa05..d15cc8dd 100644 --- a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ThumbnailBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ThumbnailBuilder.cs @@ -45,6 +45,17 @@ public class ThumbnailBuilder : IMessageComponentBuilder IsSpoiler = isSpoiler; } + /// + /// Initializes a new from existing component. + /// + public ThumbnailBuilder(ThumbnailComponent component) + { + Media = component.Media.ToProperties(); + Description = component.Description; + IsSpoiler = component.IsSpoiler; + Id = component.Id; + } + /// /// Sets the media of the thumbnail. ///