UNPKG

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
"use strict"; 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;