UNPKG

oceanic.js

Version:

A NodeJS library for interfacing with Discord.

549 lines 53.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); /** @module Message */ const Base_1 = tslib_1.__importDefault(require("./Base")); const Attachment_1 = tslib_1.__importDefault(require("./Attachment")); const User_1 = tslib_1.__importDefault(require("./User")); const PartialApplication_1 = tslib_1.__importDefault(require("./PartialApplication")); const GuildChannel_1 = tslib_1.__importDefault(require("./GuildChannel")); const Poll_1 = tslib_1.__importDefault(require("./Poll")); const TypedCollection_1 = tslib_1.__importDefault(require("../util/TypedCollection")); const Constants_1 = require("../Constants"); const Routes = tslib_1.__importStar(require("../util/Routes")); const Errors_1 = require("../util/Errors"); /** Represents a message. */ class Message extends Base_1.default { _cachedChannel; _cachedGuild; /** The [activity](https://discord.com/developers/docs/resources/channel#message-object-message-activity-structure) associated with this message. */ activity; /** * The application associated with this message. This can be present in two scenarios: * * If the message was from an interaction or application owned webhook ({@link ClientApplication} if any shard has reached READY, {@link PartialApplication} otherwise). * * If the message has a rich presence embed ({@link PartialApplication}) */ application; /** * The ID of the application associated with this message. This can be present in two scenarios: * * If the message was from an interaction or application owned webhook ({@link ClientApplication} if any shard has reached READY, {@link PartialApplication} otherwise). * * If the message has a rich presence embed ({@link PartialApplication}) */ applicationID; /** The attachments on this message. */ attachments; /** The author of this message. */ author; /** The call associated with this message. */ call; /** The ID of the channel this message was created in. */ channelID; /** The components on this message. */ components; /** The content of this message. */ content; /** The timestamp at which this message was last edited. */ editedTimestamp; /** The embeds on this message. */ embeds; /** The [flags](https://discord.com/developers/docs/resources/channel#message-object-message-flags) on this message. */ flags; /** The ID of the guild this message is in. */ guildID; /** * The interaction info, if this message was the result of an interaction. * @deprecated Use {@link Message#interactionMetadata | Message#interactionMetadata } instead. */ interaction; /** The interaction info, if this message was the result of an interaction. */ interactionMetadata; /** The member that created this message, if this message is in a guild. */ member; /** Channels mentioned in a `CROSSPOSTED` channel follower message. See [Discord's docs](https://discord.com/developers/docs/resources/channel#channel-mention-object) for more information. */ mentionChannels; /** The mentions in this message. */ mentions; /** If this message is a `REPLY` or `THREAD_STARTER_MESSAGE`, some info about the referenced message. */ messageReference; /** If this message is a forwarded message, the partial contents of that message. */ messageSnapshots; /** A nonce for ensuring a message was sent. */ nonce; /** If this message is pinned. */ pinned; /** The poll on this message, if any. */ poll; /** The poll results extracted from the embeds of this message. This will only be present for {@link Constants~MessageTypes.POLL_RESULT | POLL_RESULT } messages. */ pollResults; /** This message's relative position, if in a thread. */ position; /** The reactions on this message. */ reactions; /** If this message is a `REPLY` or `THREAD_STARTER_MESSAGE`, this will be the message that's referenced. */ referencedMessage; /** The data of the role subscription purchase or renewal that prompted this message. */ roleSubscriptionData; // stickers exists, but is deprecated /** The sticker items on this message. */ stickerItems; /** The thread associated with this message, if any. */ thread; /** The timestamp at which this message was sent. */ timestamp; /** If this message was read aloud. */ tts; /** The [type](https://discord.com/developers/docs/resources/channel#message-object-message-types) of this message. */ type; /** The webhook associated with this message, if sent via a webhook. This only has an `id` property. */ webhookID; constructor(data, client) { super(data.id, client); this.attachments = new TypedCollection_1.default(Attachment_1.default, client); this.channelID = data.channel_id; this.components = []; this.content = data.content ?? ""; this.editedTimestamp = null; this.embeds = []; this.flags = 0; this.guildID = (data.guild_id === undefined ? null : data.guild_id); this.member = (data.member === undefined ? undefined : this.client.util.updateMember(data.guild_id, data.author.id, { ...data.member, user: data.author })); this.mentions = { channels: [], everyone: false, members: [], roles: [], users: [] }; this.pinned = !!data.pinned; this.poll = data.poll ? new Poll_1.default(data.poll, client, this) : undefined; this.reactions = []; // message updates can be missing a timestamp this.timestamp = data.timestamp === undefined ? Base_1.default.getCreatedAt(this.id) : new Date(data.timestamp); this.tts = !!data.tts; this.type = data.type; this.webhookID = data.webhook_id; this.update(data); // don't add webhook users to the cache this.author = data.webhook_id === undefined ? client.users.update(data.author) : new User_1.default(data.author, client); if (data.application_id === undefined) { this.applicationID = null; } else { if (client["_application"] && client.application.id === data.application_id) { if (data.application) { client.application["update"](data.application); } this.application = client.application; } else { this.application = data.application ? new PartialApplication_1.default(data.application, client) : undefined; } this.applicationID = data.application_id; } } update(data) { if (data.mention_everyone !== undefined) { this.mentions.everyone = data.mention_everyone; } if (data.mention_roles !== undefined) { this.mentions.roles = data.mention_roles; } if (data.mentions !== undefined) { const members = []; this.mentions.users = data.mentions.map(user => { if (this.channel && "guildID" in this.channel && user.member) { members.push(this.client.util.updateMember(this.channel.guildID, user.id, { ...user.member, user })); } return this.client.users.update(user); }); this.mentions.members = members; } if (data.activity !== undefined) { this.activity = data.activity; } if (data.attachments !== undefined) { if (this.attachments.size !== 0) { for (const id of this.attachments.keys()) { if (!data.attachments.some(attachment => attachment.id === id)) { this.attachments.delete(id); } } } for (const attachment of data.attachments) { this.attachments.update(attachment); } } if (data.call !== undefined) { this.call = { endedTimestamp: data.call.ended_timestamp ? new Date(data.call.ended_timestamp) : null, participants: data.call.participants }; } if (data.components !== undefined) { this.components = this.client.util.componentsToParsed(data.components); } if (data.content !== undefined) { this.content = data.content; this.mentions.channels = (data.content.match(/<#\d{17,21}>/g) ?? []).map(mention => mention.slice(2, -1)); } if (data.edited_timestamp !== undefined) { this.editedTimestamp = data.edited_timestamp ? new Date(data.edited_timestamp) : null; } if (data.embeds !== undefined) { this.embeds = this.client.util.embedsToParsed(data.embeds); const pollResultEmbed = this.embeds.find(embed => embed.type === "poll_result"); if (pollResultEmbed) { const questionText = pollResultEmbed.fields.find(field => field.name === "poll_question_text").value; const totalVotes = pollResultEmbed.fields.find(field => field.name === "total_votes").value; const victorAnswerID = pollResultEmbed.fields.find(field => field.name === "victor_answer_id")?.value; const victorAnswerText = pollResultEmbed.fields.find(field => field.name === "victor_answer_text")?.value; const victorAnswerVotes = pollResultEmbed.fields.find(field => field.name === "victor_answer_votes").value; this.pollResults = { questionText, totalVotes: Number(totalVotes), victorAnswerID: victorAnswerID === undefined ? undefined : Number(victorAnswerID), victorAnswerText: victorAnswerText === undefined ? undefined : victorAnswerText, victorAnswerVotes: Number(victorAnswerVotes) }; } } if (data.flags !== undefined) { this.flags = data.flags; } if (data.interaction !== undefined) { let member; if (data.interaction.member) { member = { ...data.interaction.member, user: data.interaction.user }; } this.interaction = { id: data.interaction.id, member: member ? this.client.util.updateMember(data.guild_id, member.user.id, member) : undefined, name: data.interaction.name, type: data.interaction.type, user: this.client.users.update(data.interaction.user) }; } if (data.interaction_metadata !== undefined) { this.interactionMetadata = { authorizingIntegrationOwners: data.interaction_metadata.authorizing_integration_owners, id: data.interaction_metadata.id, interactedMessageID: data.interaction_metadata.interacted_message_id, name: data.interaction_metadata.name, originalResponseMessageID: data.interaction_metadata.original_response_message_id, targetMessageID: data.interaction_metadata.target_message_id, targetUser: data.interaction_metadata.target_user ? this.client.users.update(data.interaction_metadata.target_user) : undefined, type: data.interaction_metadata.type, user: this.client.users.update(data.interaction_metadata.user), triggeringInteractionMetadata: data.interaction_metadata.triggering_interaction_metadata === undefined ? undefined : { authorizingIntegrationOwners: data.interaction_metadata.triggering_interaction_metadata.authorizing_integration_owners, id: data.interaction_metadata.triggering_interaction_metadata.id, interactedMessageID: data.interaction_metadata.triggering_interaction_metadata.interacted_message_id, originalResponseMessageID: data.interaction_metadata.triggering_interaction_metadata.original_response_message_id, targetMessageID: data.interaction_metadata.triggering_interaction_metadata.target_message_id, targetUser: data.interaction_metadata.triggering_interaction_metadata.target_user ? this.client.users.update(data.interaction_metadata.triggering_interaction_metadata.target_user) : undefined, type: data.interaction_metadata.triggering_interaction_metadata.type, user: this.client.users.update(data.interaction_metadata.triggering_interaction_metadata.user) } }; } if (data.message_reference) { this.messageReference = { channelID: data.message_reference.channel_id, failIfNotExists: data.message_reference.fail_if_not_exists, guildID: data.message_reference.guild_id, messageID: data.message_reference.message_id }; } if (data.message_snapshots) { this.messageSnapshots = data.message_snapshots.map(s => ({ message: { attachments: s.message.attachments.map(a => new Attachment_1.default(a, this.client)), content: s.message.content, editedTimestamp: s.message.edited_timestamp ? new Date(s.message.edited_timestamp) : null, embeds: this.client.util.embedsToParsed(s.message.embeds), flags: s.message.flags ?? 0, mentions: { channels: (s.message.content.match(/<#\d{17,21}>/g) ?? []).map(mention => mention.slice(2, -1)), roles: s.message.mention_roles, users: s.message.mentions.map(u => this.client.users.update(u)) }, timestamp: new Date(s.message.timestamp), type: s.message.type } })); } if (data.nonce !== undefined) { this.nonce = data.nonce; } if (data.pinned !== undefined) { this.pinned = data.pinned; } if (data.position !== undefined) { this.position = data.position; } if (data.reactions) { this.reactions = data.reactions.map(r => ({ burstColors: r.burst_colors, count: r.count, countDetails: r.count_details, emoji: r.emoji, me: r.me, meBurst: r.me_burst })); } if (data.referenced_message !== undefined) { if (data.referenced_message === null) { this.referencedMessage = null; } else { this.referencedMessage = this.channel ? this.channel.messages?.update(data.referenced_message) : new Message(data.referenced_message, this.client); } } if (data.role_subscription_data !== undefined) { this.roleSubscriptionData = { isRenewal: data.role_subscription_data.is_renewal, roleSubscriptionListingID: data.role_subscription_data.role_subscription_listing_id, tierName: data.role_subscription_data.tier_name, totalMonthsSubscribed: data.role_subscription_data.total_months_subscribed }; } if (data.sticker_items !== undefined) { this.stickerItems = data.sticker_items; } if (data.thread !== undefined) { this.thread = this.client.util.updateThread(data.thread); } } /** The channel this message was created in. */ get channel() { return this._cachedChannel ??= this.client.getChannel(this.channelID); } /** The guild this message is in. This will throw an error if the guild is not cached. */ get guild() { if (this.guildID !== null && this._cachedGuild !== null) { this._cachedGuild ??= this.client.guilds.get(this.guildID); if (!this._cachedGuild) { if (this.client.options.restMode) { throw new Errors_1.UncachedError(`${this.constructor.name}#guild is not present when rest mode is enabled.`); } if (!this.client.shards.connected) { throw new Errors_1.UncachedError(`${this.constructor.name}#guild is not present without a gateway connection.`); } throw new Errors_1.UncachedError(`${this.constructor.name}#guild is not present.`); } return this._cachedGuild; } return this._cachedGuild === null ? this._cachedGuild : (this._cachedGuild = null); } /** A link to this message. */ get jumpLink() { return `${Constants_1.BASE_URL}${Routes.MESSAGE_LINK(this.guildID ?? "@me", this.channelID, this.id)}`; } /** * Add a reaction to this message. * @param emoji The reaction to add to the message. `name:id` for custom emojis, and the unicode codepoint for default emojis. */ async createReaction(emoji) { return this.client.rest.channels.createReaction(this.channelID, this.id, emoji); } /** * Crosspost this message in an announcement channel. */ async crosspost() { return this.client.rest.channels.crosspostMessage(this.channelID, this.id); } /** * Delete this message. * @param reason The reason for deleting the message. */ async delete(reason) { return this.client.rest.channels.deleteMessage(this.channelID, this.id, reason); } /** * Remove a reaction from this message. * @param emoji The reaction to remove from the message. `name:id` for custom emojis, and the unicode codepoint for default emojis. * @param user The user to remove the reaction from, `@me` for the current user (default). */ async deleteReaction(emoji, user = "@me") { return this.client.rest.channels.deleteReaction(this.channelID, this.id, emoji, user); } /** * Remove all, or a specific emoji's reactions from this message. * @param emoji The reaction to remove from the message. `name:id` for custom emojis, and the unicode codepoint for default emojis. Omit to remove all reactions. */ async deleteReactions(emoji) { return this.client.rest.channels.deleteReactions(this.channelID, this.id, emoji); } /** * Delete this message as a webhook. * @param token The token of the webhook. * @param options Options for deleting the message. */ async deleteWebhook(token, options) { if (!this.webhookID) { throw new TypeError("This message is not a webhook message."); } return this.client.rest.webhooks.deleteMessage(this.webhookID, token, this.id, options); } /** * Edit this message. * @param options The options for editing the message. */ async edit(options) { return this.client.rest.channels.editMessage(this.channelID, this.id, options); } /** * Edit this message as a webhook. * @param token The token of the webhook. * @param options The options for editing the message. */ async editWebhook(token, options) { if (!this.webhookID) { throw new TypeError("This message is not a webhook message."); } return this.client.rest.webhooks.editMessage(this.webhookID, token, this.id, options); } /** End this The poll on this message now. */ async expire() { if (this.poll === undefined) { throw new TypeError("Message does not have a poll."); } await this.poll.expire(); } /** * Get the users that voted on a poll answer. * @param answerID The ID of the poll answer to get voters for. * @param options The options for getting the voters. */ async getPollAnswerUsers(answerID, options) { if (this.poll === undefined) { throw new TypeError("Message does not have a poll."); } return this.poll.getAnswerUsers(answerID, options); } /** * Get the users who reacted with a specific emoji on this message. * @param emoji The reaction to remove from the message. `name:id` for custom emojis, and the unicode codepoint for default emojis. * @param options The options for getting the reactions. */ async getReactions(emoji, options) { return this.client.rest.channels.getReactions(this.channelID, this.id, emoji, options); } /** Whether this message belongs to a cached guild channel. The only difference on using this method over a simple if statement is to easily update all the message properties typing definitions based on the channel it belongs to. */ inCachedGuildChannel() { return this.channel instanceof GuildChannel_1.default; } /** Whether this message belongs to a direct message channel (PrivateChannel or uncached). The only difference on using this method over a simple if statement is to easily update all the message properties typing definitions based on the channel it belongs to. */ inDirectMessageChannel() { return this.guildID === null; } /** * Pin this message. * @param reason The reason for pinning the message. */ async pin(reason) { return this.client.rest.channels.pinMessage(this.channelID, this.id, reason); } /** * Create a thread from this message. * @param options The options for creating the thread. */ async startThread(options) { return this.client.rest.channels.startThreadFromMessage(this.channelID, this.id, options); } toJSON() { const im = this.interactionMetadata; return { ...super.toJSON(), activity: this.activity, applicationID: this.applicationID ?? undefined, attachments: this.attachments.map(attachment => attachment.toJSON()), author: this.author.toJSON(), channelID: this.channelID, components: this.components, content: this.content, editedTimestamp: this.editedTimestamp?.getTime() ?? null, embeds: this.embeds, flags: this.flags, guildID: this.guildID ?? undefined, interaction: this.interaction === undefined ? undefined : { id: this.interaction.id, member: this.interaction.member?.toJSON(), name: this.interaction.name, type: this.interaction.type, user: this.interaction.user.toJSON() }, interactionMetadata: im === undefined ? undefined : { authorizingIntegrationOwners: im.authorizingIntegrationOwners, id: im.id, interactedMessageID: im.interactedMessageID, name: im.name, originalResponseMessageID: im.originalResponseMessageID, targetMessageID: im.targetMessageID, targetUser: im.targetUser instanceof User_1.default ? im.targetUser.toJSON() : im.targetUser, type: im.type, user: im.user instanceof User_1.default ? im.user.toJSON() : im.user, triggeringInteractionMetadata: im.triggeringInteractionMetadata === undefined ? undefined : { authorizingIntegrationOwners: im.triggeringInteractionMetadata.authorizingIntegrationOwners, id: im.triggeringInteractionMetadata.id, interactedMessageID: im.triggeringInteractionMetadata.interactedMessageID, originalResponseMessageID: im.triggeringInteractionMetadata.originalResponseMessageID, targetMessageID: im.triggeringInteractionMetadata.targetMessageID, targetUser: im.triggeringInteractionMetadata.targetUser instanceof User_1.default ? im.triggeringInteractionMetadata.targetUser.toJSON() : im.triggeringInteractionMetadata.targetUser, type: im.triggeringInteractionMetadata.type, user: im.triggeringInteractionMetadata.user instanceof User_1.default ? im.triggeringInteractionMetadata.user.toJSON() : im.triggeringInteractionMetadata.user } }, mentionChannels: this.mentionChannels, mentions: { channels: this.mentions.channels, everyone: this.mentions.everyone, members: this.mentions.members.map(member => member.toJSON()), roles: this.mentions.roles, users: this.mentions.users.map(user => user.toJSON()) }, messageReference: this.messageReference, messageSnapshots: this.messageSnapshots?.map(s => ({ message: { attachments: s.message.attachments.map(a => a.toJSON()), content: s.message.content, editedTimestamp: s.message.editedTimestamp?.getTime() ?? null, embeds: s.message.embeds, flags: s.message.flags, mentions: { channels: s.message.mentions.channels, roles: s.message.mentions.roles, users: s.message.mentions.users.map(u => u.toJSON()) }, timestamp: s.message.timestamp.getTime(), type: s.message.type } })), nonce: this.nonce, pinned: this.pinned, position: this.position, poll: this.poll?.toJSON(), pollResults: this.pollResults, reactions: this.reactions, referencedMessage: this.referencedMessage?.toJSON(), stickerItems: this.stickerItems, thread: this.thread?.toJSON(), timestamp: this.timestamp.getTime(), tts: this.tts, type: this.type, webhook: this.webhookID }; } /** * Unpin this message. * @param reason The reason for unpinning the message. */ async unpin(reason) { return this.client.rest.channels.unpinMessage(this.channelID, this.id, reason); } } exports.default = Message; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVzc2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9zdHJ1Y3R1cmVzL01lc3NhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0JBQXNCO0FBQ3RCLDBEQUEwQjtBQUMxQixzRUFBc0M7QUFDdEMsMERBQTBCO0FBRzFCLHNGQUFzRDtBQU10RCwwRUFBMEM7QUFFMUMsMERBQTBCO0FBRTFCLHNGQUFzRDtBQUN0RCw0Q0FBMkQ7QUErQjNELCtEQUF5QztBQUN6QywyQ0FBK0M7QUFFL0MsNEJBQTRCO0FBQzVCLE1BQXFCLE9BQWlGLFNBQVEsY0FBSTtJQUN0RyxjQUFjLENBQWdEO0lBQzlELFlBQVksQ0FBNEQ7SUFDaEYsb0pBQW9KO0lBQ3BKLFFBQVEsQ0FBbUI7SUFDM0I7Ozs7T0FJRztJQUNILFdBQVcsQ0FBMEM7SUFDckQ7Ozs7T0FJRztJQUNILGFBQWEsQ0FBZ0I7SUFDN0IsdUNBQXVDO0lBQ3ZDLFdBQVcsQ0FBNkM7SUFDeEQsa0NBQWtDO0lBQ2xDLE1BQU0sQ0FBTztJQUNiLDZDQUE2QztJQUM3QyxJQUFJLENBQVE7SUFDWix5REFBeUQ7SUFDekQsU0FBUyxDQUFTO0lBQ2xCLHNDQUFzQztJQUN0QyxVQUFVLENBQTBCO0lBQ3BDLG1DQUFtQztJQUNuQyxPQUFPLENBQVM7SUFDaEIsMkRBQTJEO0lBQzNELGVBQWUsQ0FBYztJQUM3QixrQ0FBa0M7SUFDbEMsTUFBTSxDQUFlO0lBQ3JCLHVIQUF1SDtJQUN2SCxLQUFLLENBQVM7SUFDZCw4Q0FBOEM7SUFDOUMsT0FBTyxDQUE2RDtJQUNwRTs7O09BR0c7SUFDSCxXQUFXLENBQXNCO0lBQ2pDLDhFQUE4RTtJQUM5RSxtQkFBbUIsQ0FBaUM7SUFDcEQsMkVBQTJFO0lBQzNFLE1BQU0sQ0FBa0U7SUFDeEUsK0xBQStMO0lBQy9MLGVBQWUsQ0FBeUI7SUFDeEMsb0NBQW9DO0lBQ3BDLFFBQVEsQ0FBa0I7SUFDMUIsd0dBQXdHO0lBQ3hHLGdCQUFnQixD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