'use strict'; const Util = require('../util/Util'); /** * Represents an attachment in a message. */ class MessageAttachment { /** * @param {BufferResolvable|Stream} attachment The file * @param {string} [name=null] The name of the file, if any * @param {APIAttachment} [data] Extra data */ constructor(attachment, name = null, data) { this.attachment = attachment; /** * The name of this attachment * @type {?string} */ this.name = name; if (data) this._patch(data); } /** * Sets the description of this attachment. * @param {string} description The description of the file * @returns {MessageAttachment} This attachment */ setDescription(description) { this.description = description; return this; } /** * Sets the file of this attachment. * @param {BufferResolvable|Stream} attachment The file * @param {string} [name=null] The name of the file, if any * @returns {MessageAttachment} This attachment */ setFile(attachment, name = null) { this.attachment = attachment; this.name = name; return this; } /** * Sets the name of this attachment. * @param {string} name The name of the file * @returns {MessageAttachment} This attachment */ setName(name) { this.name = name; return this; } /** * Sets whether this attachment is a spoiler * @param {boolean} [spoiler=true] Whether the attachment should be marked as a spoiler * @returns {MessageAttachment} This attachment */ setSpoiler(spoiler = true) { if (spoiler === this.spoiler) return this; if (!spoiler) { while (this.spoiler) { this.name = this.name.slice('SPOILER_'.length); } return this; } this.name = `SPOILER_${this.name}`; return this; } _patch(data) { /** * The attachment's id * @type {Snowflake} */ this.id = data.id; if ('size' in data) { /** * The size of this attachment in bytes * @type {number} */ this.size = data.size; } if ('url' in data) { /** * The URL to this attachment * @type {string} */ this.url = data.url; } if ('proxy_url' in data) { /** * The Proxy URL to this attachment * @type {string} */ this.proxyURL = data.proxy_url; } if ('height' in data) { /** * The height of this attachment (if an image or video) * @type {?number} */ this.height = data.height; } else { this.height ??= null; } if ('width' in data) { /** * The width of this attachment (if an image or video) * @type {?number} */ this.width = data.width; } else { this.width ??= null; } if ('content_type' in data) { /** * The media type of this attachment * @type {?string} */ this.contentType = data.content_type; } else { this.contentType ??= null; } if ('description' in data) { /** * The description (alt text) of this attachment * @type {?string} */ this.description = data.description; } else { this.description ??= null; } /** * Whether this attachment is ephemeral * @type {boolean} */ this.ephemeral = data.ephemeral ?? false; } /** * Whether or not this attachment has been marked as a spoiler * @type {boolean} * @readonly */ get spoiler() { return Util.basename(this.url ?? this.name).startsWith('SPOILER_'); } toJSON() { return Util.flatten(this); } } module.exports = MessageAttachment; /** * @external APIAttachment * @see {@link https://discord.com/developers/docs/resources/channel#attachment-object} */