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.
///