oceanic.js
Version:
A NodeJS library for interfacing with Discord.
549 lines • 53.2 kB
JavaScript
"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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