discord-backup
Version:
A complete framework to facilitate server backup using discord.js v14 with rate limiting and error handling
185 lines (184 loc) • 6.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.loadEmbedChannel = exports.loadBans = exports.loadEmojis = exports.loadAFK = exports.loadChannels = exports.loadRoles = exports.loadConfig = void 0;
const discord_js_1 = require("discord.js");
const util_1 = require("./util");
/**
* Restores the guild configuration
*/
const loadConfig = (guild, backupData) => {
const configPromises = [];
if (backupData.name) {
configPromises.push(guild.setName(backupData.name));
}
if (backupData.iconBase64) {
configPromises.push(guild.setIcon(Buffer.from(backupData.iconBase64, 'base64')));
}
else if (backupData.iconURL) {
configPromises.push(guild.setIcon(backupData.iconURL));
}
if (backupData.splashBase64) {
configPromises.push(guild.setSplash(Buffer.from(backupData.splashBase64, 'base64')));
}
else if (backupData.splashURL) {
configPromises.push(guild.setSplash(backupData.splashURL));
}
if (backupData.bannerBase64) {
configPromises.push(guild.setBanner(Buffer.from(backupData.bannerBase64, 'base64')));
}
else if (backupData.bannerURL) {
configPromises.push(guild.setBanner(backupData.bannerURL));
}
if (backupData.verificationLevel) {
configPromises.push(guild.setVerificationLevel(backupData.verificationLevel));
}
if (backupData.defaultMessageNotifications) {
configPromises.push(guild.setDefaultMessageNotifications(backupData.defaultMessageNotifications));
}
const changeableExplicitLevel = guild.features.includes(discord_js_1.GuildFeature.Community);
if (backupData.explicitContentFilter && changeableExplicitLevel) {
configPromises.push(guild.setExplicitContentFilter(backupData.explicitContentFilter));
}
return Promise.all(configPromises);
};
exports.loadConfig = loadConfig;
/**
* Restore the guild roles
*/
const loadRoles = async (guild, backupData) => {
const roles = [];
for (const roleData of backupData.roles) {
try {
let role;
if (roleData.isEveryone) {
const everyoneRole = guild.roles.cache.get(guild.id);
if (everyoneRole) {
role = await everyoneRole.edit({
name: roleData.name,
color: roleData.color,
permissions: BigInt(roleData.permissions),
mentionable: roleData.mentionable
});
roles.push(role);
}
}
else {
role = await guild.roles.create({
name: roleData.name.slice(0, 100),
color: roleData.color,
hoist: roleData.hoist,
permissions: BigInt(roleData.permissions),
mentionable: roleData.mentionable
});
roles.push(role);
}
await new Promise((resolve) => setTimeout(resolve, 250));
}
catch (error) {
// Failed to create/edit role - skipping
}
}
return roles;
};
exports.loadRoles = loadRoles;
/**
* Restore the guild channels
*/
const loadChannels = (guild, backupData, options) => {
const loadChannelPromises = [];
backupData.channels.categories.forEach((categoryData) => {
loadChannelPromises.push(new Promise((resolve) => {
(0, util_1.loadCategory)(categoryData, guild).then((createdCategory) => {
categoryData.children.forEach((channelData) => {
(0, util_1.loadChannel)(channelData, guild, createdCategory, options);
resolve(true);
});
});
}));
});
backupData.channels.others.forEach((channelData) => {
loadChannelPromises.push((0, util_1.loadChannel)(channelData, guild, null, options));
});
return Promise.all(loadChannelPromises);
};
exports.loadChannels = loadChannels;
/**
* Restore the afk configuration
*/
const loadAFK = (guild, backupData) => {
const afkPromises = [];
if (backupData.afk) {
afkPromises.push(guild.setAFKChannel(guild.channels.cache.find((ch) => ch.name === backupData.afk.name && ch.type === discord_js_1.ChannelType.GuildVoice)));
afkPromises.push(guild.setAFKTimeout(backupData.afk.timeout));
}
return Promise.all(afkPromises);
};
exports.loadAFK = loadAFK;
/**
* Restore guild emojis
*/
const loadEmojis = async (guild, backupData) => {
const emojis = [];
const maxEmojis = guild.premiumTier === 0 ? 50 : guild.premiumTier === 1 ? 100 : guild.premiumTier === 2 ? 150 : 250;
for (let i = 0; i < Math.min(backupData.emojis.length, maxEmojis); i++) {
const emojiData = backupData.emojis[i];
try {
let emoji;
if (emojiData.url) {
emoji = await guild.emojis.create({
name: emojiData.name.slice(0, 32),
attachment: emojiData.url
});
}
else if (emojiData.base64) {
emoji = await guild.emojis.create({
name: emojiData.name.slice(0, 32),
attachment: Buffer.from(emojiData.base64, 'base64')
});
}
if (emoji) {
emojis.push(emoji);
}
await new Promise((resolve) => setTimeout(resolve, 500));
}
catch (error) {
// Failed to create emoji - skipping
}
}
return emojis;
};
exports.loadEmojis = loadEmojis;
/**
* Restore guild bans
*/
const loadBans = async (guild, backupData) => {
const bannedUsers = [];
for (const banData of backupData.bans) {
try {
await guild.members.ban(banData.id, {
reason: banData.reason || 'Restored from backup'
});
bannedUsers.push(banData.id);
await new Promise((resolve) => setTimeout(resolve, 1000));
}
catch (error) {
// Failed to ban user - skipping
}
}
return bannedUsers;
};
exports.loadBans = loadBans;
/**
* Restore embedChannel configuration
*/
const loadEmbedChannel = (guild, backupData) => {
const embedChannelPromises = [];
if (backupData.widget.channel) {
embedChannelPromises.push(guild.setWidgetSettings({
enabled: backupData.widget.enabled,
channel: guild.channels.cache.find((ch) => ch.name === backupData.widget.channel)
}));
}
return Promise.all(embedChannelPromises);
};
exports.loadEmbedChannel = loadEmbedChannel;