discord.js-selfbot-v13/src/structures/MessageAttachment.js
2022-03-19 17:37:45 +07:00

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}
*/