@magicyan/discord 1.7.3 → 1.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ const flatten = require('./flatten.cjs');
4
+
5
+ function findMessageComponentById(source, id, type) {
6
+ const components = flatten.flattenMessageComponents(source);
7
+ return components.find(
8
+ (c) => c.id === id && (type === void 0 || c.type === type)
9
+ ) ?? null;
10
+ }
11
+
12
+ exports.findMessageComponentById = findMessageComponentById;
@@ -0,0 +1,10 @@
1
+ import { flattenMessageComponents } from './flatten.mjs';
2
+
3
+ function findMessageComponentById(source, id, type) {
4
+ const components = flattenMessageComponents(source);
5
+ return components.find(
6
+ (c) => c.id === id && (type === void 0 || c.type === type)
7
+ ) ?? null;
8
+ }
9
+
10
+ export { findMessageComponentById };
@@ -0,0 +1,35 @@
1
+ 'use strict';
2
+
3
+ const discord_js = require('discord.js');
4
+ const utils = require('./utils.cjs');
5
+
6
+ function flattenMessageComponents(source) {
7
+ const components = utils.resolveComponentsSource(source);
8
+ const hasNested = components.some(
9
+ (component) => component.type === discord_js.ComponentType.Container || component.type === discord_js.ComponentType.ActionRow || component.type === discord_js.ComponentType.Section
10
+ );
11
+ if (!hasNested)
12
+ return components;
13
+ const result = [];
14
+ function traverse(items) {
15
+ for (const component of items) {
16
+ result.push(component);
17
+ switch (component.type) {
18
+ case discord_js.ComponentType.Container:
19
+ case discord_js.ComponentType.ActionRow:
20
+ traverse(component.components);
21
+ break;
22
+ case discord_js.ComponentType.Section:
23
+ result.push(component.accessory);
24
+ if (component.components.length) {
25
+ traverse(component.components);
26
+ }
27
+ break;
28
+ }
29
+ }
30
+ }
31
+ traverse(components);
32
+ return result;
33
+ }
34
+
35
+ exports.flattenMessageComponents = flattenMessageComponents;
@@ -0,0 +1,33 @@
1
+ import { ComponentType } from 'discord.js';
2
+ import { resolveComponentsSource } from './utils.mjs';
3
+
4
+ function flattenMessageComponents(source) {
5
+ const components = resolveComponentsSource(source);
6
+ const hasNested = components.some(
7
+ (component) => component.type === ComponentType.Container || component.type === ComponentType.ActionRow || component.type === ComponentType.Section
8
+ );
9
+ if (!hasNested)
10
+ return components;
11
+ const result = [];
12
+ function traverse(items) {
13
+ for (const component of items) {
14
+ result.push(component);
15
+ switch (component.type) {
16
+ case ComponentType.Container:
17
+ case ComponentType.ActionRow:
18
+ traverse(component.components);
19
+ break;
20
+ case ComponentType.Section:
21
+ result.push(component.accessory);
22
+ if (component.components.length) {
23
+ traverse(component.components);
24
+ }
25
+ break;
26
+ }
27
+ }
28
+ }
29
+ traverse(components);
30
+ return result;
31
+ }
32
+
33
+ export { flattenMessageComponents };
@@ -2,14 +2,21 @@
2
2
 
3
3
  const discord_js = require('discord.js');
4
4
 
