'use strict'; const AttachmentFlagsBitField = require('../util/AttachmentFlagsBitField.js'); const { basename, flatten } = require('../util/Util'); /** * @typedef {Object} AttachmentPayload * @property {?string} name The name of the attachment * @property {Stream|BufferResolvable} attachment The attachment in this payload * @property {?string} description The description of the attachment */ /** * Represents an attachment */ class Attachment { constructor(data) { this.attachment = data.url; /** * The name of this attachment * @type {string} */ this.name = data.filename; this._patch(data); } _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; if ('duration_secs' in data) { /** * The duration of this attachment in seconds * This will only be available if the attachment is an audio file. * @type {?number} */ this.duration = data.duration_secs; } else { this.duration ??= null; } if ('waveform' in data) { /** * The base64 encoded byte array representing a sampled waveform * This will only be available if the attachment is an audio file. * @type {?string} */ this.waveform = data.waveform; } else { this.waveform ??= null; } if ('flags' in data) { /** * The flags of this attachment * @type {Readonly} */ this.flags = new AttachmentFlagsBitField(data.flags).freeze(); } else { this.flags ??= new AttachmentFlagsBitField().freeze(); } } /** * Whether or not this attachment has been marked as a spoiler * @type {boolean} * @readonly */ get spoiler() { return basename(this.url ?? this.name).startsWith('SPOILER_'); } toJSON() { return flatten(this); } } module.exports = Attachment;