Research
Security News
Malicious npm Packages Inject SSH Backdoors via Typosquatted Libraries
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
discordio-backup
Advanced tools
Note: this module uses recent discordjs features and requires discord.js v14.
Discordio Backup is a powerful Node.js module that allows you to easily manage discord server backups.
backup#delete()
removed in favor of backup#remove()
npm install discordio-backup
Create a backup for the server specified in the parameters!
/**
* @param {Guild} [Guild] - The discord server you want to backup
* @param {object} [options] - The backup options
*/
const backup = require("discordio-backup");
backup.create(Guild, options).then((backupData) => {
console.log(backupData.id); // NSJH2
});
Click here to learn more about backup options.
Allows you to load a backup on a Discord server!
/**
* @param {string} [backupID] - The ID of the backup that you want to load
* @param {Guild} [Guild] - The discord server on which you want to load the backup
*/
const backup = require("discordio-backup");
backup.load(backupID, Guild).then(() => {
backup.remove(backupID); // When the backup is loaded, it's recommended to delete it
});
Fetches information from a backup
/**
* @param {string} [backupID] - The ID of the backup to fetch
*/
const backup = require("discordio-backup");
backup.fetch(backupID).then((backupInfos) => {
console.log(backupInfos);
/*
{
id: "BC5qo",
size: 0.05
data: {BackupData}
}
*/
});
Warn: once the backup is removed, it is impossible to recover it!
/**
* @param {string} [backupID] - The ID of the backup to remove
*/
const backup = require("discordio-backup");
backup.remove(backupID);
Note: backup#list()
simply returns an array of IDs, you must fetch the ID to get complete information.
const backup = require("discordio-backup");
backup.list().then((backups) => {
console.log(backups); // Expected Output [ "BC5qo", "Jdo91", ...]
});
Updates the storage folder to another
const backup = require("discordio-backup");
backup.setStorageFolder(__dirname+"/backups/");
await backup.create(guild); // Backup created in ./backups/
backup.setStorageFolder(__dirname+"/my-backups/");
await backup.create(guild); // Backup created in ./my-backups/
You can use more options for backup creation:
const backup = require("discordio-backup");
backup.create(guild, {
maxMessagesPerChannel: 10,
jsonSave: false,
jsonBeautify: true,
doNotBackup: [ "roles", "channels", "emojis", "bans" ],
saveImages: "base64"
});
maxMessagesPerChannel: Maximum of messages to save in each channel. "0" won't save any messages.
jsonSave: Whether to save the backup into a json file. You will have to save the backup data in your own db to load it later.
jsonBeautify: Whether you want your json backup pretty formatted.
doNotBackup: Things you don't want to backup. Available items are: roles
, channels
, emojis
, bans
.
saveImages: How to save images like guild icon and emojis. Set to "url" by default, restoration may not work if the old server is deleted. So, url
is recommended if you want to clone a server (or if you need very light backups), and base64
if you want to backup a server. Save images as base64 creates heavier backups.
As you can see, you're able to load a backup from your own data instead of from an ID:
const backup = require("discordio-backup");
backup.load(backupData, guild, {
clearGuildBeforeRestore: true
});
clearGuildBeforeRestore: Whether to clear the guild (roles, channels, etc... will be deleted) before the backup restoration (recommended).
maxMessagesPerChannel: Maximum of messages to restore in each channel. "0" won't restore any messages.
// Load modules
const { Client, PermissionFlagsBits, EmbedBuilder, GatewayIntentBits } = require("discord.js")
const backup = require("discordio-backup")
const client = new Client({ intents: [Discord.GatewayIntentBits.Guilds, Discord.GatewayIntentBits.GuildMessages, Discord.GatewayIntentBits.MessageContent ]})
const settings = {
prefix: "b!",
token: "YOURTOKEN"
};
client.once("ready", () => {
console.log("I'm ready !");
});
client.on("messageCreate", async message => {
// This reads the first part of your message behind your prefix to see which command you want to use.
let command = message.content.toLowerCase().slice(settings.prefix.length).split(" ")[0];
// These are the arguments behind the commands.
let args = message.content.split(" ").slice(1);
// If the message does not start with your prefix return.
// If the user that types a message is a bot account return.
// If the command comes from DM return.
if (!message.content.startsWith(settings.prefix) || message.author.bot || !message.guild) return;
if(command === "create"){
// Check member permissions
if(!message.member.permissions.has(Discord.PermissionFlagsBits.Administrator)){
return message.reply(":x: | You must be an administrator of this server to request a backup!");
}
// Create the backup
backup.create(message.guild, {
jsonBeautify: true
}).then((backupData) => {
// And send informations to the backup owner
message.author.send("The backup has been created! To load it, type this command on the server of your choice: `"+settings.prefix+"load "+backupData.id+"`!").catch(e => console.error(e));
message.channel.send(":white_check_mark: Backup successfully created. The backup ID was sent in dm!");
});
}
if(command === "load"){
// Check member permissions
if(!message.member.permissions.has(Discord.PermissionFlagsBits.Administrator)){
return message.reply(":x: | You must be an administrator of this server to load a backup!");
}
let backupID = args[0];
if(!backupID){
return message.channel.send(":x: | You must specify a valid backup ID!");
}
// Fetching the backup to know if it exists
backup.fetch(backupID).then(async () => {
// If the backup exists, request for confirmation
message.channel.send(":warning: | When the backup is loaded, all the channels, roles, etc. will be replaced! Type `-confirm` to confirm!");
const filter = m => (m.author.id === message.author.id) && (m.content === "-confirm");
await message.channel.awaitMessages({
filter,
max: 1,
time: 20000,
errors: ["time"]
}).catch((err) => {
// if the author of the commands does not confirm the backup loading
return message.channel.send(":x: | Time's up! Cancelled backup loading!");
});
// When the author of the command has confirmed that he wants to load the backup on his server
message.author.send(":white_check_mark: | Start loading the backup!").catch(e => console.error(e));
// Load the backup
backup.load(backupID, message.guild).then(() => {
// When the backup is loaded, delete them from the server
backup.remove(backupID);
}).catch((err) => {
// If an error occurred
return message.author.send(":x: | Sorry, an error occurred... Please check that I have administrator permissions!");
});
}).catch((err) => {
console.log(err);
// if the backup wasn't found
return message.channel.send(":x: | No backup found for `"+backupID+"`!");
});
}
if(command === "infos"){
let backupID = args[0];
if(!backupID){
return message.channel.send(":x: | You must specify a valid backup ID!");
}
// Fetch the backup
backup.fetch(backupID).then((backupInfos) => {
const date = new Date(backupInfos.data.createdTimestamp);
const yyyy = date.getFullYear().toString(), mm = (date.getMonth()+1).toString(), dd = date.getDate().toString();
const formatedDate = `${yyyy}/${(mm[1]?mm:"0"+mm[0])}/${(dd[1]?dd:"0"+dd[0])}`;
let embed = new Discord.EmbedBuilder()
.setAuthor({ name: "Backup Informations" })
// Display the backup ID
.addFields(
// Display the backup ID
{ name: 'Backup ID', value: backupInfos.id },
// Displays the server from which this backup comes
{ name: 'Server ID', value: backupInfos.data.guildID },
// Display the size (in KB) of the backup
{ name: 'Size', value: `${backupInfos.size} kb` },
// Display when the backup was created
{ name: 'Created at', value: formatedDate }
)
.setColor(0xFF0000);
message.channel.send({ embeds: [embed] });
}).catch((err) => {
// if the backup wasn't found
return message.channel.send(":x: | No backup found for `"+backupID+"`!");
});
}
});
//Your secret token to log the bot in. (never share this to anyone!)
client.login(settings.token);
Here are all things that can be restored with discordio-backup
:
Example of things that can't be restored:
FAQs
A complete framework to facilitate guild backup!
The npm package discordio-backup receives a total of 20 weekly downloads. As such, discordio-backup popularity was classified as not popular.
We found that discordio-backup demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
Security News
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
Security News
In this segment of the Risky Business podcast, Feross Aboukhadijeh and Patrick Gray discuss the challenges of tracking malware discovered in open source softare.