5
- function createThumbnail(data) {
6
- const thumbnail = new discord_js.ThumbnailBuilder();
5
+ function createThumbnail(data, id) {
7
6
  if (typeof data === "string") {
8
- return thumbnail.setURL(data);
7
+ return new discord_js.ThumbnailBuilder({
8
+ id,
9
+ media: { url: data }
10
+ });
9
11
  }
10
12
  if (data instanceof discord_js.AttachmentBuilder || data instanceof discord_js.Attachment) {
11
- return thumbnail.setURL(`attachment://${data.name}`).setSpoiler(data.spoiler);
13
+ return new discord_js.ThumbnailBuilder({
14
+ media: { url: `attachment://${data.name}` },
15
+ spoiler: data.spoiler,
16
+ id
17
+ });
12
18
  }
19
+ data.id ?? (data.id = id);
13
20
  return new discord_js.ThumbnailBuilder(data);
14
21
  }
15
22
 
@@ -1,13 +1,20 @@
1
1
  import { ThumbnailBuilder, AttachmentBuilder, Attachment } from 'discord.js';
2
2
 
3
- function createThumbnail(data) {
4
- const thumbnail = new ThumbnailBuilder();
3
+ function createThumbnail(data, id) {
5
4
  if (typeof data === "string") {
6
- return thumbnail.setURL(data);
5
+ return new ThumbnailBuilder({
6
+ id,
7
+ media: { url: data }
8
+ });
7
9
  }
8
10
  if (data instanceof AttachmentBuilder || data instanceof Attachment) {
9
- return thumbnail.setURL(`attachment://${data.name}`).setSpoiler(data.spoiler);
11
+ return new ThumbnailBuilder({
12
+ media: { url: `attachment://${data.name}` },
13
+ spoiler: data.spoiler,
14
+ id
15
+ });
10
16
  }
17
+ data.id ?? (data.id = id);
11
18
  return new ThumbnailBuilder(data);
12
19
  }
13
20
 
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+
3
+ function resolveComponentsSource(source) {
4
+ return Array.isArray(source) ? source : "message" in source ? source.message.components : source.components;
5
+ }
6
+
7
+ exports.resolveComponentsSource = resolveComponentsSource;
@@ -0,0 +1,5 @@
1
+ function resolveComponentsSource(source) {
2
+ return Array.isArray(source) ? source : "message" in source ? source.message.components : source.components;
3
+ }
4
+
5
+ export { resolveComponentsSource };
package/dist/index.cjs CHANGED
@@ -30,6 +30,8 @@ const thumbnail = require('./functions/components/thumbnail.cjs');
30
30
  const upload = require('./functions/components/upload.cjs');
31
31
  const checkbox = require('./functions/components/checkbox.cjs');
32
32
  const radio = require('./functions/components/radio.cjs');
33
+ const flatten = require('./functions/components/flatten.cjs');
34
+ const find = require('./functions/components/find.cjs');
33
35
  const assets = require('./functions/embeds/assets.cjs');
34
36
  const author = require('./functions/embeds/author.cjs');
35
37
  const embedplus = require('./functions/embeds/embedplus.cjs');
@@ -93,6 +95,8 @@ exports.createFileUpload = upload.createFileUpload;
93
95
  exports.createCheckbox = checkbox.createCheckbox;
94
96
  exports.createCheckboxGroup = checkbox.createCheckboxGroup;
95
97
  exports.createRadioGroup = radio.createRadioGroup;
98
+ exports.flattenMessageComponents = flatten.flattenMessageComponents;
99
+ exports.findMessageComponentById = find.findMessageComponentById;
96
100
  exports.createEmbedAsset = assets.createEmbedAsset;
97
101
  exports.createEmbedAuthor = author.createEmbedAuthor;
98
102
  exports.EmbedPlusBuilder = embedplus.EmbedPlusBuilder;
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as discord_js from 'discord.js';
2
- import { GatewayIntentBits, Partials, ChannelType, Guild, CommandInteractionOption, Client, ApplicationCommand, GuildEmoji, GuildMember, GuildTextBasedChannel, Message, Role, WebhookClientOptions, WebhookClient, WebhookClientData, ComponentEmojiResolvable, ButtonBuilder, ActionRowBuilder, LinkButtonComponentData, Attachment, AttachmentBuilder, MessageActionRowComponentBuilder, TextDisplayBuilder, SeparatorBuilder, FileBuilder, SectionBuilder, MediaGalleryBuilder, ContainerBuilder, ContainerComponentBuilder as ContainerComponentBuilder$1, ColorResolvable, ComponentType, ContainerComponentData, ContainerComponent, APIUnfurledMediaItem, MediaGalleryItemData, TextInputBuilder, TextInputComponentData, TextInputStyle, LabelBuilder, LabelBuilderData, ComponentInLabelData, ModalBuilder, Collection, ModalData, LabelComponentData, TextDisplayComponentData, AnyComponentBuilder, ThumbnailComponentData, ThumbnailBuilder, ButtonComponentData, FileUploadBuilder, CheckboxComponentData, CheckboxBuilder, CheckboxGroupComponentData, CheckboxGroupBuilder, RadioGroupComponentData, RadioGroupBuilder, EmbedAssetData, User, ClientUser, ImageURLOptions, EmbedFooterData, APIEmbed, Embed, EmbedData, EmbedBuilder, AttachmentData, MediaGalleryItemBuilder, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, ChannelSelectMenuBuilder, MentionableSelectMenuBuilder } from 'discord.js';
2
+ import { GatewayIntentBits, Partials, ChannelType, Guild, CommandInteractionOption, Client, ApplicationCommand, GuildEmoji, GuildMember, GuildTextBasedChannel, Message, Role, WebhookClientOptions, WebhookClient, WebhookClientData, ComponentEmojiResolvable, ButtonBuilder, ActionRowBuilder, LinkButtonComponentData, Attachment, AttachmentBuilder, MessageActionRowComponentBuilder, TextDisplayBuilder, SeparatorBuilder, FileBuilder, SectionBuilder, MediaGalleryBuilder, ContainerBuilder, ContainerComponentBuilder as ContainerComponentBuilder$1, ColorResolvable, ComponentType, ContainerComponentData, ContainerComponent, APIUnfurledMediaItem, MediaGalleryItemData, TextInputBuilder, TextInputComponentData, TextInputStyle, LabelBuilder, LabelBuilderData, ComponentInLabelData, ModalBuilder, Collection, ModalData, LabelComponentData, TextDisplayComponentData, AnyComponentBuilder, ThumbnailComponentData, ThumbnailBuilder, ButtonComponentData, FileUploadBuilder, CheckboxComponentData, CheckboxBuilder, CheckboxGroupComponentData, CheckboxGroupBuilder, RadioGroupComponentData, RadioGroupBuilder, TopLevelComponent, MessageActionRowComponent, ThumbnailComponent, MediaGalleryComponent, ButtonComponent, StringSelectMenuComponent, UserSelectMenuComponent, RoleSelectMenuComponent, MentionableSelectMenuComponent, ChannelSelectMenuComponent, SectionComponent, SeparatorComponent, FileComponent, TextDisplayComponent, EmbedAssetData, User, ClientUser, ImageURLOptions, EmbedFooterData, APIEmbed, Embed, EmbedData, EmbedBuilder, AttachmentData, MediaGalleryItemBuilder, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, ChannelSelectMenuBuilder, MentionableSelectMenuBuilder } from 'discord.js';
3
3
  export * from '@magicyan/core';
4
4
 
5
5
  declare const chars: {
@@ -620,7 +620,7 @@ type ThumbnailData = Partial<Omit<ThumbnailComponentData, "type">> | Attachment
620
620
  * spoiler: true
621
621
  * });
622
622
  */
623
- declare function createThumbnail(data: ThumbnailData): ThumbnailBuilder;
623
+ declare function createThumbnail(data: ThumbnailData, id?: number): ThumbnailBuilder;
624
624
 
625
625
  type SectionThumbnailAccessory = ThumbnailBuilder | ThumbnailData;
626
626
  type SectionButtonAccessory = ButtonBuilder | Partial<ButtonComponentData>;
@@ -949,6 +949,92 @@ type CreateRadioGroup = Omit<RadioGroupComponentData, "type">;
949
949
  */
950
950
  declare function createRadioGroup(data: CreateRadioGroup): RadioGroupBuilder;
951
951
 
952
+ type MessageComponentWithId = TopLevelComponent | MessageActionRowComponent | ThumbnailComponent | MediaGalleryComponent;
953
+ type MessageComponentSource = MessageComponentWithId[] | {
954
+ components: MessageComponentWithId[];
955
+ } | {
956
+ message: {
957
+ components: MessageComponentWithId[];
958
+ };
959
+ };
960
+
961
+ /**
962
+ * Recursively traverses a message component tree and returns a flat array
963
+ * containing all components found in the structure.
964
+ *
965
+ * Supports component sources as a direct component array, an object with
966
+ * a `components` property, or an object containing `message.components`.
967
+ *
968
+ * Nested components inside containers and action rows are traversed
969
+ * recursively. For section components, the accessory component and any
970
+ * nested components are also included in the result.
971
+ *
972
+ * @param source The source containing the message components to flatten.
973
+ * @returns A flat array containing all components found in traversal order.
974
+ */
975
+ declare function flattenMessageComponents(source: MessageComponentSource): MessageComponentWithId[];
976
+
977
+ /**
978
+ * Finds a component by its identifier.
979
+ */
980
+ declare function findMessageComponentById(source: MessageComponentSource, id: number): MessageComponentWithId | null;
981
+ /**
982
+ * Finds a {@link ButtonComponent} by its identifier.
983
+ */
984
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.Button): ButtonComponent | null;
985
+ /**
986
+ * Finds a {@link StringSelectMenuComponent} by its identifier.
987
+ */
988
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.StringSelect): StringSelectMenuComponent | null;
989
+ /**
990
+ * Finds a {@link UserSelectMenuComponent} by its identifier.
991
+ */
992
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.UserSelect): UserSelectMenuComponent | null;
993
+ /**
994
+ * Finds a {@link RoleSelectMenuComponent} by its identifier.
995
+ */
996
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.RoleSelect): RoleSelectMenuComponent | null;
997
+ /**
998
+ * Finds a {@link MentionableSelectMenuComponent} by its identifier.
999
+ */
1000
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.MentionableSelect): MentionableSelectMenuComponent | null;
1001
+ /**
1002
+ * Finds a {@link ChannelSelectMenuComponent} by its identifier.
1003
+ */
1004
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.ChannelSelect): ChannelSelectMenuComponent | null;
1005
+ /**
1006
+ * Finds a {@link ContainerComponent} by its identifier.
1007
+ */
1008
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.Container): ContainerComponent | null;
1009
+ /**
1010
+ * Finds a {@link SectionComponent} by its identifier.
1011
+ */
1012
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.Section): SectionComponent | null;
1013
+ /**
1014
+ * Finds a {@link MediaGalleryComponent} by its identifier.
1015
+ */
1016
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.MediaGallery): MediaGalleryComponent | null;
1017
+ /**
1018
+ * Finds a {@link ThumbnailComponent} by its identifier.
1019
+ */
1020
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.Thumbnail): ThumbnailComponent | null;
1021
+ /**
1022
+ * Finds a {@link SeparatorComponent} by its identifier.
1023
+ */
1024
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.Separator): SeparatorComponent | null;
1025
+ /**
1026
+ * Finds a {@link FileComponent} by its identifier.
1027
+ */
1028
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.File): FileComponent | null;
1029
+ /**
1030
+ * Finds a {@link TextDisplayComponent} by its identifier.
1031
+ */
1032
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.TextDisplay): TextDisplayComponent | null;
1033
+ /**
1034
+ * Finds a {@link MessageActionRowComponent} by its identifier.
1035
+ */
1036
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.ActionRow): MessageActionRowComponent | null;
1037
+
952
1038
  type EmbedPlusAssetData = string | Attachment | AttachmentBuilder | EmbedAssetData | undefined | null;
