discord.emoji-backup
Version:
A simple package to make your emoji easier to handle.
158 lines (143 loc) • 4.42 kB
JavaScript
/* eslint-disable no-shadow */
const util = require('util');
const { existsSync, mkdirSync, readdir: test, writeFileSync, statSync } = require('fs');
const { join } = require('path');
const readdir = util.promisify(test);
const PACKAGE = require('./package.json');
const { generate } = require('randomstring');
let dirBackup = `${join(__dirname)}/backups/`;
if (!existsSync(dirBackup)) {
mkdirSync(dirBackup);
}
const Backup = require('./source/util/backup');
const backup = new Backup();
const Loader = require('./source/util/load');
const loader = new Loader();
/**
* @since 1.0.0
* @param {string} id Backup ID
* @returns Backup informations
*/
async function backupInfo(id) {
return new Promise(async function(sucess, reject) {
const files = await readdir(dirBackup);
const file = files.filter(ff => ff.split('.').pop() === 'json').find(ff => ff === `${id}.json`);
if (file) {
const backup = require(`${dirBackup}${file}`);
sucess(backup);
} else {
reject(`No backups found with id ${id}`);
}
});
}
class DiscordBackup {
constructor() {
this.version = PACKAGE.version;
}
/**
* Change the storage path
* @param {string} path The folder path
*/
setStorageFolder(path) {
dirBackup = path;
if (!existsSync(dirBackup)) {
mkdirSync(dirBackup);
}
}
/**
* This function fetches a backyp and returns the information about it
* @param {string} backupID The ID of the backup to fetch
* @returns An object, the backup informations
*/
async fetch(backupID) {
return new Promise(async function(sucess, reject) {
backupInfo(backupID).then(async info => {
const size = statSync(`${dirBackup}${backupID}.json`).size;
sucess({
ID: backupID,
guildID: info.id,
createdTimestamp: info.createdTimestamp,
size: `${(size / 1024 / 1024).toFixed(2)}MB`,
data: backupInformations,
});
}).catch(() => {
reject(`No backups found with id ${backupid}`);
});
});
}
/**
* @since 1.0.0
* @returns A list of backups
*/
async list() {
const files = await readdir(dirBackup);
return files.map((f) => f.length === 0 ? 'No backups found.' : f.substr(0, 5));
}
/**
* Function of creating guild emoji backup
* @since 1.0.0
* @param {object} guild Guild to create a emoji backup
* @param {object} options
* @returns Sucess or error
*/
async create(guild, options = { json: false }) {
return new Promise(async function(sucess, reject) {
try {
guild.iconURL();
} catch (error) {
if (error.message.includes('guild.iconURL is not a function')) {
return reject('You must install discord.js version 12 to use this package.');
} else {
return console.error(error);
}
}
const data = {
name: guild.name,
id: guild.id,
emojis: [],
createdTimestamp: (+new Date()),
};
data.emojis = await backup.getEmojis(guild).catch(() => null);
const backupid = generate(8);
if (options.json) {
return sucess(data);
} else if (!options.json) {
writeFileSync(`${dirBackup}${backupid}.json`, JSON.stringify(data));
return sucess(backupid);
}
});
}
/**
* @since 1.0.0
* @param {object} guild Guild to load the emoji backup
* @param {string} backupid Backup id you want to upload
* @param {object} options If you want to delete all guild emojis, put {deleteAll: true}
*/
async load(guild, backupid, options = { deleteAll: false }) {
return new Promise(async function(sucess, reject) {
if (typeof options !== 'object') return reject('Options must be an object');
await backupInfo(backupid).then(async (info) => {
if (!guild) {
return reject('Invalid guild');
}
try {
guild.iconURL();
} catch (error) {
if (error.message.includes('guild.iconURL is not a function')) {
return reject('You must install discord.js version 12 to use this package.');
}
}
if (options.deleteAll) {
await loader.deleteEmojis(guild);
await loader.loadEmojis(guild, info);
} else if (!options.deleteAll) {
await loader.loadEmojis(guild, info);
}
return sucess(true);
}).catch(() => {
return reject(`No backups found with id ${backupid}`);
});
});
}
}
module.exports.EmojiBackup = DiscordBackup;