@magicyan/discord 1.4.10 → 1.4.11

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.
@@ -3,7 +3,16 @@
3
3
  const discord_js = require('discord.js');
4
4
  const row = require('./row.cjs');
5
5
 
6
- function createLinkButton(data) {
6
+ function createLinkButton(data, label, emoji) {
7
+ if (typeof data === "string") {
8
+ label ?? (label = data);
9
+ return new discord_js.ButtonBuilder({
10
+ style: discord_js.ButtonStyle.Link,
11
+ label,
12
+ url: data,
13
+ emoji
14
+ });
15
+ }
7
16
  data.label ?? (data.label = data.url);
8
17
  return new discord_js.ButtonBuilder({ style: discord_js.ButtonStyle.Link, ...data });
9
18
  }
@@ -1,7 +1,16 @@
1
1
  import { ButtonBuilder, ButtonStyle } from 'discord.js';
2
2
  import { createRow } from './row.mjs';
3
3
 
4
- function createLinkButton(data) {
4
+ function createLinkButton(data, label, emoji) {
5
+ if (typeof data === "string") {
6
+ label ?? (label = data);
7
+ return new ButtonBuilder({
8
+ style: ButtonStyle.Link,
9
+ label,
10
+ url: data,
11
+ emoji
12
+ });
13
+ }
5
14
  data.label ?? (data.label = data.url);
6
15
  return new ButtonBuilder({ style: ButtonStyle.Link, ...data });
7
16
  }
@@ -1,21 +1,18 @@
1
1
  'use strict';
2
2
 
3
+ const core = require('@magicyan/core');
3
4
  const attachment = require('../../guards/attachment.cjs');
4
5
  const button = require('../../guards/button.cjs');
5
6
  const selectmenu = require('../../guards/selectmenu.cjs');
6
7
  const gallery = require('./gallery.cjs');
7
8
  const row = require('./row.cjs');
8
9
  const text = require('./text.cjs');
9
- const core = require('@magicyan/core');
10
10
 
11
11
  function createComponents(...data) {
12
12
  return data.flat().filter((value) => core.isDefined(value)).filter((value) => typeof value !== "boolean").map((component) => {
13
13
  if (typeof component === "string") {
14
14
  return text.createTextDisplay(component);
15
15
  }
16
- if (Array.isArray(component)) {
17
- return row.createRow(...component);
18
- }
19
16
  if (selectmenu.isAnySelectMenuBuilder(component)) {
20
17
  return row.createRow(component);
21
18
  }
@@ -1,19 +1,16 @@
1
+ import { isDefined } from '@magicyan/core';
1
2
  import { isAttachment } from '../../guards/attachment.mjs';
2
3
  import { isButtonBuilder } from '../../guards/button.mjs';
3
4
  import { isAnySelectMenuBuilder } from '../../guards/selectmenu.mjs';
4
5
  import { createMediaGallery } from './gallery.mjs';
5
6
  import { createRow } from './row.mjs';
6
7
  import { createTextDisplay } from './text.mjs';
7
- import { isDefined } from '@magicyan/core';
8
8
 
9
9
  function createComponents(...data) {
10
10
  return data.flat().filter((value) => isDefined(value)).filter((value) => typeof value !== "boolean").map((component) => {
11
11
  if (typeof component === "string") {
12
12
  return createTextDisplay(component);
13
13
  }
14
- if (Array.isArray(component)) {
15
- return createRow(...component);
16
- }
17
14
  if (isAnySelectMenuBuilder(component)) {
18
15
  return createRow(component);
19
16
  }
@@ -25,11 +25,6 @@ function createContainer(data, ...items) {
25
25
  if (component instanceof discord_js.ActionRowBuilder) {
26
26
  container.addActionRowComponents(component);
27
27
  }
28
- if (Array.isArray(component)) {
29
- container.addActionRowComponents(
30
- row.createRow(...component)
31
- );
32
- }
33
28
  if (selectmenu.isAnySelectMenuBuilder(component) || component instanceof discord_js.ButtonBuilder) {
34
29
  container.addActionRowComponents(
35
30
  row.createRow(component)
@@ -23,11 +23,6 @@ function createContainer(data, ...items) {
23
23
  if (component instanceof ActionRowBuilder) {
24
24
  container.addActionRowComponents(component);
25
25
  }
26
- if (Array.isArray(component)) {
27
- container.addActionRowComponents(
28
- createRow(...component)
29
- );
30
- }
31
26
  if (isAnySelectMenuBuilder(component) || component instanceof ButtonBuilder) {
32
27
  container.addActionRowComponents(
33
28
  createRow(component)
@@ -2,20 +2,17 @@
2
2
 
3
3
  const discord_js = require('discord.js');
4
4
  const attachment = require('../../guards/attachment.cjs');
5
+ const core = require('@magicyan/core');
5
6
 
6
7
  function createMediaGallery(...items) {
7
8
  const gallery = new discord_js.MediaGalleryBuilder();
8
- for (const item of items) {
9
+ for (const item of items.flat().filter(core.isDefined)) {
9
10
  if (typeof item === "string") {
10
- gallery.addItems({
11
- media: { url: item }
12
- });
11
+ gallery.addItems({ media: { url: item } });
13
12
  continue;
14
13
  }
15
14
  if (attachment.isAttachment(item)) {
16
- gallery.addItems({
17
- media: { url: `attachment://${item.name}` }
18
- });
15
+ gallery.addItems({ media: { url: `attachment://${item.name}` } });
19
16
  continue;
20
17
  }
21
18
  gallery.addItems(item);
@@ -1,19 +1,16 @@
1
1
  import { MediaGalleryBuilder } from 'discord.js';
2
2
  import { isAttachment } from '../../guards/attachment.mjs';
3
+ import { isDefined } from '@magicyan/core';
3
4
 
4
5
  function createMediaGallery(...items) {
5
6
  const gallery = new MediaGalleryBuilder();
6
- for (const item of items) {
7
+ for (const item of items.flat().filter(isDefined)) {
7
8
  if (typeof item === "string") {
8
- gallery.addItems({
9
- media: { url: item }
10
- });
9
+ gallery.addItems({ media: { url: item } });
11
10
  continue;
12
11
  }
13
12
  if (isAttachment(item)) {
14
- gallery.addItems({
15
- media: { url: `attachment://${item.name}` }
16
- });
13
+ gallery.addItems({ media: { url: `attachment://${item.name}` } });
17
14
  continue;
18
15
  }
19
16
  gallery.addItems(item);
@@ -40,13 +40,23 @@ function findMessage(channel) {
40
40
  }
41
41
  };
42
42
  }
43
- function getMessageUrlInfo(url) {
44
- const regex = new RegExp(/^https:\/\/discord\.com\/channels\/\d+\/\d+\/\d+$/);
45
- if (!regex.test(url))
43
+ function getMessageURLInfo(url) {
44
+ const match = url.match(/^https:\/\/discord\.com\/channels\/(\d+)\/(\d+)\/(\d+)$/);
45
+ if (!match)
46
46
  return {};
47
- const [messageId, channelId, guildId] = url.split("/").reverse();
48
- return { messageId, channelId, guildId };
47
+ const [_, guildId, channelId, messageId] = match;
48
+ return { guildId, channelId, messageId };
49
+ }
50
+ async function fetchMessageFromURL(gc, url) {
51
+ const { messageId, channelId } = getMessageURLInfo(url);
52
+ if (!messageId)
53
+ return null;
54
+ const channel = await gc.channels.fetch(channelId).catch(() => null);
55
+ if (!channel || !("messages" in channel))
56
+ return null;
57
+ return channel.messages.fetch(messageId).catch(() => null);
49
58
  }
50
59
 
60
+ exports.fetchMessageFromURL = fetchMessageFromURL;
51
61
  exports.findMessage = findMessage;
52
- exports.getMessageUrlInfo = getMessageUrlInfo;
62
+ exports.getMessageURLInfo = getMessageURLInfo;
@@ -38,12 +38,21 @@ function findMessage(channel) {
38
38
  }
39
39
  };
40
40
  }
41
- function getMessageUrlInfo(url) {
42
- const regex = new RegExp(/^https:\/\/discord\.com\/channels\/\d+\/\d+\/\d+$/);
43
- if (!regex.test(url))
41
+ function getMessageURLInfo(url) {
42
+ const match = url.match(/^https:\/\/discord\.com\/channels\/(\d+)\/(\d+)\/(\d+)$/);
43
+ if (!match)
44
44
  return {};
45
- const [messageId, channelId, guildId] = url.split("/").reverse();
46
- return { messageId, channelId, guildId };
45
+ const [_, guildId, channelId, messageId] = match;
46
+ return { guildId, channelId, messageId };
47
+ }
48
+ async function fetchMessageFromURL(gc, url) {
49
+ const { messageId, channelId } = getMessageURLInfo(url);
50
+ if (!messageId)
51
+ return null;
52
+ const channel = await gc.channels.fetch(channelId).catch(() => null);
53
+ if (!channel || !("messages" in channel))
54
+ return null;
55
+ return channel.messages.fetch(messageId).catch(() => null);
47
56
  }
48
57
 
49
- export { findMessage, getMessageUrlInfo };
58
+ export { fetchMessageFromURL, findMessage, getMessageURLInfo };
@@ -17,7 +17,15 @@ function modalFieldsToRecord(fields) {
17
17
  const modalFields = fields instanceof discord_js.ModalSubmitInteraction ? fields.fields.fields : "fields" in fields ? fields.fields : fields;
18
18
  return modalFields.reduce(reduceFunction, {});
19
19
  }
20
+ function createModal(data) {
21
+ return new discord_js.ModalBuilder({
22
+ title: data.title ?? data.customId,
23
+ customId: data.customId,
24
+ components: createModalFields(data.components)
25
+ });
26
+ }
20
27
 
28
+ exports.createModal = createModal;
21
29
  exports.createModalFields = createModalFields;
22
30
  exports.createModalInput = createModalInput;
23
31
  exports.modalFieldsToRecord = modalFieldsToRecord;
@@ -1,4 +1,4 @@
1
- import { TextInputStyle, TextInputBuilder, ModalSubmitInteraction } from 'discord.js';
1
+ import { TextInputStyle, TextInputBuilder, ModalSubmitInteraction, ModalBuilder } from 'discord.js';
2
2
  import { createRow } from './components/row.mjs';
3
3
 
4
4
  function createModalInput(data) {
@@ -15,5 +15,12 @@ function modalFieldsToRecord(fields) {
15
15
  const modalFields = fields instanceof ModalSubmitInteraction ? fields.fields.fields : "fields" in fields ? fields.fields : fields;
16
16
  return modalFields.reduce(reduceFunction, {});
17
17
  }
18
+ function createModal(data) {
19
+ return new ModalBuilder({
20
+ title: data.title ?? data.customId,
21
+ customId: data.customId,
22
+ components: createModalFields(data.components)
23
+ });
24
+ }
18
25
 
19
- export { createModalFields, createModalInput, modalFieldsToRecord };
26
+ export { createModal, createModalFields, createModalInput, modalFieldsToRecord };
package/dist/index.cjs CHANGED
@@ -65,13 +65,15 @@ exports.findChannel = channels.findChannel;
65
65
  exports.getChannelUrlInfo = channels.getChannelUrlInfo;
66
66
  exports.commandMention = commands.commandMention;
67
67
  exports.findCommand = commands.findCommand;
68
+ exports.createModal = modals.createModal;
68
69
  exports.createModalFields = modals.createModalFields;
69
70
  exports.createModalInput = modals.createModalInput;
70
71
  exports.modalFieldsToRecord = modals.modalFieldsToRecord;
71
72
  exports.findEmoji = emojis.findEmoji;
72
73
  exports.findMember = members.findMember;
74
+ exports.fetchMessageFromURL = message.fetchMessageFromURL;
73
75
  exports.findMessage = message.findMessage;
74
- exports.getMessageUrlInfo = message.getMessageUrlInfo;
76
+ exports.getMessageURLInfo = message.getMessageURLInfo;
75
77
  exports.findRole = roles.findRole;
76
78
  exports.extractMentionId = regex.extractMentionId;
77
79
  exports.createWebhookClient = webhooks.createWebhookClient;
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as discord_js from 'discord.js';
2
- import { GatewayIntentBits, Partials, Attachment, AttachmentBuilder, EmbedAssetData, Guild, GuildMember, User, ClientUser, ImageURLOptions, EmbedFooterData, ColorResolvable, APIEmbed, Embed, EmbedData, EmbedBuilder, AttachmentData, ButtonBuilder, ActionRowBuilder, LinkButtonComponentData, AnyComponentBuilder, FileBuilder, APIUnfurledMediaItem, MediaGalleryBuilder, MediaGalleryItemData, SeparatorBuilder, ThumbnailComponentData, ThumbnailBuilder, ButtonComponentData, SectionBuilder, TextDisplayBuilder, MessageActionRowComponentBuilder, ContainerBuilder, ContainerComponentData, ChannelType, CommandInteractionOption, Client, ApplicationCommand, TextInputBuilder, ModalSubmitInteraction, ModalSubmitFields, Collection, TextInputComponent, TextInputStyle, TextInputComponentData, GuildEmoji, GuildTextBasedChannel, Message, Role, WebhookClientOptions, WebhookClient, WebhookClientData, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, ChannelSelectMenuBuilder, MentionableSelectMenuBuilder } from 'discord.js';
2
+ import { GatewayIntentBits, Partials, Attachment, AttachmentBuilder, EmbedAssetData, Guild, GuildMember, User, ClientUser, ImageURLOptions, EmbedFooterData, ColorResolvable, APIEmbed, Embed, EmbedData, EmbedBuilder, AttachmentData, ComponentEmojiResolvable, ButtonBuilder, ActionRowBuilder, LinkButtonComponentData, AnyComponentBuilder, FileBuilder, APIUnfurledMediaItem, MediaGalleryItemData, MediaGalleryBuilder, SeparatorBuilder, ThumbnailComponentData, ThumbnailBuilder, ButtonComponentData, SectionBuilder, TextDisplayBuilder, MessageActionRowComponentBuilder, ContainerBuilder, ContainerComponentData, ChannelType, CommandInteractionOption, Client, ApplicationCommand, TextInputBuilder, ModalSubmitInteraction, ModalSubmitFields, Collection, TextInputComponent, ModalBuilder, TextInputStyle, TextInputComponentData, GuildEmoji, GuildTextBasedChannel, Message, Role, WebhookClientOptions, WebhookClient, WebhookClientData, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, ChannelSelectMenuBuilder, MentionableSelectMenuBuilder } from 'discord.js';
3
3
  export * from '@magicyan/core';
4
4
 
5
5
  declare const chars: {
@@ -207,6 +207,7 @@ declare function createEmbedFiles(embed: EmbedBuilder, options?: CreateEmbedFile
207
207
 
208
208
  interface CreateLinkButtonData extends Omit<LinkButtonComponentData, "style" | "type"> {
209
209
  }
210
+ declare function createLinkButton(link: string, label?: string, emoji?: ComponentEmojiResolvable): ButtonBuilder;
210
211
  declare function createLinkButton(data: CreateLinkButtonData): ButtonBuilder;
211
212
  /**
212
213
  * Wraps buttons into multiple {@link ActionRowBuilder} instances with a maximum number of buttons per row.
@@ -301,7 +302,7 @@ interface CreateFileOptions extends Omit<APIUnfurledMediaItem, "url"> {
301
302
  */
302
303
  declare function createFile(source: FileSource, options?: CreateFileOptions): FileBuilder;
303
304
 
304
- type MediaGallerySource = MediaGalleryItemData | string | Attachment | AttachmentBuilder;
305
+ type MediaGallerySource = MediaGalleryItemData | string | Attachment | AttachmentBuilder | null | undefined;
305
306
  /**
306
307
  * Creates a {@link MediaGalleryBuilder} instance with a collection of media items, which can be images, attachments, or URLs.
307
308
  *
@@ -342,7 +343,7 @@ type MediaGallerySource = MediaGalleryItemData | string | Attachment | Attachmen
342
343
  * );
343
344
  *
344
345
  */
345
- declare function createMediaGallery(...items: MediaGallerySource[]): MediaGalleryBuilder;
346
+ declare function createMediaGallery(...items: (MediaGallerySource | MediaGallerySource[])[]): MediaGalleryBuilder;
346
347
 
347
348
  interface SeparatorData {
348
349
  divider?: boolean;
@@ -546,7 +547,7 @@ type ThumbAreaData = {
546
547
  declare function createThumbArea(content: string, thumbnail?: ThumbAreaThumbnail): SectionBuilder | TextDisplayBuilder;
547
548
  declare function createThumbArea(data: ThumbAreaData): SectionBuilder | TextDisplayBuilder;
548
549
 
549
- type ComponentData = TextDisplayBuilder | SeparatorBuilder | FileBuilder | SectionBuilder | MediaGalleryBuilder | ActionRowBuilder<MessageActionRowComponentBuilder> | MessageActionRowComponentBuilder[] | MessageActionRowComponentBuilder | Attachment | AttachmentBuilder | string | null | undefined | boolean;
550
+ type ComponentData = TextDisplayBuilder | SeparatorBuilder | FileBuilder | SectionBuilder | MediaGalleryBuilder | ActionRowBuilder<MessageActionRowComponentBuilder> | MessageActionRowComponentBuilder | Attachment | AttachmentBuilder | string | null | undefined | boolean;
550
551
  type CreateComponentData = ComponentData | ContainerBuilder;
551
552
  declare function createComponents(...data: (CreateComponentData | CreateComponentData[])[]): (SeparatorBuilder | TextDisplayBuilder | FileBuilder | SectionBuilder | MediaGalleryBuilder | ActionRowBuilder<MessageActionRowComponentBuilder> | ContainerBuilder)[];
552
553
 
@@ -654,6 +655,12 @@ type ModalFieldsData = Record<string, Omit<ModalFieldData, "customId">>;
654
655
  declare function createModalFields(data: ModalFieldsData): ActionRowBuilder<TextInputBuilder>[];
655
656
  type ModalFieldsRecord<K extends string> = Record<K, string>;
656
657
  declare function modalFieldsToRecord<K extends string = string>(fields: ModalSubmitInteraction | ModalSubmitFields | Collection<string, TextInputComponent>): ModalFieldsRecord<K>;
658
+ interface CreateModalData {
659
+ title?: string;
660
+ customId: string;
661
+ components: ModalFieldsData;
662
+ }
663
+ declare function createModal(data: CreateModalData): ModalBuilder;
657
664
 
658
665
  type FindEmojiFilter = (emoji: GuildEmoji) => boolean;
659
666
  declare function findEmoji(guildOrClient: Guild | Client): {
@@ -682,12 +689,18 @@ declare function findMessage(channel: GuildTextBasedChannel): {
682
689
  };
683
690
  byFilter(filter: FindMessageFilter): Message<true> | undefined;
684
691
  };
685
- interface MessageUrlInfo {
686
- messageId?: string;
692
+ type MessageURLInfo = {
693
+ channelId: string;
694
+ guildId: string;
695
+ messageId: string;
696
+ } | {
697
+ messageId?: undefined;
687
698
  channelId?: string;
688
699
  guildId?: string;
689
- }
690
- declare function getMessageUrlInfo(url: string): MessageUrlInfo;
700
+ };
701
+ declare function getMessageURLInfo(url: string): MessageURLInfo;
702
+ declare function fetchMessageFromURL(guild: Guild, url: string): Promise<Message<true> | null>;
703
+ declare function fetchMessageFromURL(client: Client | Client, url: string): Promise<Message | null>;
691
704
 
692
705
  type FindRoleFilter = (role: Role) => boolean;
693
706
  /**
@@ -735,5 +748,5 @@ declare function isAnySelectMenuBuilder(value: unknown): value is AnySelectMenuB
735
748
 
736
749
  declare function isButtonBuilder(value: unknown): value is ButtonBuilder;
737
750
 
738
- export { CustomItents, CustomPartials, EmbedLimit, EmbedPlusBuilder, Separator, chars, commandMention, createComponents, createContainer, createEmbed, createEmbedAsset, createEmbedAuthor, createEmbedFiles, createEmbedFooter, createFile, createLinkButton, createMediaGallery, createModalFields, createModalInput, createRow, createSection, createSeparator, createTextDisplay, createThumbArea, createThumbnail, createWebhookClient, extractMentionId, findChannel, findCommand, findEmoji, findMember, findMessage, findRole, getChannelUrlInfo, getMessageUrlInfo, isAnySelectMenuBuilder, isAttachment, isButtonBuilder, modalFieldsToRecord, setMobileStatus, wrapButtons };
739
- export type { AnyEmbedData, AnySelectMenuBuilder, ComponentData, ContainerColor, ContainerData, EmbedPlusAssetData, EmbedPlusAuthorData, EmbedPlusColorData, EmbedPlusData, EmbedPlusFooterData, EmbedPlusProperty, SectionAccessory, SectionAccessoryData, SectionButtonAccessory, SectionData, SectionThumbnailAccessory, SeparatorData, ThumbAreaData, ThumbAreaThumbnail, ThumbnailData };
751
+ export { CustomItents, CustomPartials, EmbedLimit, EmbedPlusBuilder, Separator, chars, commandMention, createComponents, createContainer, createEmbed, createEmbedAsset, createEmbedAuthor, createEmbedFiles, createEmbedFooter, createFile, createLinkButton, createMediaGallery, createModal, createModalFields, createModalInput, createRow, createSection, createSeparator, createTextDisplay, createThumbArea, createThumbnail, createWebhookClient, extractMentionId, fetchMessageFromURL, findChannel, findCommand, findEmoji, findMember, findMessage, findRole, getChannelUrlInfo, getMessageURLInfo, isAnySelectMenuBuilder, isAttachment, isButtonBuilder, modalFieldsToRecord, setMobileStatus, wrapButtons };
752
+ export type { AnyEmbedData, AnySelectMenuBuilder, ComponentData, ContainerColor, ContainerData, CreateComponentData, CreateModalData, EmbedPlusAssetData, EmbedPlusAuthorData, EmbedPlusColorData, EmbedPlusData, EmbedPlusFooterData, EmbedPlusProperty, MediaGallerySource, ModalFieldsData, ModalFieldsRecord, 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, Attachment, AttachmentBuilder, EmbedAssetData, Guild, GuildMember, User, ClientUser, ImageURLOptions, EmbedFooterData, ColorResolvable, APIEmbed, Embed, EmbedData, EmbedBuilder, AttachmentData, ButtonBuilder, ActionRowBuilder, LinkButtonComponentData, AnyComponentBuilder, FileBuilder, APIUnfurledMediaItem, MediaGalleryBuilder, MediaGalleryItemData, SeparatorBuilder, ThumbnailComponentData, ThumbnailBuilder, ButtonComponentData, SectionBuilder, TextDisplayBuilder, MessageActionRowComponentBuilder, ContainerBuilder, ContainerComponentData, ChannelType, CommandInteractionOption, Client, ApplicationCommand, TextInputBuilder, ModalSubmitInteraction, ModalSubmitFields, Collection, TextInputComponent, TextInputStyle, TextInputComponentData, GuildEmoji, GuildTextBasedChannel, Message, Role, WebhookClientOptions, WebhookClient, WebhookClientData, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, ChannelSelectMenuBuilder, MentionableSelectMenuBuilder } from 'discord.js';
2
+ import { GatewayIntentBits, Partials, Attachment, AttachmentBuilder, EmbedAssetData, Guild, GuildMember, User, ClientUser, ImageURLOptions, EmbedFooterData, ColorResolvable, APIEmbed, Embed, EmbedData, EmbedBuilder, AttachmentData, ComponentEmojiResolvable, ButtonBuilder, ActionRowBuilder, LinkButtonComponentData, AnyComponentBuilder, FileBuilder, APIUnfurledMediaItem, MediaGalleryItemData, MediaGalleryBuilder, SeparatorBuilder, ThumbnailComponentData, ThumbnailBuilder, ButtonComponentData, SectionBuilder, TextDisplayBuilder, MessageActionRowComponentBuilder, ContainerBuilder, ContainerComponentData, ChannelType, CommandInteractionOption, Client, ApplicationCommand, TextInputBuilder, ModalSubmitInteraction, ModalSubmitFields, Collection, TextInputComponent, ModalBuilder, TextInputStyle, TextInputComponentData, GuildEmoji, GuildTextBasedChannel, Message, Role, WebhookClientOptions, WebhookClient, WebhookClientData, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, ChannelSelectMenuBuilder, MentionableSelectMenuBuilder } from 'discord.js';
3
3
  export * from '@magicyan/core';
4
4
 
5
5
  declare const chars: {
@@ -207,6 +207,7 @@ declare function createEmbedFiles(embed: EmbedBuilder, options?: CreateEmbedFile
207
207
 
208
208
  interface CreateLinkButtonData extends Omit<LinkButtonComponentData, "style" | "type"> {
209
209
  }
210
+ declare function createLinkButton(link: string, label?: string, emoji?: ComponentEmojiResolvable): ButtonBuilder;
210
211
  declare function createLinkButton(data: CreateLinkButtonData): ButtonBuilder;
211
212
  /**
212
213
  * Wraps buttons into multiple {@link ActionRowBuilder} instances with a maximum number of buttons per row.
@@ -301,7 +302,7 @@ interface CreateFileOptions extends Omit<APIUnfurledMediaItem, "url"> {
301
302
  */
302
303
  declare function createFile(source: FileSource, options?: CreateFileOptions): FileBuilder;
303
304
 
304
- type MediaGallerySource = MediaGalleryItemData | string | Attachment | AttachmentBuilder;
305
+ type MediaGallerySource = MediaGalleryItemData | string | Attachment | AttachmentBuilder | null | undefined;
305
306
  /**
306
307
  * Creates a {@link MediaGalleryBuilder} instance with a collection of media items, which can be images, attachments, or URLs.
307
308
  *
@@ -342,7 +343,7 @@ type MediaGallerySource = MediaGalleryItemData | string | Attachment | Attachmen
342
343
  * );
343
344
  *
344
345
  */
345
- declare function createMediaGallery(...items: MediaGallerySource[]): MediaGalleryBuilder;
346
+ declare function createMediaGallery(...items: (MediaGallerySource | MediaGallerySource[])[]): MediaGalleryBuilder;
346
347
 
347
348
  interface SeparatorData {
348
349
  divider?: boolean;
@@ -546,7 +547,7 @@ type ThumbAreaData = {
546
547
  declare function createThumbArea(content: string, thumbnail?: ThumbAreaThumbnail): SectionBuilder | TextDisplayBuilder;
547
548
  declare function createThumbArea(data: ThumbAreaData): SectionBuilder | TextDisplayBuilder;
548
549
 
549
- type ComponentData = TextDisplayBuilder | SeparatorBuilder | FileBuilder | SectionBuilder | MediaGalleryBuilder | ActionRowBuilder<MessageActionRowComponentBuilder> | MessageActionRowComponentBuilder[] | MessageActionRowComponentBuilder | Attachment | AttachmentBuilder | string | null | undefined | boolean;
550
+ type ComponentData = TextDisplayBuilder | SeparatorBuilder | FileBuilder | SectionBuilder | MediaGalleryBuilder | ActionRowBuilder<MessageActionRowComponentBuilder> | MessageActionRowComponentBuilder | Attachment | AttachmentBuilder | string | null | undefined | boolean;
550
551
  type CreateComponentData = ComponentData | ContainerBuilder;
551
552
  declare function createComponents(...data: (CreateComponentData | CreateComponentData[])[]): (SeparatorBuilder | TextDisplayBuilder | FileBuilder | SectionBuilder | MediaGalleryBuilder | ActionRowBuilder<MessageActionRowComponentBuilder> | ContainerBuilder)[];
552
553
 
@@ -654,6 +655,12 @@ type ModalFieldsData = Record<string, Omit<ModalFieldData, "customId">>;
654
655
  declare function createModalFields(data: ModalFieldsData): ActionRowBuilder<TextInputBuilder>[];
655
656
  type ModalFieldsRecord<K extends string> = Record<K, string>;
656
657
  declare function modalFieldsToRecord<K extends string = string>(fields: ModalSubmitInteraction | ModalSubmitFields | Collection<string, TextInputComponent>): ModalFieldsRecord<K>;
658
+ interface CreateModalData {
659
+ title?: string;
660
+ customId: string;
661
+ components: ModalFieldsData;
662
+ }
663
+ declare function createModal(data: CreateModalData): ModalBuilder;
657
664
 
658
665
  type FindEmojiFilter = (emoji: GuildEmoji) => boolean;
659
666
  declare function findEmoji(guildOrClient: Guild | Client): {
@@ -682,12 +689,18 @@ declare function findMessage(channel: GuildTextBasedChannel): {
682
689
  };
683
690
  byFilter(filter: FindMessageFilter): Message<true> | undefined;
684
691
  };
685
- interface MessageUrlInfo {
686
- messageId?: string;
692
+ type MessageURLInfo = {
693
+ channelId: string;
694
+ guildId: string;
695
+ messageId: string;
696
+ } | {
697
+ messageId?: undefined;
687
698
  channelId?: string;
688
699
  guildId?: string;
689
- }
690
- declare function getMessageUrlInfo(url: string): MessageUrlInfo;
700
+ };
701
+ declare function getMessageURLInfo(url: string): MessageURLInfo;
702
+ declare function fetchMessageFromURL(guild: Guild, url: string): Promise<Message<true> | null>;
703
+ declare function fetchMessageFromURL(client: Client | Client, url: string): Promise<Message | null>;
691
704
 
692
705
  type FindRoleFilter = (role: Role) => boolean;
693
706
  /**
@@ -735,5 +748,5 @@ declare function isAnySelectMenuBuilder(value: unknown): value is AnySelectMenuB
735
748
 
736
749
  declare function isButtonBuilder(value: unknown): value is ButtonBuilder;
737
750
 
738
- export { CustomItents, CustomPartials, EmbedLimit, EmbedPlusBuilder, Separator, chars, commandMention, createComponents, createContainer, createEmbed, createEmbedAsset, createEmbedAuthor, createEmbedFiles, createEmbedFooter, createFile, createLinkButton, createMediaGallery, createModalFields, createModalInput, createRow, createSection, createSeparator, createTextDisplay, createThumbArea, createThumbnail, createWebhookClient, extractMentionId, findChannel, findCommand, findEmoji, findMember, findMessage, findRole, getChannelUrlInfo, getMessageUrlInfo, isAnySelectMenuBuilder, isAttachment, isButtonBuilder, modalFieldsToRecord, setMobileStatus, wrapButtons };
739
- export type { AnyEmbedData, AnySelectMenuBuilder, ComponentData, ContainerColor, ContainerData, EmbedPlusAssetData, EmbedPlusAuthorData, EmbedPlusColorData, EmbedPlusData, EmbedPlusFooterData, EmbedPlusProperty, SectionAccessory, SectionAccessoryData, SectionButtonAccessory, SectionData, SectionThumbnailAccessory, SeparatorData, ThumbAreaData, ThumbAreaThumbnail, ThumbnailData };
751
+ export { CustomItents, CustomPartials, EmbedLimit, EmbedPlusBuilder, Separator, chars, commandMention, createComponents, createContainer, createEmbed, createEmbedAsset, createEmbedAuthor, createEmbedFiles, createEmbedFooter, createFile, createLinkButton, createMediaGallery, createModal, createModalFields, createModalInput, createRow, createSection, createSeparator, createTextDisplay, createThumbArea, createThumbnail, createWebhookClient, extractMentionId, fetchMessageFromURL, findChannel, findCommand, findEmoji, findMember, findMessage, findRole, getChannelUrlInfo, getMessageURLInfo, isAnySelectMenuBuilder, isAttachment, isButtonBuilder, modalFieldsToRecord, setMobileStatus, wrapButtons };
752
+ export type { AnyEmbedData, AnySelectMenuBuilder, ComponentData, ContainerColor, ContainerData, CreateComponentData, CreateModalData, EmbedPlusAssetData, EmbedPlusAuthorData, EmbedPlusColorData, EmbedPlusData, EmbedPlusFooterData, EmbedPlusProperty, MediaGallerySource, ModalFieldsData, ModalFieldsRecord, 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, Attachment, AttachmentBuilder, EmbedAssetData, Guild, GuildMember, User, ClientUser, ImageURLOptions, EmbedFooterData, ColorResolvable, APIEmbed, Embed, EmbedData, EmbedBuilder, AttachmentData, ButtonBuilder, ActionRowBuilder, LinkButtonComponentData, AnyComponentBuilder, FileBuilder, APIUnfurledMediaItem, MediaGalleryBuilder, MediaGalleryItemData, SeparatorBuilder, ThumbnailComponentData, ThumbnailBuilder, ButtonComponentData, SectionBuilder, TextDisplayBuilder, MessageActionRowComponentBuilder, ContainerBuilder, ContainerComponentData, ChannelType, CommandInteractionOption, Client, ApplicationCommand, TextInputBuilder, ModalSubmitInteraction, ModalSubmitFields, Collection, TextInputComponent, TextInputStyle, TextInputComponentData, GuildEmoji, GuildTextBasedChannel, Message, Role, WebhookClientOptions, WebhookClient, WebhookClientData, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, ChannelSelectMenuBuilder, MentionableSelectMenuBuilder } from 'discord.js';
2
+ import { GatewayIntentBits, Partials, Attachment, AttachmentBuilder, EmbedAssetData, Guild, GuildMember, User, ClientUser, ImageURLOptions, EmbedFooterData, ColorResolvable, APIEmbed, Embed, EmbedData, EmbedBuilder, AttachmentData, ComponentEmojiResolvable, ButtonBuilder, ActionRowBuilder, LinkButtonComponentData, AnyComponentBuilder, FileBuilder, APIUnfurledMediaItem, MediaGalleryItemData, MediaGalleryBuilder, SeparatorBuilder, ThumbnailComponentData, ThumbnailBuilder, ButtonComponentData, SectionBuilder, TextDisplayBuilder, MessageActionRowComponentBuilder, ContainerBuilder, ContainerComponentData, ChannelType, CommandInteractionOption, Client, ApplicationCommand, TextInputBuilder, ModalSubmitInteraction, ModalSubmitFields, Collection, TextInputComponent, ModalBuilder, TextInputStyle, TextInputComponentData, GuildEmoji, GuildTextBasedChannel, Message, Role, WebhookClientOptions, WebhookClient, WebhookClientData, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, ChannelSelectMenuBuilder, MentionableSelectMenuBuilder } from 'discord.js';
3
3
  export * from '@magicyan/core';
4
4
 
5
5
  declare const chars: {
@@ -207,6 +207,7 @@ declare function createEmbedFiles(embed: EmbedBuilder, options?: CreateEmbedFile
207
207
 
208
208
  interface CreateLinkButtonData extends Omit<LinkButtonComponentData, "style" | "type"> {
209
209
  }
210
+ declare function createLinkButton(link: string, label?: string, emoji?: ComponentEmojiResolvable): ButtonBuilder;
210
211
  declare function createLinkButton(data: CreateLinkButtonData): ButtonBuilder;
211
212
  /**
212
213
  * Wraps buttons into multiple {@link ActionRowBuilder} instances with a maximum number of buttons per row.
@@ -301,7 +302,7 @@ interface CreateFileOptions extends Omit<APIUnfurledMediaItem, "url"> {
301
302
  */
302
303
  declare function createFile(source: FileSource, options?: CreateFileOptions): FileBuilder;
303
304
 
304
- type MediaGallerySource = MediaGalleryItemData | string | Attachment | AttachmentBuilder;
305
+ type MediaGallerySource = MediaGalleryItemData | string | Attachment | AttachmentBuilder | null | undefined;
305
306
  /**
306
307
  * Creates a {@link MediaGalleryBuilder} instance with a collection of media items, which can be images, attachments, or URLs.
307
308
  *
@@ -342,7 +343,7 @@ type MediaGallerySource = MediaGalleryItemData | string | Attachment | Attachmen
342
343
  * );
343
344
  *
344
345
  */
345
- declare function createMediaGallery(...items: MediaGallerySource[]): MediaGalleryBuilder;
346
+ declare function createMediaGallery(...items: (MediaGallerySource | MediaGallerySource[])[]): MediaGalleryBuilder;
346
347
 
347
348
  interface SeparatorData {
348
349
  divider?: boolean;
@@ -546,7 +547,7 @@ type ThumbAreaData = {
546
547
  declare function createThumbArea(content: string, thumbnail?: ThumbAreaThumbnail): SectionBuilder | TextDisplayBuilder;
547
548
  declare function createThumbArea(data: ThumbAreaData): SectionBuilder | TextDisplayBuilder;
548
549
 
549
- type ComponentData = TextDisplayBuilder | SeparatorBuilder | FileBuilder | SectionBuilder | MediaGalleryBuilder | ActionRowBuilder<MessageActionRowComponentBuilder> | MessageActionRowComponentBuilder[] | MessageActionRowComponentBuilder | Attachment | AttachmentBuilder | string | null | undefined | boolean;
550
+ type ComponentData = TextDisplayBuilder | SeparatorBuilder | FileBuilder | SectionBuilder | MediaGalleryBuilder | ActionRowBuilder<MessageActionRowComponentBuilder> | MessageActionRowComponentBuilder | Attachment | AttachmentBuilder | string | null | undefined | boolean;
550
551
  type CreateComponentData = ComponentData | ContainerBuilder;
551
552
  declare function createComponents(...data: (CreateComponentData | CreateComponentData[])[]): (SeparatorBuilder | TextDisplayBuilder | FileBuilder | SectionBuilder | MediaGalleryBuilder | ActionRowBuilder<MessageActionRowComponentBuilder> | ContainerBuilder)[];
552
553
 
@@ -654,6 +655,12 @@ type ModalFieldsData = Record<string, Omit<ModalFieldData, "customId">>;
654
655
  declare function createModalFields(data: ModalFieldsData): ActionRowBuilder<TextInputBuilder>[];
655
656
  type ModalFieldsRecord<K extends string> = Record<K, string>;
656
657
  declare function modalFieldsToRecord<K extends string = string>(fields: ModalSubmitInteraction | ModalSubmitFields | Collection<string, TextInputComponent>): ModalFieldsRecord<K>;
658
+ interface CreateModalData {
659
+ title?: string;
660
+ customId: string;
661
+ components: ModalFieldsData;
662
+ }
663
+ declare function createModal(data: CreateModalData): ModalBuilder;
657
664
 
658
665
  type FindEmojiFilter = (emoji: GuildEmoji) => boolean;
659
666
  declare function findEmoji(guildOrClient: Guild | Client): {
@@ -682,12 +689,18 @@ declare function findMessage(channel: GuildTextBasedChannel): {
682
689
  };
683
690
  byFilter(filter: FindMessageFilter): Message<true> | undefined;
684
691
  };
685
- interface MessageUrlInfo {
686
- messageId?: string;
692
+ type MessageURLInfo = {
693
+ channelId: string;
694
+ guildId: string;
695
+ messageId: string;
696
+ } | {
697
+ messageId?: undefined;
687
698
  channelId?: string;
688
699
  guildId?: string;
689
- }
690
- declare function getMessageUrlInfo(url: string): MessageUrlInfo;
700
+ };
701
+ declare function getMessageURLInfo(url: string): MessageURLInfo;
702
+ declare function fetchMessageFromURL(guild: Guild, url: string): Promise<Message<true> | null>;
703
+ declare function fetchMessageFromURL(client: Client | Client, url: string): Promise<Message | null>;
691
704
 
692
705
  type FindRoleFilter = (role: Role) => boolean;
693
706
  /**
@@ -735,5 +748,5 @@ declare function isAnySelectMenuBuilder(value: unknown): value is AnySelectMenuB
735
748
 
736
749
  declare function isButtonBuilder(value: unknown): value is ButtonBuilder;
737
750
 
738
- export { CustomItents, CustomPartials, EmbedLimit, EmbedPlusBuilder, Separator, chars, commandMention, createComponents, createContainer, createEmbed, createEmbedAsset, createEmbedAuthor, createEmbedFiles, createEmbedFooter, createFile, createLinkButton, createMediaGallery, createModalFields, createModalInput, createRow, createSection, createSeparator, createTextDisplay, createThumbArea, createThumbnail, createWebhookClient, extractMentionId, findChannel, findCommand, findEmoji, findMember, findMessage, findRole, getChannelUrlInfo, getMessageUrlInfo, isAnySelectMenuBuilder, isAttachment, isButtonBuilder, modalFieldsToRecord, setMobileStatus, wrapButtons };
739
- export type { AnyEmbedData, AnySelectMenuBuilder, ComponentData, ContainerColor, ContainerData, EmbedPlusAssetData, EmbedPlusAuthorData, EmbedPlusColorData, EmbedPlusData, EmbedPlusFooterData, EmbedPlusProperty, SectionAccessory, SectionAccessoryData, SectionButtonAccessory, SectionData, SectionThumbnailAccessory, SeparatorData, ThumbAreaData, ThumbAreaThumbnail, ThumbnailData };
751
+ export { CustomItents, CustomPartials, EmbedLimit, EmbedPlusBuilder, Separator, chars, commandMention, createComponents, createContainer, createEmbed, createEmbedAsset, createEmbedAuthor, createEmbedFiles, createEmbedFooter, createFile, createLinkButton, createMediaGallery, createModal, createModalFields, createModalInput, createRow, createSection, createSeparator, createTextDisplay, createThumbArea, createThumbnail, createWebhookClient, extractMentionId, fetchMessageFromURL, findChannel, findCommand, findEmoji, findMember, findMessage, findRole, getChannelUrlInfo, getMessageURLInfo, isAnySelectMenuBuilder, isAttachment, isButtonBuilder, modalFieldsToRecord, setMobileStatus, wrapButtons };
752
+ export type { AnyEmbedData, AnySelectMenuBuilder, ComponentData, ContainerColor, ContainerData, CreateComponentData, CreateModalData, EmbedPlusAssetData, EmbedPlusAuthorData, EmbedPlusColorData, EmbedPlusData, EmbedPlusFooterData, EmbedPlusProperty, MediaGallerySource, ModalFieldsData, ModalFieldsRecord, SectionAccessory, SectionAccessoryData, SectionButtonAccessory, SectionData, SectionThumbnailAccessory, SeparatorData, ThumbAreaData, ThumbAreaThumbnail, ThumbnailData };
package/dist/index.mjs CHANGED
@@ -21,10 +21,10 @@ export { createComponents } from './functions/components/components.mjs';
21
21
  export { createContainer } from './functions/components/container.mjs';
22
22
  export { findChannel, getChannelUrlInfo } from './functions/channels.mjs';
23
23
  export { commandMention, findCommand } from './functions/commands.mjs';
24
- export { createModalFields, createModalInput, modalFieldsToRecord } from './functions/modals.mjs';
24
+ export { createModal, createModalFields, createModalInput, modalFieldsToRecord } from './functions/modals.mjs';
25
25
  export { findEmoji } from './functions/emojis.mjs';
26
26
  export { findMember } from './functions/members.mjs';
27
- export { findMessage, getMessageUrlInfo } from './functions/message.mjs';
27
+ export { fetchMessageFromURL, findMessage, getMessageURLInfo } from './functions/message.mjs';
28
28
  export { findRole } from './functions/roles.mjs';
29
29
  export { extractMentionId } from './functions/regex.mjs';
30
30
  export { createWebhookClient } from './functions/webhooks.mjs';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magicyan/discord",
3
- "version": "1.4.10",
3
+ "version": "1.4.11",
4
4
  "description": "Simple functions to facilitate discord bot development",
5
5
  "license": "MIT",
6
6
  "type": "module",