953
1039
  type EmbedAssetOptions = Omit<EmbedAssetData, "url">;
954
1040
  declare function createEmbedAsset(source: EmbedPlusAssetData, options?: EmbedAssetOptions): EmbedAssetData | undefined;
@@ -1375,5 +1461,5 @@ declare function isTextInputBuilder(value: unknown): value is TextInputBuilder;
1375
1461
  */
1376
1462
  declare function isMessage(value: unknown): value is Message;
1377
1463
 
1378
- export { ContainerPlusBuilder, CustomItents, CustomPartials, EmbedLimit, EmbedPlusBuilder, Separator, chars, commandMention, createCheckbox, createCheckboxGroup, createComponents, createContainer, createEmbed, createEmbedAsset, createEmbedAuthor, createEmbedFiles, createEmbedFooter, createFile, createFileUpload, createLabel, createLinkButton, createMediaGallery, createModal, createModalFields, createModalInput, createRadioGroup, createRow, createSection, createSeparator, createTextDisplay, createTextInput, createThumbArea, createThumbnail, createWebhookClient, extractMentionId, fetchMessageFromURL, findChannel, findCommand, findEmoji, findMember, findMessage, findRole, getChannelUrlInfo, getMessageURLInfo, isActionRowBuilder, isAnySelectMenuBuilder, isAttachment, isButtonBuilder, isChannelSelectMenuBuilder, isContainerBuilder, isFileBuilder, isMediaGalleryBuilder, isMediaGalleryItemBuilder, isMentionableSelectMenuBuilder, isMessage, isModalBuilder, isRoleSelectMenuBuilder, isSectionBuilder, isSeparatorBuilder, isStringSelectMenuBuilder, isTextDisplayBuilder, isTextInputBuilder, isUserSelectMenuBuilder, modalFieldsToRecord, setMobileStatus, wrapButtons };
1464
+ export { ContainerPlusBuilder, CustomItents, CustomPartials, EmbedLimit, EmbedPlusBuilder, Separator, chars, commandMention, createCheckbox, createCheckboxGroup, createComponents, createContainer, createEmbed, createEmbedAsset, createEmbedAuthor, createEmbedFiles, createEmbedFooter, createFile, createFileUpload, createLabel, createLinkButton, createMediaGallery, createModal, createModalFields, createModalInput, createRadioGroup, createRow, createSection, createSeparator, createTextDisplay, createTextInput, createThumbArea, createThumbnail, createWebhookClient, extractMentionId, fetchMessageFromURL, findChannel, findCommand, findEmoji, findMember, findMessage, findMessageComponentById, findRole, flattenMessageComponents, getChannelUrlInfo, getMessageURLInfo, isActionRowBuilder, isAnySelectMenuBuilder, isAttachment, isButtonBuilder, isChannelSelectMenuBuilder, isContainerBuilder, isFileBuilder, isMediaGalleryBuilder, isMediaGalleryItemBuilder, isMentionableSelectMenuBuilder, isMessage, isModalBuilder, isRoleSelectMenuBuilder, isSectionBuilder, isSeparatorBuilder, isStringSelectMenuBuilder, isTextDisplayBuilder, isTextInputBuilder, isUserSelectMenuBuilder, modalFieldsToRecord, setMobileStatus, wrapButtons };
1379
1465
  export type { AnyEmbedData, AnySelectMenuBuilder, ComponentBuildersData, ComponentData, ContainerColor, ContainerComponentBuilder, ContainerData, ContainerInComponentType, CreateCheckboxData, CreateCheckboxGroupData, CreateComponentData, CreateModalOptions, CreateRadioGroup, EmbedPlusAssetData, EmbedPlusAuthorData, EmbedPlusColorData, EmbedPlusData, EmbedPlusFooterData, EmbedPlusProperty, FileUploadData, MagicComponentData, MediaGallerySource, SectionAccessory, SectionAccessoryData, SectionButtonAccessory, SectionData, SectionThumbnailAccessory, SeparatorData, ThumbAreaData, ThumbAreaThumbnail, ThumbnailData };
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as discord_js from 'discord.js';
2
- import { GatewayIntentBits, Partials, ChannelType, Guild, CommandInteractionOption, Client, ApplicationCommand, GuildEmoji, GuildMember, GuildTextBasedChannel, Message, Role, WebhookClientOptions, WebhookClient, WebhookClientData, ComponentEmojiResolvable, ButtonBuilder, ActionRowBuilder, LinkButtonComponentData, Attachment, AttachmentBuilder, MessageActionRowComponentBuilder, TextDisplayBuilder, SeparatorBuilder, FileBuilder, SectionBuilder, MediaGalleryBuilder, ContainerBuilder, ContainerComponentBuilder as ContainerComponentBuilder$1, ColorResolvable, ComponentType, ContainerComponentData, ContainerComponent, APIUnfurledMediaItem, MediaGalleryItemData, TextInputBuilder, TextInputComponentData, TextInputStyle, LabelBuilder, LabelBuilderData, ComponentInLabelData, ModalBuilder, Collection, ModalData, LabelComponentData, TextDisplayComponentData, AnyComponentBuilder, ThumbnailComponentData, ThumbnailBuilder, ButtonComponentData, FileUploadBuilder, CheckboxComponentData, CheckboxBuilder, CheckboxGroupComponentData, CheckboxGroupBuilder, RadioGroupComponentData, RadioGroupBuilder, EmbedAssetData, User, ClientUser, ImageURLOptions, EmbedFooterData, APIEmbed, Embed, EmbedData, EmbedBuilder, AttachmentData, MediaGalleryItemBuilder, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, ChannelSelectMenuBuilder, MentionableSelectMenuBuilder } from 'discord.js';
2
+ import { GatewayIntentBits, Partials, ChannelType, Guild, CommandInteractionOption, Client, ApplicationCommand, GuildEmoji, GuildMember, GuildTextBasedChannel, Message, Role, WebhookClientOptions, WebhookClient, WebhookClientData, ComponentEmojiResolvable, ButtonBuilder, ActionRowBuilder, LinkButtonComponentData, Attachment, AttachmentBuilder, MessageActionRowComponentBuilder, TextDisplayBuilder, SeparatorBuilder, FileBuilder, SectionBuilder, MediaGalleryBuilder, ContainerBuilder, ContainerComponentBuilder as ContainerComponentBuilder$1, ColorResolvable, ComponentType, ContainerComponentData, ContainerComponent, APIUnfurledMediaItem, MediaGalleryItemData, TextInputBuilder, TextInputComponentData, TextInputStyle, LabelBuilder, LabelBuilderData, ComponentInLabelData, ModalBuilder, Collection, ModalData, LabelComponentData, TextDisplayComponentData, AnyComponentBuilder, ThumbnailComponentData, ThumbnailBuilder, ButtonComponentData, FileUploadBuilder, CheckboxComponentData, CheckboxBuilder, CheckboxGroupComponentData, CheckboxGroupBuilder, RadioGroupComponentData, RadioGroupBuilder, TopLevelComponent, MessageActionRowComponent, ThumbnailComponent, MediaGalleryComponent, ButtonComponent, StringSelectMenuComponent, UserSelectMenuComponent, RoleSelectMenuComponent, MentionableSelectMenuComponent, ChannelSelectMenuComponent, SectionComponent, SeparatorComponent, FileComponent, TextDisplayComponent, EmbedAssetData, User, ClientUser, ImageURLOptions, EmbedFooterData, APIEmbed, Embed, EmbedData, EmbedBuilder, AttachmentData, MediaGalleryItemBuilder, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, ChannelSelectMenuBuilder, MentionableSelectMenuBuilder } from 'discord.js';
3
3
  export * from '@magicyan/core';
