2022-04-11 02:14:16 +00:00
|
|
|
|
'use strict';
|
|
|
|
|
const axios = require('axios');
|
2022-04-11 05:53:02 +00:00
|
|
|
|
const baseURL = 'https://sagiri-fansub.tk/embed?';
|
2022-04-11 02:14:16 +00:00
|
|
|
|
const hiddenCharter =
|
|
|
|
|
'||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||';
|
|
|
|
|
const { RangeError } = require('../errors');
|
|
|
|
|
const Util = require('../util/Util');
|
|
|
|
|
|
|
|
|
|
class WebEmbed {
|
2022-04-11 05:53:02 +00:00
|
|
|
|
constructor(data = {}) {
|
|
|
|
|
this._setup(data);
|
|
|
|
|
/**
|
|
|
|
|
* Shorten the link
|
|
|
|
|
* @type {?boolean}
|
|
|
|
|
*/
|
|
|
|
|
this.shorten = data.shorten ?? true;
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Hidden Embed link
|
|
|
|
|
* @type {?boolean}
|
|
|
|
|
*/
|
|
|
|
|
this.hidden = data.hidden ?? false;
|
|
|
|
|
}
|
2022-04-16 04:59:23 +00:00
|
|
|
|
/**
|
|
|
|
|
* @private
|
|
|
|
|
* @param {object} data
|
|
|
|
|
*/
|
2022-04-11 05:53:02 +00:00
|
|
|
|
_setup(data) {
|
2022-04-11 02:14:16 +00:00
|
|
|
|
/**
|
2022-04-11 05:53:02 +00:00
|
|
|
|
* Type image of this embed
|
|
|
|
|
* @type {?thumbnail | image}
|
2022-04-11 02:14:16 +00:00
|
|
|
|
*/
|
2022-04-11 05:53:02 +00:00
|
|
|
|
this.imageType = 'thumbnail';
|
|
|
|
|
/**
|
|
|
|
|
* The title of this embed
|
|
|
|
|
* @type {?string}
|
|
|
|
|
*/
|
|
|
|
|
this.title = data.title ?? null;
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* The description of this embed
|
|
|
|
|
* @type {?string}
|
|
|
|
|
*/
|
|
|
|
|
this.description = data.description ?? null;
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* The URL of this embed
|
|
|
|
|
* @type {?string}
|
|
|
|
|
*/
|
|
|
|
|
this.url = data.url ?? null;
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* The color of this embed
|
|
|
|
|
* @type {?number}
|
|
|
|
|
*/
|
|
|
|
|
this.color = 'color' in data ? Util.resolveColor(data.color) : null;
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Represents the image of a MessageEmbed
|
|
|
|
|
* @typedef {Object} MessageEmbedImage
|
|
|
|
|
* @property {string} url URL for this image
|
|
|
|
|
* @property {string} proxyURL ProxyURL for this image
|
|
|
|
|
* @property {number} height Height of this image
|
|
|
|
|
* @property {number} width Width of this image
|
|
|
|
|
*/
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* The image of this embed, if there is one
|
|
|
|
|
* @type {?MessageEmbedImage}
|
|
|
|
|
*/
|
|
|
|
|
this.image = data.image
|
|
|
|
|
? {
|
|
|
|
|
url: data.image.url,
|
|
|
|
|
proxyURL: data.image.proxyURL ?? data.image.proxy_url,
|
|
|
|
|
height: data.image.height,
|
|
|
|
|
width: data.image.width,
|
|
|
|
|
}
|
|
|
|
|
: null;
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* The thumbnail of this embed (if there is one)
|
|
|
|
|
* @type {?MessageEmbedThumbnail}
|
|
|
|
|
*/
|
|
|
|
|
this.thumbnail = data.thumbnail
|
|
|
|
|
? {
|
|
|
|
|
url: data.thumbnail.url,
|
|
|
|
|
proxyURL: data.thumbnail.proxyURL ?? data.thumbnail.proxy_url,
|
|
|
|
|
height: data.thumbnail.height,
|
|
|
|
|
width: data.thumbnail.width,
|
|
|
|
|
}
|
|
|
|
|
: null;
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Represents the video of a MessageEmbed
|
|
|
|
|
* @typedef {Object} MessageEmbedVideo
|
|
|
|
|
* @property {string} url URL of this video
|
|
|
|
|
* @property {string} proxyURL ProxyURL for this video
|
|
|
|
|
* @property {number} height Height of this video
|
|
|
|
|
* @property {number} width Width of this video
|
|
|
|
|
*/
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* The video of this embed (if there is one)
|
|
|
|
|
* @type {?MessageEmbedVideo}
|
|
|
|
|
* @readonly
|
|
|
|
|
*/
|
|
|
|
|
this.video = data.video
|
|
|
|
|
? {
|
|
|
|
|
url: data.video.url,
|
|
|
|
|
proxyURL: data.video.proxyURL ?? data.video.proxy_url,
|
|
|
|
|
height: data.video.height,
|
|
|
|
|
width: data.video.width,
|
|
|
|
|
}
|
|
|
|
|
: null;
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Represents the author field of a MessageEmbed
|
|
|
|
|
* @typedef {Object} MessageEmbedAuthor
|
|
|
|
|
* @property {string} name The name of this author
|
|
|
|
|
* @property {string} url URL of this author
|
|
|
|
|
* @property {string} iconURL URL of the icon for this author
|
|
|
|
|
* @property {string} proxyIconURL Proxied URL of the icon for this author
|
|
|
|
|
*/
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* The author of this embed (if there is one)
|
|
|
|
|
* @type {?MessageEmbedAuthor}
|
|
|
|
|
*/
|
|
|
|
|
this.author = data.author
|
|
|
|
|
? {
|
|
|
|
|
name: data.author.name,
|
|
|
|
|
url: data.author.url,
|
|
|
|
|
}
|
|
|
|
|
: null;
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Represents the provider of a MessageEmbed
|
|
|
|
|
* @typedef {Object} MessageEmbedProvider
|
|
|
|
|
* @property {string} name The name of this provider
|
|
|
|
|
* @property {string} url URL of this provider
|
|
|
|
|
*/
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* The provider of this embed (if there is one)
|
|
|
|
|
* @type {?MessageEmbedProvider}
|
|
|
|
|
*/
|
|
|
|
|
this.provider = data.provider
|
|
|
|
|
? {
|
|
|
|
|
name: data.provider.name,
|
|
|
|
|
url: data.provider.name,
|
|
|
|
|
}
|
|
|
|
|
: null;
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* The options to provide for setting an author for a {@link MessageEmbed}.
|
|
|
|
|
* @typedef {Object} EmbedAuthorData
|
|
|
|
|
* @property {string} name The name of this author.
|
|
|
|
|
*/
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Sets the author of this embed.
|
|
|
|
|
* @param {string|EmbedAuthorData|null} options The options to provide for the author.
|
|
|
|
|
* Provide `null` to remove the author data.
|
|
|
|
|
* @returns {MessageEmbed}
|
|
|
|
|
*/
|
|
|
|
|
setAuthor(options) {
|
|
|
|
|
if (options === null) {
|
|
|
|
|
this.author = {};
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
const { name, url } = options;
|
|
|
|
|
this.author = {
|
|
|
|
|
name: Util.verifyString(name, RangeError, 'EMBED_AUTHOR_NAME'),
|
|
|
|
|
url,
|
|
|
|
|
};
|
|
|
|
|
return this;
|
|
|
|
|
}
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* The options to provide for setting an provider for a {@link MessageEmbed}.
|
|
|
|
|
* @typedef {Object} EmbedProviderData
|
|
|
|
|
* @property {string} name The name of this provider.
|
|
|
|
|
*/
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Sets the provider of this embed.
|
|
|
|
|
* @param {string|EmbedProviderData|null} options The options to provide for the provider.
|
|
|
|
|
* Provide `null` to remove the provider data.
|
|
|
|
|
* @returns {MessageEmbed}
|
|
|
|
|
*/
|
|
|
|
|
setProvider(options) {
|
|
|
|
|
if (options === null) {
|
|
|
|
|
this.provider = {};
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
const { name, url } = options;
|
|
|
|
|
this.provider = {
|
|
|
|
|
name: Util.verifyString(name, RangeError, 'EMBED_PROVIDER_NAME'),
|
|
|
|
|
url,
|
|
|
|
|
};
|
|
|
|
|
return this;
|
|
|
|
|
}
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Sets the color of this embed.
|
|
|
|
|
* @param {ColorResolvable} color The color of the embed
|
|
|
|
|
* @returns {MessageEmbed}
|
|
|
|
|
*/
|
|
|
|
|
setColor(color) {
|
|
|
|
|
this.color = Util.resolveColor(color);
|
|
|
|
|
return this;
|
|
|
|
|
}
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Sets the description of this embed.
|
|
|
|
|
* @param {string} description The description (Limit 350 characters)
|
|
|
|
|
* @returns {MessageEmbed}
|
|
|
|
|
*/
|
|
|
|
|
setDescription(description) {
|
|
|
|
|
this.description = Util.verifyString(
|
|
|
|
|
description,
|
|
|
|
|
RangeError,
|
|
|
|
|
'EMBED_DESCRIPTION',
|
|
|
|
|
);
|
|
|
|
|
return this;
|
|
|
|
|
}
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Sets the image of this embed.
|
|
|
|
|
* @param {string} url The URL of the image
|
|
|
|
|
* @returns {MessageEmbed}
|
|
|
|
|
*/
|
|
|
|
|
setImage(url) {
|
2022-04-14 16:02:59 +00:00
|
|
|
|
if (this.thumbnail && this.thumbnail.url) {
|
2022-04-11 05:53:02 +00:00
|
|
|
|
console.warn('You can only set image or thumbnail per embed.');
|
|
|
|
|
this.thumbnail.url = null;
|
|
|
|
|
}
|
2022-04-14 17:01:41 +00:00
|
|
|
|
this.imageType = 'image';
|
2022-04-11 05:53:02 +00:00
|
|
|
|
this.image = { url };
|
|
|
|
|
return this;
|
|
|
|
|
}
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Sets the thumbnail of this embed.
|
|
|
|
|
* @param {string} url The URL of the image
|
|
|
|
|
* @returns {MessageEmbed}
|
|
|
|
|
*/
|
|
|
|
|
setThumbnail(url) {
|
2022-04-14 16:02:59 +00:00
|
|
|
|
if (this.image && this.image.url) {
|
|
|
|
|
console.warn('You can only set image or thumbnail per embed.');
|
|
|
|
|
this.image.url = null;
|
|
|
|
|
}
|
2022-04-14 17:01:41 +00:00
|
|
|
|
this.imageType = 'thumbnail';
|
2022-04-11 05:53:02 +00:00
|
|
|
|
this.thumbnail = { url };
|
|
|
|
|
return this;
|
|
|
|
|
}
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Sets the video of this embed.
|
|
|
|
|
* @param {string} url The URL of the video
|
|
|
|
|
* @returns {MessageEmbed}
|
|
|
|
|
*/
|
|
|
|
|
setVideo(url) {
|
|
|
|
|
this.video = { url };
|
|
|
|
|
return this;
|
|
|
|
|
}
|
2022-04-11 02:14:16 +00:00
|
|
|
|
|
2022-04-11 05:53:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Sets the title of this embed.
|
|
|
|
|
* @param {string} title The title
|
|
|
|
|
* @returns {MessageEmbed}
|
|
|
|
|
*/
|
|
|
|
|
setTitle(title) {
|
|
|
|
|
this.title = Util.verifyString(title, RangeError, 'EMBED_TITLE');
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Sets the URL of this embed.
|
|
|
|
|
* @param {string} url The URL
|
|
|
|
|
* @returns {MessageEmbed}
|
|
|
|
|
*/
|
|
|
|
|
setURL(url) {
|
|
|
|
|
this.url = url;
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Return Message Content + Embed (if hidden, pls check content length because it has 1000+ length)
|
|
|
|
|
* @returns {string} Message Content
|
|
|
|
|
*/
|
|
|
|
|
async toMessage() {
|
|
|
|
|
const arrayQuery = [`image_type=${this.imageType}`];
|
|
|
|
|
if (this.title) {
|
|
|
|
|
arrayQuery.push(`title=${encodeURIComponent(this.title)}`);
|
|
|
|
|
}
|
|
|
|
|
if (this.description) {
|
|
|
|
|
arrayQuery.push(`description=${encodeURIComponent(this.description)}`);
|
|
|
|
|
}
|
|
|
|
|
if (this.url) {
|
|
|
|
|
arrayQuery.push(`url=${encodeURIComponent(this.url)}`);
|
|
|
|
|
}
|
|
|
|
|
if (this.color) {
|
|
|
|
|
arrayQuery.push(
|
|
|
|
|
`color=${encodeURIComponent('#' + this.color.toString(16))}`,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
if (this.image?.url) {
|
|
|
|
|
arrayQuery.push(`image=${encodeURIComponent(this.image.url)}`);
|
|
|
|
|
}
|
|
|
|
|
if (this.video?.url) {
|
|
|
|
|
arrayQuery.push(`video=${encodeURIComponent(this.video.url)}`);
|
|
|
|
|
}
|
|
|
|
|
if (this.author) {
|
|
|
|
|
if (this.author.name)
|
|
|
|
|
arrayQuery.push(`author_name=${encodeURIComponent(this.author.name)}`);
|
|
|
|
|
if (this.author.url)
|
|
|
|
|
arrayQuery.push(`author_url=${encodeURIComponent(this.author.url)}`);
|
|
|
|
|
}
|
|
|
|
|
if (this.provider) {
|
|
|
|
|
if (this.provider.name)
|
|
|
|
|
arrayQuery.push(
|
|
|
|
|
`provider_name=${encodeURIComponent(this.provider.name)}`,
|
|
|
|
|
);
|
|
|
|
|
if (this.provider.url)
|
|
|
|
|
arrayQuery.push(
|
|
|
|
|
`provider_url=${encodeURIComponent(this.provider.url)}`,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
if (this.thumbnail?.url) {
|
|
|
|
|
arrayQuery.push(`image=${encodeURIComponent(this.thumbnail.url)}`);
|
2022-04-11 02:14:16 +00:00
|
|
|
|
}
|
2022-04-11 05:53:02 +00:00
|
|
|
|
const fullURL = `${baseURL}${arrayQuery.join('&')}`;
|
|
|
|
|
if (this.shorten) {
|
|
|
|
|
const url = await getShorten(fullURL);
|
|
|
|
|
if (!url) console.log('Cannot shorten URL in WebEmbed');
|
|
|
|
|
return this.hidden
|
|
|
|
|
? `${hiddenCharter} ${url || fullURL}`
|
|
|
|
|
: url || fullURL;
|
|
|
|
|
} else {
|
|
|
|
|
return this.hidden ? `${hiddenCharter} ${fullURL}` : fullURL;
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-04-11 02:14:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Credit: https://www.npmjs.com/package/node-url-shortener + google :))
|
|
|
|
|
const getShorten = async (url) => {
|
|
|
|
|
const APIurl = [
|
|
|
|
|
// 'https://is.gd/create.php?format=simple&url=', :(
|
|
|
|
|
'https://tinyurl.com/api-create.php?url=',
|
|
|
|
|
'https://sagiri-fansub.tk/api/v1/short?url=', // my api, pls don't ddos :(
|
2022-04-14 17:01:41 +00:00
|
|
|
|
'https://lazuee.ga/api/v1/shorten?url='
|
2022-04-11 02:14:16 +00:00
|
|
|
|
// 'https://cdpt.in/shorten?url=', Redirects 5s :(
|
|
|
|
|
];
|
|
|
|
|
try {
|
|
|
|
|
const res = await axios.get(
|
|
|
|
|
`${
|
|
|
|
|
APIurl[Math.floor(Math.random() * APIurl.length)]
|
|
|
|
|
}${encodeURIComponent(url)}`,
|
|
|
|
|
);
|
2022-04-14 17:01:41 +00:00
|
|
|
|
if (typeof res.data == 'string') return res.data;
|
|
|
|
|
else if (typeof res.data == 'object') return res.data.shorten;
|
|
|
|
|
else throw null;
|
2022-04-11 02:14:16 +00:00
|
|
|
|
} catch {
|
|
|
|
|
return void 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
module.exports = WebEmbed;
|
|
|
|
|
module.exports.hiddenEmbed = hiddenCharter;
|