172 lines
3.7 KiB
JavaScript
172 lines
3.7 KiB
JavaScript
|
'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}
|
||
|
*/
|