4
4
 
5
5
  declare const chars: {
@@ -620,7 +620,7 @@ type ThumbnailData = Partial<Omit<ThumbnailComponentData, "type">> | Attachment
620
620
  * spoiler: true
621
621
  * });
622
622
  */
623
- declare function createThumbnail(data: ThumbnailData): ThumbnailBuilder;
623
+ declare function createThumbnail(data: ThumbnailData, id?: number): ThumbnailBuilder;
624
624
 
625
625
  type SectionThumbnailAccessory = ThumbnailBuilder | ThumbnailData;
626
626
  type SectionButtonAccessory = ButtonBuilder | Partial<ButtonComponentData>;
@@ -949,6 +949,92 @@ type CreateRadioGroup = Omit<RadioGroupComponentData, "type">;
949
949
  */
950
950
  declare function createRadioGroup(data: CreateRadioGroup): RadioGroupBuilder;
951
951
 
952
+ type MessageComponentWithId = TopLevelComponent | MessageActionRowComponent | ThumbnailComponent | MediaGalleryComponent;
953
+ type MessageComponentSource = MessageComponentWithId[] | {
954
+ components: MessageComponentWithId[];
955
+ } | {
956
+ message: {
957
+ components: MessageComponentWithId[];
958
+ };
959
+ };
960
+
961
+ /**
962
+ * Recursively traverses a message component tree and returns a flat array
963
+ * containing all components found in the structure.
964
+ *
965
+ * Supports component sources as a direct component array, an object with
966
+ * a `components` property, or an object containing `message.components`.
967
+ *
968
+ * Nested components inside containers and action rows are traversed
969
+ * recursively. For section components, the accessory component and any
970
+ * nested components are also included in the result.
971
+ *
972
+ * @param source The source containing the message components to flatten.
973
+ * @returns A flat array containing all components found in traversal order.
974
+ */
975
+ declare function flattenMessageComponents(source: MessageComponentSource): MessageComponentWithId[];
976
+
977
+ /**
978
+ * Finds a component by its identifier.
979
+ */
980
+ declare function findMessageComponentById(source: MessageComponentSource, id: number): MessageComponentWithId | null;
981
+ /**
982
+ * Finds a {@link ButtonComponent} by its identifier.
983
+ */
984
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.Button): ButtonComponent | null;
985
+ /**
986
+ * Finds a {@link StringSelectMenuComponent} by its identifier.
987
+ */
988
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.StringSelect): StringSelectMenuComponent | null;
989
+ /**
990
+ * Finds a {@link UserSelectMenuComponent} by its identifier.
991
+ */
992
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.UserSelect): UserSelectMenuComponent | null;
993
+ /**
994
+ * Finds a {@link RoleSelectMenuComponent} by its identifier.
995
+ */
996
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.RoleSelect): RoleSelectMenuComponent | null;
997
+ /**
998
+ * Finds a {@link MentionableSelectMenuComponent} by its identifier.
999
+ */
1000
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.MentionableSelect): MentionableSelectMenuComponent | null;
1001
+ /**
1002
+ * Finds a {@link ChannelSelectMenuComponent} by its identifier.
1003
+ */
1004
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.ChannelSelect): ChannelSelectMenuComponent | null;
1005
+ /**
1006
+ * Finds a {@link ContainerComponent} by its identifier.
1007
+ */
1008
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.Container): ContainerComponent | null;
1009
+ /**
1010
+ * Finds a {@link SectionComponent} by its identifier.
1011
+ */
1012
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.Section): SectionComponent | null;
1013
+ /**
1014
+ * Finds a {@link MediaGalleryComponent} by its identifier.
1015
+ */
1016
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.MediaGallery): MediaGalleryComponent | null;
1017
+ /**
1018
+ * Finds a {@link ThumbnailComponent} by its identifier.
1019
+ */
1020
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.Thumbnail): ThumbnailComponent | null;
1021
+ /**
1022
+ * Finds a {@link SeparatorComponent} by its identifier.
1023
+ */
1024
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.Separator): SeparatorComponent | null;
1025
+ /**
1026
+ * Finds a {@link FileComponent} by its identifier.
1027
+ */
1028
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.File): FileComponent | null;
1029
+ /**
1030
+ * Finds a {@link TextDisplayComponent} by its identifier.
1031
+ */
1032
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.TextDisplay): TextDisplayComponent | null;
1033
+ /**
1034
+ * Finds a {@link MessageActionRowComponent} by its identifier.
1035
+ */
1036
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.ActionRow): MessageActionRowComponent | null;
1037
+
952
1038
  type EmbedPlusAssetData = string | Attachment | AttachmentBuilder | EmbedAssetData | undefined | null;
953
1039
  type EmbedAssetOptions = Omit<EmbedAssetData, "url">;
954
1040
  declare function createEmbedAsset(source: EmbedPlusAssetData, options?: EmbedAssetOptions): EmbedAssetData | undefined;
@@ -1375,5 +1461,5 @@ declare function isTextInputBuilder(value: unknown): value is TextInputBuilder;
1375
1461
  */
1376
1462
  declare function isMessage(value: unknown): value is Message;
1377
1463
 
1378
- export { ContainerPlusBuilder, CustomItents, CustomPartials, EmbedLimit, EmbedPlusBuilder, Separator, chars, commandMention, createCheckbox, createCheckboxGroup, createComponents, createContainer, createEmbed, createEmbedAsset, createEmbedAuthor, createEmbedFiles, createEmbedFooter, createFile, createFileUpload, createLabel, createLinkButton, createMediaGallery, createModal, createModalFields, createModalInput, createRadioGroup, createRow, createSection, createSeparator, createTextDisplay, createTextInput, createThumbArea, createThumbnail, createWebhookClient, extractMentionId, fetchMessageFromURL, findChannel, findCommand, findEmoji, findMember, findMessage, findRole, getChannelUrlInfo, getMessageURLInfo, isActionRowBuilder, isAnySelectMenuBuilder, isAttachment, isButtonBuilder, isChannelSelectMenuBuilder, isContainerBuilder, isFileBuilder, isMediaGalleryBuilder, isMediaGalleryItemBuilder, isMentionableSelectMenuBuilder, isMessage, isModalBuilder, isRoleSelectMenuBuilder, isSectionBuilder, isSeparatorBuilder, isStringSelectMenuBuilder, isTextDisplayBuilder, isTextInputBuilder, isUserSelectMenuBuilder, modalFieldsToRecord, setMobileStatus, wrapButtons };
1464
+ export { ContainerPlusBuilder, CustomItents, CustomPartials, EmbedLimit, EmbedPlusBuilder, Separator, chars, commandMention, createCheckbox, createCheckboxGroup, createComponents, createContainer, createEmbed, createEmbedAsset, createEmbedAuthor, createEmbedFiles, createEmbedFooter, createFile, createFileUpload, createLabel, createLinkButton, createMediaGallery, createModal, createModalFields, createModalInput, createRadioGroup, createRow, createSection, createSeparator, createTextDisplay, createTextInput, createThumbArea, createThumbnail, createWebhookClient, extractMentionId, fetchMessageFromURL, findChannel, findCommand, findEmoji, findMember, findMessage, findMessageComponentById, findRole, flattenMessageComponents, getChannelUrlInfo, getMessageURLInfo, isActionRowBuilder, isAnySelectMenuBuilder, isAttachment, isButtonBuilder, isChannelSelectMenuBuilder, isContainerBuilder, isFileBuilder, isMediaGalleryBuilder, isMediaGalleryItemBuilder, isMentionableSelectMenuBuilder, isMessage, isModalBuilder, isRoleSelectMenuBuilder, isSectionBuilder, isSeparatorBuilder, isStringSelectMenuBuilder, isTextDisplayBuilder, isTextInputBuilder, isUserSelectMenuBuilder, modalFieldsToRecord, setMobileStatus, wrapButtons };
1379
1465
  export type { AnyEmbedData, AnySelectMenuBuilder, ComponentBuildersData, ComponentData, ContainerColor, ContainerComponentBuilder, ContainerData, ContainerInComponentType, CreateCheckboxData, CreateCheckboxGroupData, CreateComponentData, CreateModalOptions, CreateRadioGroup, EmbedPlusAssetData, EmbedPlusAuthorData, EmbedPlusColorData, EmbedPlusData, EmbedPlusFooterData, EmbedPlusProperty, FileUploadData, MagicComponentData, MediaGallerySource, SectionAccessory, SectionAccessoryData, SectionButtonAccessory, SectionData, SectionThumbnailAccessory, SeparatorData, ThumbAreaData, ThumbAreaThumbnail, ThumbnailData };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as discord_js from 'discord.js';
2
- import { GatewayIntentBits, Partials, ChannelType, Guild, CommandInteractionOption, Client, ApplicationCommand, GuildEmoji, GuildMember, GuildTextBasedChannel, Message, Role, WebhookClientOptions, WebhookClient, WebhookClientData, ComponentEmojiResolvable, ButtonBuilder, ActionRowBuilder, LinkButtonComponentData, Attachment, AttachmentBuilder, MessageActionRowComponentBuilder, TextDisplayBuilder, SeparatorBuilder, FileBuilder, SectionBuilder, MediaGalleryBuilder, ContainerBuilder, ContainerComponentBuilder as ContainerComponentBuilder$1, ColorResolvable, ComponentType, ContainerComponentData, ContainerComponent, APIUnfurledMediaItem, MediaGalleryItemData, TextInputBuilder, TextInputComponentData, TextInputStyle, LabelBuilder, LabelBuilderData, ComponentInLabelData, ModalBuilder, Collection, ModalData, LabelComponentData, TextDisplayComponentData, AnyComponentBuilder, ThumbnailComponentData, ThumbnailBuilder, ButtonComponentData, FileUploadBuilder, CheckboxComponentData, CheckboxBuilder, CheckboxGroupComponentData, CheckboxGroupBuilder, RadioGroupComponentData, RadioGroupBuilder, EmbedAssetData, User, ClientUser, ImageURLOptions, EmbedFooterData, APIEmbed, Embed, EmbedData, EmbedBuilder, AttachmentData, MediaGalleryItemBuilder, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, ChannelSelectMenuBuilder, MentionableSelectMenuBuilder } from 'discord.js';
2
+ import { GatewayIntentBits, Partials, ChannelType, Guild, CommandInteractionOption, Client, ApplicationCommand, GuildEmoji, GuildMember, GuildTextBasedChannel, Message, Role, WebhookClientOptions, WebhookClient, WebhookClientData, ComponentEmojiResolvable, ButtonBuilder, ActionRowBuilder, LinkButtonComponentData, Attachment, AttachmentBuilder, MessageActionRowComponentBuilder, TextDisplayBuilder, SeparatorBuilder, FileBuilder, SectionBuilder, MediaGalleryBuilder, ContainerBuilder, ContainerComponentBuilder as ContainerComponentBuilder$1, ColorResolvable, ComponentType, ContainerComponentData, ContainerComponent, APIUnfurledMediaItem, MediaGalleryItemData, TextInputBuilder, TextInputComponentData, TextInputStyle, LabelBuilder, LabelBuilderData, ComponentInLabelData, ModalBuilder, Collection, ModalData, LabelComponentData, TextDisplayComponentData, AnyComponentBuilder, ThumbnailComponentData, ThumbnailBuilder, ButtonComponentData, FileUploadBuilder, CheckboxComponentData, CheckboxBuilder, CheckboxGroupComponentData, CheckboxGroupBuilder, RadioGroupComponentData, RadioGroupBuilder, TopLevelComponent, MessageActionRowComponent, ThumbnailComponent, MediaGalleryComponent, ButtonComponent, StringSelectMenuComponent, UserSelectMenuComponent, RoleSelectMenuComponent, MentionableSelectMenuComponent, ChannelSelectMenuComponent, SectionComponent, SeparatorComponent, FileComponent, TextDisplayComponent, EmbedAssetData, User, ClientUser, ImageURLOptions, EmbedFooterData, APIEmbed, Embed, EmbedData, EmbedBuilder, AttachmentData, MediaGalleryItemBuilder, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, ChannelSelectMenuBuilder, MentionableSelectMenuBuilder } from 'discord.js';
3
3
  export * from '@magicyan/core';
4
4
 
5
5
  declare const chars: {
@@ -620,7 +620,7 @@ type ThumbnailData = Partial<Omit<ThumbnailComponentData, "type">> | Attachment
620
620
  * spoiler: true
621
621
  * });
622
622
  */
623
- declare function createThumbnail(data: ThumbnailData): ThumbnailBuilder;
623
+ declare function createThumbnail(data: ThumbnailData, id?: number): ThumbnailBuilder;
624
624
 
625
625
  type SectionThumbnailAccessory = ThumbnailBuilder | ThumbnailData;
626
626
  type SectionButtonAccessory = ButtonBuilder | Partial<ButtonComponentData>;
@@ -949,6 +949,92 @@ type CreateRadioGroup = Omit<RadioGroupComponentData, "type">;
949
949
  */
950
950
  declare function createRadioGroup(data: CreateRadioGroup): RadioGroupBuilder;
951
951
 
952
+ type MessageComponentWithId = TopLevelComponent | MessageActionRowComponent | ThumbnailComponent | MediaGalleryComponent;
953
+ type MessageComponentSource = MessageComponentWithId[] | {
954
+ components: MessageComponentWithId[];
955
+ } | {
956
+ message: {
957
+ components: MessageComponentWithId[];
958
+ };
959
+ };
960
+
961
+ /**
962
+ * Recursively traverses a message component tree and returns a flat array
963
+ * containing all components found in the structure.
964
+ *
965
+ * Supports component sources as a direct component array, an object with
966
+ * a `components` property, or an object containing `message.components`.
967
+ *
968
+ * Nested components inside containers and action rows are traversed
969
+ * recursively. For section components, the accessory component and any
970
+ * nested components are also included in the result.
971
+ *
972
+ * @param source The source containing the message components to flatten.
973
+ * @returns A flat array containing all components found in traversal order.
974
+ */
975
+ declare function flattenMessageComponents(source: MessageComponentSource): MessageComponentWithId[];
976
+
977
+ /**
978
+ * Finds a component by its identifier.
979
+ */
980
+ declare function findMessageComponentById(source: MessageComponentSource, id: number): MessageComponentWithId | null;
981
+ /**
982
+ * Finds a {@link ButtonComponent} by its identifier.
983
+ */
984
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.Button): ButtonComponent | null;
985
+ /**
986
+ * Finds a {@link StringSelectMenuComponent} by its identifier.
987
+ */
988
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.StringSelect): StringSelectMenuComponent | null;
989
+ /**
990
+ * Finds a {@link UserSelectMenuComponent} by its identifier.
991
+ */
992
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.UserSelect): UserSelectMenuComponent | null;
993
+ /**
994
+ * Finds a {@link RoleSelectMenuComponent} by its identifier.
995
+ */
996
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.RoleSelect): RoleSelectMenuComponent | null;
997
+ /**
998
+ * Finds a {@link MentionableSelectMenuComponent} by its identifier.
999
+ */
1000
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.MentionableSelect): MentionableSelectMenuComponent | null;
1001
+ /**
1002
+ * Finds a {@link ChannelSelectMenuComponent} by its identifier.
1003
+ */
1004
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.ChannelSelect): ChannelSelectMenuComponent | null;
1005
+ /**
1006
+ * Finds a {@link ContainerComponent} by its identifier.
1007
+ */
1008
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.Container): ContainerComponent | null;
1009
+ /**
1010
+ * Finds a {@link SectionComponent} by its identifier.
1011
+ */
1012
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.Section): SectionComponent | null;
1013
+ /**
1014
+ * Finds a {@link MediaGalleryComponent} by its identifier.
1015
+ */
1016
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.MediaGallery): MediaGalleryComponent | null;
1017
+ /**
1018
+ * Finds a {@link ThumbnailComponent} by its identifier.
1019
+ */
1020
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.Thumbnail): ThumbnailComponent | null;
1021
+ /**
1022
+ * Finds a {@link SeparatorComponent} by its identifier.
1023
+ */
1024
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.Separator): SeparatorComponent | null;
1025
+ /**
1026
+ * Finds a {@link FileComponent} by its identifier.
1027
+ */
1028
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.File): FileComponent | null;
1029
+ /**
1030
+ * Finds a {@link TextDisplayComponent} by its identifier.
1031
+ */
1032
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.TextDisplay): TextDisplayComponent | null;
1033
+ /**
1034
+ * Finds a {@link MessageActionRowComponent} by its identifier.
1035
+ */
1036
+ declare function findMessageComponentById(source: MessageComponentSource, id: number, type: ComponentType.ActionRow): MessageActionRowComponent | null;
1037
+
952
1038
  type EmbedPlusAssetData = string | Attachment | AttachmentBuilder | EmbedAssetData | undefined | null;
953
1039
  type EmbedAssetOptions = Omit<EmbedAssetData, "url">;
954
1040
  declare function createEmbedAsset(source: EmbedPlusAssetData, options?: EmbedAssetOptions): EmbedAssetData | undefined;
@@ -1375,5 +1461,5 @@ declare function isTextInputBuilder(value: unknown): value is TextInputBuilder;
1375
1461
  */
1376
1462
  declare function isMessage(value: unknown): value is Message;
1377
1463
 
1378
- export { ContainerPlusBuilder, CustomItents, CustomPartials, EmbedLimit, EmbedPlusBuilder, Separator, chars, commandMention, createCheckbox, createCheckboxGroup, createComponents, createContainer, createEmbed, createEmbedAsset, createEmbedAuthor, createEmbedFiles, createEmbedFooter, createFile, createFileUpload, createLabel, createLinkButton, createMediaGallery, createModal, createModalFields, createModalInput, createRadioGroup, createRow, createSection, createSeparator, createTextDisplay, createTextInput, createThumbArea, createThumbnail, createWebhookClient, extractMentionId, fetchMessageFromURL, findChannel, findCommand, findEmoji, findMember, findMessage, findRole, getChannelUrlInfo, getMessageURLInfo, isActionRowBuilder, isAnySelectMenuBuilder, isAttachment, isButtonBuilder, isChannelSelectMenuBuilder, isContainerBuilder, isFileBuilder, isMediaGalleryBuilder, isMediaGalleryItemBuilder, isMentionableSelectMenuBuilder, isMessage, isModalBuilder, isRoleSelectMenuBuilder, isSectionBuilder, isSeparatorBuilder, isStringSelectMenuBuilder, isTextDisplayBuilder, isTextInputBuilder, isUserSelectMenuBuilder, modalFieldsToRecord, setMobileStatus, wrapButtons };
1464
+ export { ContainerPlusBuilder, CustomItents, CustomPartials, EmbedLimit, EmbedPlusBuilder, Separator, chars, commandMention, createCheckbox, createCheckboxGroup, createComponents, createContainer, createEmbed, createEmbedAsset, createEmbedAuthor, createEmbedFiles, createEmbedFooter, createFile, createFileUpload, createLabel, createLinkButton, createMediaGallery, createModal, createModalFields, createModalInput, createRadioGroup, createRow, createSection, createSeparator, createTextDisplay, createTextInput, createThumbArea, createThumbnail, createWebhookClient, extractMentionId, fetchMessageFromURL, findChannel, findCommand, findEmoji, findMember, findMessage, findMessageComponentById, findRole, flattenMessageComponents, getChannelUrlInfo, getMessageURLInfo, isActionRowBuilder, isAnySelectMenuBuilder, isAttachment, isButtonBuilder, isChannelSelectMenuBuilder, isContainerBuilder, isFileBuilder, isMediaGalleryBuilder, isMediaGalleryItemBuilder, isMentionableSelectMenuBuilder, isMessage, isModalBuilder, isRoleSelectMenuBuilder, isSectionBuilder, isSeparatorBuilder, isStringSelectMenuBuilder, isTextDisplayBuilder, isTextInputBuilder, isUserSelectMenuBuilder, modalFieldsToRecord, setMobileStatus, wrapButtons };
1379
1465
  export type { AnyEmbedData, AnySelectMenuBuilder, ComponentBuildersData, ComponentData, ContainerColor, ContainerComponentBuilder, ContainerData, ContainerInComponentType, CreateCheckboxData, CreateCheckboxGroupData, CreateComponentData, CreateModalOptions, CreateRadioGroup, EmbedPlusAssetData, EmbedPlusAuthorData, EmbedPlusColorData, EmbedPlusData, EmbedPlusFooterData, EmbedPlusProperty, FileUploadData, MagicComponentData, MediaGallerySource, SectionAccessory, SectionAccessoryData, SectionButtonAccessory, SectionData, SectionThumbnailAccessory, SeparatorData, ThumbAreaData, ThumbAreaThumbnail, ThumbnailData };
package/dist/index.mjs CHANGED
@@ -28,6 +28,8 @@ export { createThumbnail } from './functions/components/thumbnail.mjs';
28
28
  export { createFileUpload } from './functions/components/upload.mjs';
29
29
  export { createCheckbox, createCheckboxGroup } from './functions/components/checkbox.mjs';
30
30
  export { createRadioGroup } from './functions/components/radio.mjs';
31
+ export { flattenMessageComponents } from './functions/components/flatten.mjs';
32
+ export { findMessageComponentById } from './functions/components/find.mjs';
31
33
  export { createEmbedAsset } from './functions/embeds/assets.mjs';
32
34
  export { createEmbedAuthor } from './functions/embeds/author.mjs';
33
35
  export { EmbedPlusBuilder, createEmbed } from './functions/embeds/embedplus.mjs';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magicyan/discord",
3
- "version": "1.7.3",
3
+ "version": "1.7.4",
4
4
  "description": "Simple functions to facilitate discord bot development",
5
5
  "license": "MIT",
6
6
  "type": "module",