diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..093e71b3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,15 @@
+.idea
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+.mvn/wrapper/maven-wrapper.jar
+.project
+.classpath
+
+start-server.sh
\ No newline at end of file
diff --git a/README.md b/README.md
index 044e6513..8174fde9 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,32 @@
+
+
+
+
# ServerBackup
-SourceCode of version 'v2.9.6'
+ServerBackup is a Minecraft mod that enables server administrators to create backups of worlds or the entire server. It provides convenient functionality for safeguarding your Minecraft server's data.
+Features
+
+* Create backups of individual worlds or the entire server
+* Customizable backup schedules and intervals
+* Multithreaded backup process for improved performance
+* Easy-to-use configuration options
+
+## Usage
+
+* Install the ServerBackup mod on your Minecraft server.
+* Configure the backup settings in the mod's configuration file.
+* Run the server to automatically create backups based on your specified schedule.
+
+You can also check the [usage guide](https://github.com/P529/ServerBackup/wiki/Usage-guide)
+
+## Contributing
-Website: https://server-backup.net/
+Contributions, bug reports, and feature requests are welcome. Please submit them through the GitHub repository or join our Discord server for support and suggestions.
+Links
-Spigot: https://www.spigotmc.org/resources/world-server-backup-1-8-1-18-x-multithreaded.79320/
+* Website: [ServerBackup Website](https://server-backup.net/)
+* Spigot page: [ServerBackup on Spigot](https://www.spigotmc.org/resources/server-backup-ingame-dropbox-ftp-backup-1-8-1-19-multithreaded.79320/)
+* Discord server: [ServerBackup Discord](https://discord.gg/rNzngsCWFC)
-Discord server for support or suggestions: https://discord.gg/rNzngsCWFC
+If you have any questions or need further assistance, please feel free to reach out to us on Discord or through the GitHub repository.
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 9ab65e14..a390113d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,8 +9,8 @@
2.9.6
- 16
- 16
+ 1.8
+ 1.8
UTF-8
@@ -35,6 +35,11 @@
dropbox-core-sdk
5.4.4
+
+ com.github.lookfirst
+ sardine
+ 5.10
+
commons-io
commons-io
@@ -51,10 +56,15 @@
3.0.2
compile
-
+
+
+ src/main/resources
+ true
+
+
org.apache.maven.plugins
@@ -64,7 +74,7 @@
org.bstats
- de.seblii.serverbackup
+ main.java.serverbackup
diff --git a/src/de/seblii/serverbackup/DynamicBackup.java b/src/de/seblii/serverbackup/DynamicBackup.java
deleted file mode 100644
index eb2f22c5..00000000
--- a/src/de/seblii/serverbackup/DynamicBackup.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package de.seblii.serverbackup;
-
-import org.bukkit.Bukkit;
-import org.bukkit.Chunk;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.player.PlayerJoinEvent;
-import org.bukkit.event.player.PlayerMoveEvent;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.logging.Level;
-
-public class DynamicBackup implements Listener {
-
- List chunks = Collections.synchronizedList(new ArrayList<>());
- public boolean isSaving = false;
-
- @EventHandler
- public void onPlayerMove(PlayerMoveEvent e) {
- if (ServerBackup.getInstance().getConfig().getBoolean("DynamicBackup")) {
- if (e.getFrom().getChunk() != e.getTo().getChunk()) {
- int regX = e.getTo().getChunk().getX() >> 5;
- int regZ = e.getTo().getChunk().getZ() >> 5;
-
- Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), new Runnable() {
-
- @Override
- public void run() {
- String chunkInf = "Data." + e.getTo().getWorld().getName() + ".Chunk." + "r." + regX + "."
- + regZ + ".mca";
-
- if (!Bukkit.getWorldContainer().toString().equalsIgnoreCase(".")) {
- chunkInf = "Data." + Bukkit.getWorldContainer() + "\\" + e.getTo().getWorld().getName()
- + ".Chunk." + "r." + regX + "." + regZ + ".mca";
- }
-
- if (!chunks.contains(e.getTo().getChunk())) {
- if (!ServerBackup.getInstance().bpInf.contains(chunkInf)) {
- chunks.add(e.getTo().getChunk());
- ServerBackup.getInstance().bpInf.set(chunkInf, chunks.get(chunks.size() - 1).getX());
- ServerBackup.getInstance().bpInf.set(chunkInf, chunks.get(chunks.size() - 1).getZ());
-
- saveChanges();
- try {
- chunks.remove(e.getTo().getChunk());
- } catch (ArrayIndexOutOfBoundsException ex) {
- }
- } else {
- chunks.add(e.getTo().getChunk());
- ServerBackup.getInstance().bpInf.set(chunkInf, chunks.get(chunks.size() - 1).getWorld());
-
- saveChanges();
- try {
- chunks.remove(e.getTo().getChunk());
- } catch (ArrayIndexOutOfBoundsException ex) {
- }
- }
- }
- }
-
- });
- }
- }
- }
-
- public void saveChanges() {
- if (!isSaving) {
- isSaving = true;
-
- Bukkit.getScheduler().runTaskLaterAsynchronously(ServerBackup.getInstance(), new Runnable() {
-
- @Override
- public void run() {
- ServerBackup.getInstance().saveBpInf();
- if (ServerBackup.getInstance().getConfig().getBoolean("SendLogMessages")) {
- Bukkit.getLogger().log(Level.INFO, "DynamicBP: file saved.");
- }
-
- isSaving = false;
- }
-
- }, 20 * 5);
- }
- }
-
- @EventHandler
- public void onJoin(PlayerJoinEvent e) {
- if (ServerBackup.getInstance().getConfig().getBoolean("DynamicBackup")) {
- Player p = e.getPlayer();
-
- int regX = p.getLocation().getChunk().getX() >> 5;
- int regZ = p.getLocation().getChunk().getZ() >> 5;
-
- Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), new Runnable() {
-
- @Override
- public void run() {
- String chunkInf = "Data." + p.getLocation().getWorld().getName() + ".Chunk." + "r." + regX + "."
- + regZ + ".mca";
-
- if (!Bukkit.getWorldContainer().toString().equalsIgnoreCase(".")) {
- chunkInf = "Data." + Bukkit.getWorldContainer() + "\\" + p.getLocation().getWorld().getName()
- + ".Chunk." + "r." + regX + "." + regZ + ".mca";
- }
-
- if (!chunks.contains(p.getLocation().getChunk())) {
- if (!ServerBackup.getInstance().bpInf.contains(chunkInf)) {
- chunks.add(p.getLocation().getChunk());
- ServerBackup.getInstance().bpInf.set(chunkInf + ".X", p.getLocation().getChunk().getX());
- ServerBackup.getInstance().bpInf.set(chunkInf + ".Z", p.getLocation().getChunk().getZ());
-
- ServerBackup.getInstance().saveBpInf();
- chunks.remove(p.getLocation().getChunk());
- } else {
- chunks.add(p.getLocation().getChunk());
- ServerBackup.getInstance().bpInf.set(chunkInf, p.getLocation().getChunk().getWorld());
-
- ServerBackup.getInstance().saveBpInf();
- chunks.remove(p.getLocation().getChunk());
- }
- }
- }
-
- });
- }
- }
-
-}
diff --git a/src/de/seblii/serverbackup/commands/SBCommand.java b/src/de/seblii/serverbackup/commands/SBCommand.java
deleted file mode 100644
index 966755b6..00000000
--- a/src/de/seblii/serverbackup/commands/SBCommand.java
+++ /dev/null
@@ -1,781 +0,0 @@
-package de.seblii.serverbackup.commands;
-
-import com.google.common.io.Files;
-import de.seblii.serverbackup.BackupManager;
-import de.seblii.serverbackup.utils.DropboxManager;
-import de.seblii.serverbackup.utils.FtpManager;
-import de.seblii.serverbackup.ServerBackup;
-import de.seblii.serverbackup.ZipManager;
-import net.md_5.bungee.api.chat.ClickEvent;
-import net.md_5.bungee.api.chat.ComponentBuilder;
-import net.md_5.bungee.api.chat.HoverEvent;
-import net.md_5.bungee.api.chat.TextComponent;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.FilenameUtils;
-import org.bukkit.Bukkit;
-import org.bukkit.World;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandExecutor;
-import org.bukkit.command.CommandSender;
-import org.bukkit.command.TabCompleter;
-import org.bukkit.entity.Player;
-import org.bukkit.util.StringUtil;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.logging.Level;
-
-public class SBCommand implements CommandExecutor, TabCompleter {
-
- private ServerBackup backup = ServerBackup.getInstance();
-
- @Override
- public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
-
- if (sender.hasPermission("backup.admin")) {
- if (args.length == 1) {
- if (args[0].equalsIgnoreCase("shutdown")) {
- if (backup.shutdownProgress) {
- backup.shutdownProgress = false;
-
- sender.sendMessage(backup.processMessage("Command.Shutdown.Cancel"));
- } else {
- ServerBackup.getInstance().shutdownProgress = true;
-
- sender.sendMessage(backup.processMessage("Command.Shutdown.Start"));
- }
- } else if (args[0].equalsIgnoreCase("list")) {
- Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
- File[] backups = new File(ServerBackup.getInstance().backupDestination).listFiles();
-
- if (backups.length == 0
- || backups.length == 1 && backups[0].getName().equalsIgnoreCase("Files")) {
- sender.sendMessage(backup.processMessage("Error.NoBackups"));
-
- return;
- }
-
- Arrays.sort(backups);
-
- if ((backups.length - 1) < 10) {
- sender.sendMessage(
- "----- Backup 1-" + (backups.length - 1) + "/" + (backups.length - 1) + " -----");
- } else {
- sender.sendMessage("----- Backup 1-10/" + (backups.length - 1) + " -----");
- }
- sender.sendMessage("");
-
- for (int i = 0; i < (backups.length - 1) && i < 10; i++) {
- if (backups[i].getName().equalsIgnoreCase("Files")) {
- i--;
- continue;
- }
-
- double fileSize = (double) FileUtils.sizeOf(backups[i]) / 1000 / 1000;
- fileSize = Math.round(fileSize * 100.0) / 100.0;
-
- if (sender instanceof Player) {
- Player p = (Player) sender;
-
- TextComponent msg = new TextComponent("§7[" + Integer.valueOf(i + 1) + "] §r"
- + backups[i].getName() + " §7[" + fileSize + "MB]");
- msg.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
- new ComponentBuilder("Click to get Backup name").create()));
- msg.setClickEvent(
- new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, backups[i].getName()));
-
- p.spigot().sendMessage(msg);
- } else {
- sender.sendMessage(backups[i].getName());
- }
- }
-
- int maxPages = (backups.length - 1) / 10;
-
- if ((backups.length - 1) % 10 != 0) {
- maxPages++;
- }
-
- sender.sendMessage("");
- sender.sendMessage("-------- Page 1/" + maxPages + " --------");
- });
- } else if (args[0].equalsIgnoreCase("reload") || args[0].equalsIgnoreCase("rl")) {
- ServerBackup.getInstance().reloadConfig();
-
- ServerBackup.getInstance().stopTimer();
- ServerBackup.getInstance().startTimer();
-
- String oldDes = ServerBackup.getInstance().backupDestination;
-
- if (!oldDes
- .equalsIgnoreCase(ServerBackup.getInstance().getConfig().getString("BackupDestination"))) {
- ServerBackup.getInstance().backupDestination = ServerBackup.getInstance().getConfig()
- .getString("BackupDestination");
-
- ServerBackup.getInstance().getLogger().log(Level.INFO,
- "ServerBackup: Backup destination [" + oldDes + " >> "
- + ServerBackup.getInstance().backupDestination + "] updated successfully.");
- }
-
- if(ServerBackup.getInstance().cloudInfo.exists()){
- ServerBackup.getInstance().saveCloud();
- }
-
- ServerBackup.getInstance().loadFiles();
-
- sender.sendMessage(backup.processMessage("Command.Reload"));
- } else if (args[0].equalsIgnoreCase("tasks") || args[0].equalsIgnoreCase("task")) {
- if (BackupManager.tasks.size() > 0) {
- sender.sendMessage(backup.processMessage("Command.Tasks.Header"));
-
- for (String task : BackupManager.tasks) {
- sender.sendMessage(task);
- }
-
- sender.sendMessage(backup.processMessage("Command.Tasks.Footer"));
- } else {
- sender.sendMessage(backup.processMessage("Error.NoTasks"));
- }
- } else {
- sendHelp(sender);
- }
- }
-
- if (args.length == 2) {
- if (args[0].equalsIgnoreCase("list")) {
- Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
- File[] backups = new File(ServerBackup.getInstance().backupDestination + "").listFiles();
-
- if (backups.length == 0
- || backups.length == 1 && backups[0].getName().equalsIgnoreCase("Files")) {
- sender.sendMessage(backup.processMessage("Error.NoBackups"));
-
- return;
- }
-
- Arrays.sort(backups);
-
- try {
- int page = Integer.valueOf(args[1]);
-
- if ((backups.length - 1) < page * 10 - 9) {
- sender.sendMessage("Try a lower value.");
-
- return;
- }
-
- if ((backups.length - 1) <= page * 10 && (backups.length - 1) >= page * 10 - 10) {
- sender.sendMessage("----- Backup " + Integer.valueOf(page * 10 - 9) + "-"
- + (backups.length - 1) + "/" + (backups.length - 1) + " -----");
- } else {
- sender.sendMessage("----- Backup " + Integer.valueOf(page * 10 - 9) + "-"
- + Integer.valueOf(page * 10) + "/" + (backups.length - 1) + " -----");
- }
- sender.sendMessage("");
-
- for (int i = page * 10 - 10; i < (backups.length - 1) && i < page * 10; i++) {
- if (backups[0].getName().equalsIgnoreCase("Files")) {
- i--;
- continue;
- }
-
- double fileSize = (double) FileUtils.sizeOf(backups[i]) / 1000 / 1000;
- fileSize = Math.round(fileSize * 100.0) / 100.0;
-
- if (sender instanceof Player) {
- Player p = (Player) sender;
-
- TextComponent msg = new TextComponent("§7[" + Integer.valueOf(i + 1) + "] §r"
- + backups[i].getName() + " §7[" + fileSize + "MB]");
- msg.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
- new ComponentBuilder("Click to get Backup name").create()));
- msg.setClickEvent(
- new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, backups[i].getName()));
-
- p.spigot().sendMessage(msg);
- } else {
- sender.sendMessage(backups[i].getName());
- }
- }
-
- int maxPages = (backups.length - 1) / 10;
-
- if ((backups.length - 1) % 10 != 0) {
- maxPages++;
- }
-
- sender.sendMessage("");
- sender.sendMessage("-------- Page " + page + "/" + maxPages + " --------");
- } catch (Exception e) {
- sender.sendMessage(backup.processMessage("Error.NotANumber").replaceAll("%input%", args[1]));
- }
- });
- } else if (args[0].equalsIgnoreCase("ftp")) {
- if (args[1].equalsIgnoreCase("list")) {
- Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
- FtpManager ftpm = new FtpManager(sender);
-
- List backups = ftpm.getFtpBackupList();
-
- if (backups.size() == 0) {
- sender.sendMessage(backup.processMessage("Error.NoFtpBackups"));
-
- return;
- }
-
- if (backups.size() < 10) {
- sender.sendMessage(
- "----- Ftp-Backup 1-" + backups.size() + "/" + backups.size() + " -----");
- } else {
- sender.sendMessage("----- Ftp-Backup 1-10/" + backups.size() + " -----");
- }
- sender.sendMessage("");
-
- for (int i = 0; i < backups.size() && i < 10; i++) {
- if (sender instanceof Player) {
- Player p = (Player) sender;
- TextComponent msg = new TextComponent(backups.get(i));
- msg.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
- new ComponentBuilder("Click to get Backup name").create()));
- msg.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND,
- backups.get(i).split(" ")[1]));
-
- p.spigot().sendMessage(msg);
- } else {
- sender.sendMessage(backups.get(i));
- }
- }
-
- int maxPages = backups.size() / 10;
-
- if (backups.size() % 10 != 0) {
- maxPages++;
- }
-
- sender.sendMessage("");
- sender.sendMessage("--------- Page 1/" + maxPages + " ---------");
- });
- }
- } else if (args[0].equalsIgnoreCase("zip")) {
- String filePath = args[1];
-
- if (args[1].contains(".zip")) {
- sender.sendMessage(backup.processMessage("Error.AlreadyZip").replaceAll("%file%", args[1]));
- return false;
- }
-
- File file = new File(ServerBackup.getInstance().backupDestination + "//" + filePath);
- File newFile = new File(ServerBackup.getInstance().backupDestination + "//" + filePath + ".zip");
-
- if (!newFile.exists()) {
- sender.sendMessage(backup.processMessage("Command.Zip.Header"));
-
- if (file.exists()) {
- try {
- ZipManager zm = new ZipManager(file.getPath(), newFile.getPath(), sender, true, false,
- true);
-
- zm.zip();
- } catch (IOException e) {
- e.printStackTrace();
- }
- } else {
- sender.sendMessage(backup.processMessage("Error.NoBackupFound").replaceAll("%file%", args[1]));
- }
- } else {
- sender.sendMessage(backup.processMessage("Error.FolderExists").replaceAll("%file%", args[1]));
- }
- } else if (args[0].equalsIgnoreCase("unzip")) {
- String filePath = args[1];
-
- if (!args[1].contains(".zip")) {
- sender.sendMessage(backup.processMessage("Error.NotAZip").replaceAll("%file%", args[1]));
- return false;
- }
-
- File file = new File(ServerBackup.getInstance().backupDestination + "//" + filePath);
- File newFile = new File(
- ServerBackup.getInstance().backupDestination + "//" + filePath.replaceAll(".zip", ""));
-
- if (!newFile.exists()) {
- sender.sendMessage(backup.processMessage("Command.Unzip.Header"));
-
- if (file.exists()) {
- ZipManager zm = new ZipManager(file.getPath(),
- ServerBackup.getInstance().backupDestination + "//" + newFile.getName(), sender,
- false, true, true);
-
- zm.unzip();
- } else {
- sender.sendMessage(backup.processMessage("Error.NoBackupFound").replaceAll("%file%", args[1]));
- }
- } else {
- sender.sendMessage(backup.processMessage("Error.ZipExists").replaceAll("%file%", args[1]));
- }
- } else if (args[0].equalsIgnoreCase("delete") || args[0].equalsIgnoreCase("remove")) {
- if (args[1].equalsIgnoreCase("Files")) {
- sender.sendMessage("You can not delete the 'Files' backup folder.");
-
- return false;
- }
-
- BackupManager bm = new BackupManager(args[1], sender, true);
-
- bm.removeBackup();
- } else if (args[0].equalsIgnoreCase("search")) {
- Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
- File[] backups = new File(ServerBackup.getInstance().backupDestination + "").listFiles();
-
- if (backups.length == 0) {
- sender.sendMessage(backup.processMessage("Error.NoBackups"));
-
- return;
- }
-
- List backupsMatch = new ArrayList<>();
-
- for (int i = 0; i < backups.length; i++) {
- if (backups[i].getName().contains(args[1])) {
- backupsMatch.add(backups[i]);
- }
- }
-
- if (backupsMatch.size() == 0) {
- sender.sendMessage(backup.processMessage("NoBackupSearch").replaceAll("%input%", args[1]));
-
- return;
- }
-
- Collections.sort(backupsMatch);
-
- int count = 1;
-
- if (backupsMatch.size() < 10) {
- sender.sendMessage(
- "----- Backup 1-" + backupsMatch.size() + "/" + backupsMatch.size() + " -----");
- } else {
- sender.sendMessage("----- Backup 1-10/" + backupsMatch.size() + " -----");
- }
- sender.sendMessage("");
-
- for (File file : backupsMatch) {
- if (count <= 10 && count <= backupsMatch.size()) {
- double fileSize = (double) FileUtils.sizeOf(file) / 1000 / 1000;
- fileSize = Math.round(fileSize * 100.0) / 100.0;
-
- if (sender instanceof Player) {
- Player p = (Player) sender;
-
- TextComponent msg = new TextComponent("§7[" + Integer.valueOf(count) + "] §r"
- + file.getName() + " §7[" + fileSize + "MB]");
- msg.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
- new ComponentBuilder("Click to get Backup name").create()));
- msg.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND,
- "/backup remove " + file.getName()));
-
- p.spigot().sendMessage(msg);
- } else {
- sender.sendMessage(file.getName());
- }
- }
- count++;
- }
-
- int maxPages = backupsMatch.size() / 10;
-
- if (backupsMatch.size() % 10 != 0) {
- maxPages++;
- }
-
- sender.sendMessage("");
- sender.sendMessage("-------- Page 1/" + maxPages + " --------");
- });
- }
- }
-
- if (args.length >= 2) {
- if (args.length == 3) {
- if (args[0].equalsIgnoreCase("search")) {
- Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
- File[] backups = new File(ServerBackup.getInstance().backupDestination + "").listFiles();
-
- if (backups.length == 0
- || backups.length == 1 && backups[0].getName().equalsIgnoreCase("Files")) {
- sender.sendMessage(backup.processMessage("Error.NoBackups"));
-
- return;
- }
-
- List backupsMatch = new ArrayList<>();
-
- for (int i = 0; i < backups.length; i++) {
- if (backups[i].getName().contains(args[1])) {
- backupsMatch.add(backups[i]);
- }
- }
-
- if (backupsMatch.size() == 0) {
- sender.sendMessage(backup.processMessage("NoBackupSearch").replaceAll("%input%", args[1]));
-
- return;
- }
-
- Collections.sort(backupsMatch);
-
- try {
- int page = Integer.valueOf(args[2]);
-
- if (backups.length < page * 10 - 9) {
- sender.sendMessage("Try a lower value.");
-
- return;
- }
-
- int count = page * 10 - 9;
-
- if (backupsMatch.size() <= page * 10 && backupsMatch.size() >= page * 10 - 10) {
- sender.sendMessage("----- Backup " + Integer.valueOf(page * 10 - 9) + "-"
- + backupsMatch.size() + "/" + backupsMatch.size() + " -----");
- } else {
- sender.sendMessage("----- Backup " + Integer.valueOf(page * 10 - 9) + "-"
- + Integer.valueOf(page * 10) + "/" + backupsMatch.size() + " -----");
- }
- sender.sendMessage("");
-
- for (File file : backupsMatch) {
- if (count <= page * 10 && count <= backupsMatch.size()) {
- double fileSize = (double) FileUtils.sizeOf(file) / 1000 / 1000;
- fileSize = Math.round(fileSize * 100.0) / 100.0;
-
- if (sender instanceof Player) {
- Player p = (Player) sender;
-
- TextComponent msg = new TextComponent("§7[" + Integer.valueOf(count)
- + "] §r" + file.getName() + " §7[" + fileSize + "MB]");
- msg.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
- new ComponentBuilder("Click to get Backup name").create()));
- msg.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND,
- "/backup remove " + file.getName()));
-
- p.spigot().sendMessage(msg);
- } else {
- sender.sendMessage(file.getName());
- }
- }
- count++;
- }
-
- int maxPages = backupsMatch.size() / 10;
-
- if (backupsMatch.size() % 10 != 0) {
- maxPages++;
- }
-
- sender.sendMessage("");
- sender.sendMessage("-------- Page " + page + "/" + maxPages + " --------");
- } catch (Exception e) {
- sender.sendMessage(backup.processMessage("Error.NotANumber").replaceAll("%input%", args[2]));
- }
- });
- } else if (args[0].equalsIgnoreCase("ftp")) {
- if (args[1].equalsIgnoreCase("list")) {
- Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
- FtpManager ftpm = new FtpManager(sender);
-
- List backups = ftpm.getFtpBackupList();
-
- if (backups.size() == 0) {
- sender.sendMessage(backup.processMessage("Error.NoFtpBackups"));
-
- return;
- }
-
- try {
- int page = Integer.valueOf(args[2]);
-
- if (backups.size() < page * 10 - 9) {
- sender.sendMessage("Try a lower value.");
-
- return;
- }
-
- if (backups.size() <= page * 10 && backups.size() >= page * 10 - 10) {
- sender.sendMessage("----- Ftp-Backup " + Integer.valueOf(page * 10 - 9) + "-"
- + backups.size() + "/" + backups.size() + " -----");
- } else {
- sender.sendMessage("----- Ftp-Backup " + Integer.valueOf(page * 10 - 9) + "-"
- + Integer.valueOf(page * 10) + "/" + backups.size() + " -----");
- }
- sender.sendMessage("");
-
- for (int i = page * 10 - 10; i < backups.size() && i < page * 10; i++) {
- if (sender instanceof Player) {
- Player p = (Player) sender;
-
- TextComponent msg = new TextComponent(backups.get(i));
- msg.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
- new ComponentBuilder("Click to get Backup name").create()));
- msg.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND,
- backups.get(i).split(" ")[1]));
-
- p.spigot().sendMessage(msg);
- } else {
- sender.sendMessage(backups.get(i));
- }
- }
-
- int maxPages = backups.size() / 10;
-
- if (backups.size() % 10 != 0) {
- maxPages++;
- }
-
- sender.sendMessage("");
- sender.sendMessage("--------- Page " + page + "/" + maxPages + " ---------");
- } catch (Exception e) {
- sender.sendMessage(backup.processMessage("Error.NotANumber").replaceAll("%input%", args[1]));
- }
- });
- } else if (args[1].equalsIgnoreCase("download")) {
- Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
- FtpManager ftpm = new FtpManager(sender);
-
- ftpm.downloadFileFromFtp(args[2]);
- });
- } else if (args[1].equalsIgnoreCase("upload")) {
- Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
- FtpManager ftpm = new FtpManager(sender);
-
- ftpm.uploadFileToFtp(args[2], false);
- });
- }
- } else if(args[0].equalsIgnoreCase("dropbox")) {
- if(args[1].equalsIgnoreCase("upload")) {
- Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
- DropboxManager dm = new DropboxManager(sender);
-
- dm.uploadToDropbox(args[2]);
- });
- }
- }
- }
-
- if (args[0].equalsIgnoreCase("create")) {
- String fileName = args[1];
-
- boolean fullBackup = false;
- if (args.length > 2) {
- for (int i = 2; i < args.length; i++) {
- if (args[i].equalsIgnoreCase("-full")) {
- fullBackup = true;
- } else {
- fileName = fileName + " " + args[i];
- }
- }
- }
-
- File file = new File(fileName);
-
- if (!file.isDirectory() && !args[1].equalsIgnoreCase("@server")) {
- Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), new Runnable() {
-
- @Override
- public void run() {
- try {
- File des = new File(ServerBackup.getInstance().backupDestination + "//Files//"
- + file.getName().replaceAll("/", "-"));
-
- if (des.exists()) {
- des = new File(des.getPath()
- .replaceAll("." + FilenameUtils.getExtension(des.getName()), "") + " "
- + String.valueOf(System.currentTimeMillis() / 1000) + "."
- + FilenameUtils.getExtension(file.getName()));
- }
-
- Files.copy(file, des);
-
- sender.sendMessage(backup.processMessage("Info.BackupFinished").replaceAll("%file%", file.getName()));
- } catch (IOException e) {
- sender.sendMessage(backup.processMessage("Error.BackupFailed").replaceAll("%file%", file.getName()));
- e.printStackTrace();
- }
- }
-
- });
- } else {
- BackupManager bm = new BackupManager(fileName, sender, fullBackup);
-
- bm.createBackup();
- }
- }
- } else if (args.length == 0) {
- sendHelp(sender);
- }
- } else {
- sender.sendMessage(backup.processMessage("Error.NoPermission"));
- }
-
- return false;
- }
-
- private void sendHelp(CommandSender sender) {
- sender.sendMessage("/backup reload - reloads the config");
- sender.sendMessage("");
- sender.sendMessage("/backup list - shows a list of 10 backups");
- sender.sendMessage("");
- sender.sendMessage(
- "/backup search - shows a list of 10 backups that contain the given search argument");
- sender.sendMessage("");
- sender.sendMessage("/backup create - creates a new backup of a world");
- sender.sendMessage("");
- sender.sendMessage("/backup remove - removes an existing backup");
- sender.sendMessage("");
- sender.sendMessage("/backup zip - zipping folder");
- sender.sendMessage("");
- sender.sendMessage("/backup unzip - unzipping file");
- sender.sendMessage("");
- sender.sendMessage("/backup ftp - download, upload or list ftp backup files");
- sender.sendMessage("");
- sender.sendMessage("/backup dropbox upload - upload a backup to dropbox");
- sender.sendMessage("");
- sender.sendMessage("/backup shutdown - shut downs the server after backup tasks are finished");
- }
-
- @Override
- public List onTabComplete(CommandSender sender, Command cmd, String label, String[] args) {
- List completions = new ArrayList<>();
- List commands = new ArrayList<>();
-
- if (sender.hasPermission("backup.admin")) {
- if (args.length == 1) {
- commands.add("reload");
- commands.add("list");
- commands.add("search");
- commands.add("create");
- commands.add("remove");
- commands.add("zip");
- commands.add("unzip");
- commands.add("ftp");
- commands.add("dropbox");
- commands.add("tasks");
- commands.add("shutdown");
-
- StringUtil.copyPartialMatches(args[0], commands, completions);
- } else if (args.length == 2) {
- if (args[0].equalsIgnoreCase("list")) {
- File[] backups = new File(ServerBackup.getInstance().backupDestination + "").listFiles();
-
- int maxPages = backups.length / 10;
-
- if (backups.length % 10 != 0) {
- maxPages++;
- }
-
- for (int i = 1; i < maxPages + 1; i++) {
- commands.add(String.valueOf(i));
- }
- } else if (args[0].equalsIgnoreCase("remove")) {
- File[] backups = new File(ServerBackup.getInstance().backupDestination + "").listFiles();
-
- for (int i = 0; i < backups.length; i++) {
- commands.add(backups[i].getName());
- }
- } else if (args[0].equalsIgnoreCase("create")) {
- for (World world : Bukkit.getWorlds()) {
- commands.add((!Bukkit.getWorldContainer().getPath().equalsIgnoreCase("."))
- ? Bukkit.getWorldContainer() + "/" + world.getName()
- : world.getName());
- }
-
- commands.add("@server");
- } else if (args[0].equalsIgnoreCase("zip")) {
- File[] backups = new File(ServerBackup.getInstance().backupDestination + "").listFiles();
-
- for (File backup : backups) {
- if (!backup.getName().endsWith(".zip")) {
- commands.add(backup.getName());
- }
- }
- } else if (args[0].equalsIgnoreCase("unzip")) {
- File[] backups = new File(ServerBackup.getInstance().backupDestination + "").listFiles();
-
- for (File backup : backups) {
- if (backup.getName().endsWith(".zip")) {
- commands.add(backup.getName());
- }
- }
- } else if (args[0].equalsIgnoreCase("ftp")) {
- commands.add("list");
- commands.add("download");
- commands.add("upload");
- } else if (args[0].equalsIgnoreCase("dropbox")) {
- commands.add("upload");
- }
-
- StringUtil.copyPartialMatches(args[1], commands, completions);
- } else if (args.length == 3) {
- if (args[0].equalsIgnoreCase("ftp")) {
- if (args[1].equalsIgnoreCase("list")) {
- FtpManager ftpm = new FtpManager(sender);
-
- List backups = ftpm.getFtpBackupList();
-
- int maxPages = backups.size() / 10;
-
- if (backups.size() % 10 != 0) {
- maxPages++;
- }
-
- for (int i = 1; i < maxPages + 1; i++) {
- commands.add(String.valueOf(i));
- }
- } else if (args[1].equalsIgnoreCase("download")) {
- FtpManager ftpm = new FtpManager(sender);
-
- List backups = ftpm.getFtpBackupList();
-
- for (String backup : backups) {
- commands.add(backup.split(" ")[1]);
- }
- } else if (args[1].equalsIgnoreCase("upload")) {
- File[] backups = new File(ServerBackup.getInstance().backupDestination + "").listFiles();
-
- for (File backup : backups) {
- if (backup.getName().endsWith(".zip")) {
- commands.add(backup.getName());
- }
- }
- }
-
- } else if(args[0].equalsIgnoreCase("dropbox")) {
- File[] backups = new File(ServerBackup.getInstance().backupDestination + "").listFiles();
-
- for (File backup : backups) {
- if (backup.getName().endsWith(".zip")) {
- commands.add(backup.getName());
- }
- }
- } else if (args[0].equalsIgnoreCase("create")) {
- commands.add("-full");
- }
-
- StringUtil.copyPartialMatches(args[2], commands, completions);
- } else if (args.length > 3) {
- if (args[0].equalsIgnoreCase("create")) {
- commands.add("-full");
- }
-
- StringUtil.copyPartialMatches(args[args.length - 1], commands, completions);
- }
- }
-
- Collections.sort(completions);
-
- return completions;
- }
-
-}
diff --git a/src/de/seblii/serverbackup/BackupManager.java b/src/main/java/de/seblii/serverbackup/BackupManager.java
similarity index 63%
rename from src/de/seblii/serverbackup/BackupManager.java
rename to src/main/java/de/seblii/serverbackup/BackupManager.java
index b804fd7a..f9273d7c 100644
--- a/src/de/seblii/serverbackup/BackupManager.java
+++ b/src/main/java/de/seblii/serverbackup/BackupManager.java
@@ -1,111 +1,101 @@
-package de.seblii.serverbackup;
-
-import de.seblii.serverbackup.utils.FtpManager;
-import org.apache.commons.io.FileUtils;
-import org.bukkit.Bukkit;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-
-import java.io.File;
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.TimeZone;
-import java.util.logging.Level;
-
-public class BackupManager {
-
- private String filePath;
- private CommandSender sender;
- private boolean fullBackup;
-
- public BackupManager(String filePath, CommandSender sender, boolean fullBackup) {
- this.filePath = filePath;
- this.sender = sender;
- this.fullBackup = fullBackup;
- }
-
- FtpManager ftpm = new FtpManager(Bukkit.getConsoleSender());
-
- public static List tasks = new ArrayList<>();
-
- public void createBackup() {
- File worldFolder = new File(filePath);
-
- if (filePath.equalsIgnoreCase("@server")) {
- filePath = new File(".").getPath();
- worldFolder = new File(filePath);
- }
-
- Date date = new Date();
- SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'~'HH-mm-ss");
- df.setTimeZone(TimeZone.getDefault());
-
- File backupFolder = new File(ServerBackup.getInstance().backupDestination + "//backup-" + df.format(date) + "-"
- + filePath + "//" + filePath);
-
- if(!ServerBackup.getInstance().getConfig().getBoolean("Ftp.CompressBeforeUpload")) {
- ftpm.uploadFileToFtp(filePath, true);
-
- return;
- }
-
- if (worldFolder.exists()) {
- try {
- if (!backupFolder.exists()) {
- for (Player all : Bukkit.getOnlinePlayers()) {
- if (all.hasPermission("backup.notification")) {
- all.sendMessage(ServerBackup.getInstance().processMessage("Info.BackupStarted").replaceAll("%file%", worldFolder.getName()));
- }
- }
-
- ZipManager zm = new ZipManager(
- worldFolder.getPath(), ServerBackup.getInstance().backupDestination + "//backup-"
- + df.format(date) + "-" + filePath.replaceAll("/", "-") + ".zip",
- Bukkit.getConsoleSender(), true, true, fullBackup);
-
- zm.zip();
-
- tasks.add("CREATE {" + filePath.replace("\\", "/") + "}");
- } else {
- ServerBackup.getInstance().getLogger().log(Level.WARNING, "Backup already exists.");
- }
- } catch (IOException e) {
- e.printStackTrace();
-
- ServerBackup.getInstance().getLogger().log(Level.WARNING, "Backup failed.");
- }
- } else {
- ServerBackup.getInstance().getLogger().log(Level.WARNING, "Couldn't find '" + filePath + "' folder.");
- }
- }
-
- public void removeBackup() {
- Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
- File file = new File(ServerBackup.getInstance().backupDestination + "//" + filePath);
-
- if (file.exists()) {
- if (file.isDirectory()) {
- try {
- FileUtils.deleteDirectory(file);
-
- sender.sendMessage(ServerBackup.getInstance().processMessage("Info.BackupRemoved").replaceAll("%file%", filePath));
- } catch (IOException e) {
- e.printStackTrace();
-
- sender.sendMessage(ServerBackup.getInstance().processMessage("Error.DeletionFailed").replaceAll("%file%", filePath));
- }
- } else {
- file.delete();
-
- sender.sendMessage(ServerBackup.getInstance().processMessage("Info.BackupRemoved").replaceAll("%file%", filePath));
- }
- } else {
- sender.sendMessage(ServerBackup.getInstance().processMessage("Error.NoBackupFound").replaceAll("%file%", filePath));
- }
- });
- }
-
-}
+package de.seblii.serverbackup;
+
+import de.seblii.serverbackup.utils.FtpManager;
+import org.apache.commons.io.FileUtils;
+import org.bukkit.Bukkit;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.logging.Level;
+
+public class BackupManager {
+
+ private String filePath;
+ private final CommandSender sender;
+ private final boolean fullBackup;
+
+ public BackupManager(String filePath, CommandSender sender, boolean fullBackup) {
+ this.filePath = filePath;
+ this.sender = sender;
+ this.fullBackup = fullBackup;
+ }
+
+ FtpManager ftpm = new FtpManager(Bukkit.getConsoleSender());
+
+ public static final List tasks = new ArrayList<>();
+
+ public void createBackup() {
+ File worldFolder = new File(filePath);
+
+ if (filePath.equalsIgnoreCase("@server")) {
+ filePath = new File(".").getPath();
+ worldFolder = new File(filePath);
+ }
+
+ Date date = new Date();
+ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'~'HH-mm-ss");
+ df.setTimeZone(TimeZone.getDefault());
+
+ File backupFolder = new File(ServerBackup.getInstance().backupDestination + "//backup-" + df.format(date) + "-"
+ + filePath + "//" + filePath);
+
+ if (worldFolder.exists()) {
+ if (!backupFolder.exists()) {
+ for (Player all : Bukkit.getOnlinePlayers()) {
+ if (all.hasPermission("backup.notification")) {
+ all.sendMessage(ServerBackup.getInstance().processMessage("Info.BackupStarted").replaceAll("%file%", worldFolder.getName()));
+ }
+ }
+
+ ZipManager zm = new ZipManager(
+ worldFolder.getPath(), ServerBackup.getInstance().backupDestination + "//backup-"
+ + df.format(date) + "-" + filePath.replaceAll("/", "-") + ".zip",
+ Bukkit.getConsoleSender(), true, true, fullBackup);
+
+ zm.zip();
+
+ tasks.add("CREATE {" + filePath.replace("\\", "/") + "}");
+ } else {
+ ServerBackup.getInstance().getLogger().log(Level.WARNING, "Backup already exists.");
+ }
+ } else {
+ ServerBackup.getInstance().getLogger().log(Level.WARNING, "Couldn't find '" + filePath + "' folder.");
+ }
+ }
+
+ public void removeBackup() {
+ Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
+ File file = new File(ServerBackup.getInstance().backupDestination + "//" + filePath);
+
+ if (file.exists()) {
+ if (file.isDirectory()) {
+ try {
+ FileUtils.deleteDirectory(file);
+
+ sender.sendMessage(ServerBackup.getInstance().processMessage("Info.BackupRemoved").replaceAll("%file%", filePath));
+ } catch (IOException e) {
+ e.printStackTrace();
+
+ sender.sendMessage(ServerBackup.getInstance().processMessage("Error.DeletionFailed").replaceAll("%file%", filePath));
+ }
+ } else {
+ try {
+ Files.delete(file.toPath());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ sender.sendMessage(ServerBackup.getInstance().processMessage("Info.BackupRemoved").replaceAll("%file%", filePath));
+ }
+ } else {
+ sender.sendMessage(ServerBackup.getInstance().processMessage("Error.NoBackupFound").replaceAll("%file%", filePath));
+ }
+ });
+ }
+
+}
diff --git a/src/de/seblii/serverbackup/BackupTimer.java b/src/main/java/de/seblii/serverbackup/BackupTimer.java
similarity index 77%
rename from src/de/seblii/serverbackup/BackupTimer.java
rename to src/main/java/de/seblii/serverbackup/BackupTimer.java
index e550de23..1d9c4fc4 100644
--- a/src/de/seblii/serverbackup/BackupTimer.java
+++ b/src/main/java/de/seblii/serverbackup/BackupTimer.java
@@ -1,188 +1,199 @@
-package de.seblii.serverbackup;
-
-import org.bukkit.Bukkit;
-
-import java.io.File;
-import java.time.LocalDate;
-import java.util.*;
-import java.util.logging.Level;
-
-public class BackupTimer implements Runnable {
-
- List worlds = ServerBackup.getInstance().getConfig().getStringList("BackupWorlds");
- List days = ServerBackup.getInstance().getConfig().getStringList("BackupTimer.Days");
- List times = ServerBackup.getInstance().getConfig().getStringList("BackupTimer.Times");
-
- Calendar cal = Calendar.getInstance();
-
- int checkMinute = 0;
-
- @Override
- public void run() {
- cal = Calendar.getInstance();
-
- int timeCode = cal.get(Calendar.HOUR_OF_DAY) * 100 + cal.get(Calendar.MINUTE);
-
- if(checkMinute != timeCode) {
- checkMinute = timeCode;
-
- boolean isBackupDay = days.stream().filter(d -> d.equalsIgnoreCase(getDayName(cal.get(Calendar.DAY_OF_WEEK))))
- .findFirst().isPresent();
-
- if (isBackupDay) {
- for (String time : times) {
- try {
- String[] timeStr = time.split("-");
-
- if (timeStr[0].startsWith("0")) {
- timeStr[0] = timeStr[0].substring(1);
- }
-
- if (timeStr[1].startsWith("0")) {
- timeStr[1] = timeStr[1].substring(1);
- }
-
- int hour = Integer.valueOf(timeStr[0]);
- int minute = Integer.valueOf(timeStr[1]);
-
- if (cal.get(Calendar.HOUR_OF_DAY) == hour && cal.get(Calendar.MINUTE) == minute) {
- for (String world : worlds) {
- BackupManager bm = new BackupManager(world, Bukkit.getConsoleSender(),
- !ServerBackup.getInstance().getConfig().getBoolean("DynamicBackup"));
- bm.createBackup();
- }
- }
- } catch (Exception e) {
- ServerBackup.getInstance().getLogger().log(Level.WARNING,
- "ServerBackup: Automatic Backup failed. Please check that you set the BackupTimer correctly.");
- }
- }
- }
- }
-
- if (ServerBackup.getInstance().getConfig().getInt("BackupLimiter") <= 0) {
- if (cal.get(Calendar.HOUR_OF_DAY) == 0 && cal.get(Calendar.MINUTE) == 0) {
- if (ServerBackup.getInstance().getConfig().getInt("DeleteOldBackups") <= 0)
- return;
-
- File[] backups = new File(ServerBackup.getInstance().backupDestination + "").listFiles();
-
- if (backups.length == 0)
- return;
-
- Arrays.sort(backups, Collections.reverseOrder());
-
- LocalDate date = LocalDate.now()
- .minusDays(ServerBackup.getInstance().getConfig().getInt("DeleteOldBackups"));
-
- ServerBackup.getInstance().getLogger().log(Level.INFO, "");
- ServerBackup.getInstance().getLogger().log(Level.INFO, "ServerBackup | Backup deletion started...");
- ServerBackup.getInstance().getLogger().log(Level.INFO, "");
-
- long time = System.currentTimeMillis();
-
- List backupNames = new ArrayList<>();
-
- for (int i = 0; i < backups.length; i++) {
- try {
- String[] backupDateStr = backups[i].getName().split("-");
- LocalDate backupDate = LocalDate.parse(
- backupDateStr[1] + "-" + backupDateStr[2] + "-" + backupDateStr[3].split("~")[0]);
- String backupName = backupDateStr[6];
-
- if (ServerBackup.getInstance().getConfig().getBoolean("KeepUniqueBackups")) {
- if (!backupNames.contains(backupName)) {
- backupNames.add(backupName);
- continue;
- }
- }
-
- if (backupDate.isBefore(date.plusDays(1))) {
- if (backups[i].exists()) {
- backups[i].delete();
-
- ServerBackup.getInstance().getLogger().log(Level.INFO,
- "Backup [" + backups[i].getName() + "] removed.");
- } else {
- ServerBackup.getInstance().getLogger().log(Level.WARNING,
- "No Backup named '" + backups[i].getName() + "' found.");
- }
- }
- } catch (Exception e) {
- continue;
- }
- }
-
- ServerBackup.getInstance().getLogger().log(Level.INFO, "");
- ServerBackup.getInstance().getLogger().log(Level.INFO, "ServerBackup | Backup deletion finished. ["
- + Long.valueOf(System.currentTimeMillis() - time) + "ms]");
- ServerBackup.getInstance().getLogger().log(Level.INFO, "");
- }
- } else {
- File[] backups = new File(ServerBackup.getInstance().backupDestination + "").listFiles();
- Arrays.sort(backups);
-
- int dobc = ServerBackup.getInstance().getConfig().getInt("BackupLimiter");
- int c = 0;
-
- while (backups.length > dobc) {
- if (backups[c].exists()) {
- backups[c].delete();
-
- ServerBackup.getInstance().getLogger().log(Level.INFO,
- "Backup [" + backups[c].getName() + "] removed.");
- } else {
- ServerBackup.getInstance().getLogger().log(Level.WARNING,
- "No Backup named '" + backups[c].getName() + "' found.");
- }
-
- c++;
- dobc++;
- }
- }
-
- if (ServerBackup.getInstance().shutdownProgress) {
- if (BackupManager.tasks.size() == 0) {
- ServerBackup.getInstance().getLogger().log(Level.INFO,
- "Backup tasks finished. Shutting down server...");
-
- Bukkit.shutdown();
- }
- }
- }
-
- private String getDayName(int dayNumber) {
- if (dayNumber == 1) {
- return "SUNDAY";
- }
-
- if (dayNumber == 2) {
- return "MONDAY";
- }
-
- if (dayNumber == 3) {
- return "TUESDAY";
- }
-
- if (dayNumber == 4) {
- return "WEDNESDAY";
- }
-
- if (dayNumber == 5) {
- return "THURSDAY";
- }
-
- if (dayNumber == 6) {
- return "FRIDAY";
- }
-
- if (dayNumber == 7) {
- return "SATURDAY";
- }
-
- ServerBackup.getInstance().getLogger().log(Level.WARNING, "Error while converting number in day.");
-
- return null;
- }
-
-}
+package de.seblii.serverbackup;
+
+import org.bukkit.Bukkit;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.time.LocalDate;
+import java.util.*;
+import java.util.logging.Level;
+
+public class BackupTimer implements Runnable {
+
+ final List worlds = ServerBackup.getInstance().getConfig().getStringList("BackupWorlds");
+ final List days = ServerBackup.getInstance().getConfig().getStringList("BackupTimer.Days");
+ final List times = ServerBackup.getInstance().getConfig().getStringList("BackupTimer.Times");
+
+ Calendar cal = Calendar.getInstance();
+
+ int checkMinute = 0;
+
+ @Override
+ public void run() {
+ cal = Calendar.getInstance();
+
+ int timeCode = cal.get(Calendar.HOUR_OF_DAY) * 100 + cal.get(Calendar.MINUTE);
+
+ if(checkMinute != timeCode) {
+ checkMinute = timeCode;
+
+ boolean isBackupDay = days.stream().anyMatch(d -> d.equalsIgnoreCase(getDayName(cal.get(Calendar.DAY_OF_WEEK))));
+
+ if (isBackupDay) {
+ for (String time : times) {
+ try {
+ String[] timeStr = time.split("-");
+
+ if (timeStr[0].startsWith("0")) {
+ timeStr[0] = timeStr[0].substring(1);
+ }
+
+ if (timeStr[1].startsWith("0")) {
+ timeStr[1] = timeStr[1].substring(1);
+ }
+
+ int hour = Integer.parseInt(timeStr[0]);
+ int minute = Integer.parseInt(timeStr[1]);
+
+ if (cal.get(Calendar.HOUR_OF_DAY) == hour && cal.get(Calendar.MINUTE) == minute) {
+ for (String world : worlds) {
+ BackupManager bm = new BackupManager(world, Bukkit.getConsoleSender(),
+ !ServerBackup.getInstance().getConfig().getBoolean("DynamicBackup"));
+ bm.createBackup();
+ }
+ }
+ } catch (Exception e) {
+ ServerBackup.getInstance().getLogger().log(Level.WARNING,
+ "ServerBackup: Automatic Backup failed. Please check that you set the BackupTimer correctly.");
+ }
+ }
+ }
+ }
+
+ if (ServerBackup.getInstance().getConfig().getInt("BackupLimiter") <= 0) {
+ if (cal.get(Calendar.HOUR_OF_DAY) == 0 && cal.get(Calendar.MINUTE) == 0) {
+ if (ServerBackup.getInstance().getConfig().getInt("DeleteOldBackups") <= 0)
+ return;
+
+ File[] backups = new File(ServerBackup.getInstance().backupDestination).listFiles();
+ assert backups != null;
+
+ if (backups.length == 0)
+ return;
+
+ Arrays.sort(backups, Collections.reverseOrder());
+
+ LocalDate date = LocalDate.now()
+ .minusDays(ServerBackup.getInstance().getConfig().getInt("DeleteOldBackups"));
+
+ ServerBackup.getInstance().getLogger().log(Level.INFO, "");
+ ServerBackup.getInstance().getLogger().log(Level.INFO, "ServerBackup | Backup deletion started...");
+ ServerBackup.getInstance().getLogger().log(Level.INFO, "");
+
+ long time = System.currentTimeMillis();
+
+ List backupNames = new ArrayList<>();
+
+ for (File backup : backups) {
+ try {
+ String[] backupDateStr = backup.getName().split("-");
+ LocalDate backupDate = LocalDate.parse(
+ backupDateStr[1] + "-" + backupDateStr[2] + "-" + backupDateStr[3].split("~")[0]);
+ String backupName = backupDateStr[6];
+
+ if (ServerBackup.getInstance().getConfig().getBoolean("KeepUniqueBackups")) {
+ if (!backupNames.contains(backupName)) {
+ backupNames.add(backupName);
+ continue;
+ }
+ }
+
+ if (backupDate.isBefore(date.plusDays(1))) {
+ if (backup.exists()) {
+ try {
+ Files.delete(backup.toPath());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ ServerBackup.getInstance().getLogger().log(Level.INFO,
+ "Backup [" + backup.getName() + "] removed.");
+ } else {
+ ServerBackup.getInstance().getLogger().log(Level.WARNING,
+ "No Backup named '" + backup.getName() + "' found.");
+ }
+ }
+ } catch (Exception ignored) {
+ }
+ }
+
+ ServerBackup.getInstance().getLogger().log(Level.INFO, "");
+ ServerBackup.getInstance().getLogger().log(Level.INFO, "ServerBackup | Backup deletion finished. ["
+ + (System.currentTimeMillis() - time) + "ms]");
+ ServerBackup.getInstance().getLogger().log(Level.INFO, "");
+ }
+ } else {
+ File[] backups = new File(ServerBackup.getInstance().backupDestination).listFiles();
+ assert backups != null;
+
+ Arrays.sort(backups);
+
+ int dobc = ServerBackup.getInstance().getConfig().getInt("BackupLimiter");
+ int c = 0;
+
+ while (backups.length > dobc) {
+ if (backups[c].exists()) {
+ try {
+ Files.delete(backups[c].toPath());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ ServerBackup.getInstance().getLogger().log(Level.INFO,
+ "Backup [" + backups[c].getName() + "] removed.");
+ } else {
+ ServerBackup.getInstance().getLogger().log(Level.WARNING,
+ "No Backup named '" + backups[c].getName() + "' found.");
+ }
+
+ c++;
+ dobc++;
+ }
+ }
+
+ if (ServerBackup.getInstance().shutdownProgress) {
+ if (BackupManager.tasks.size() == 0) {
+ ServerBackup.getInstance().getLogger().log(Level.INFO,
+ "Backup tasks finished. Shutting down server...");
+
+ Bukkit.shutdown();
+ }
+ }
+ }
+
+ private String getDayName(int dayNumber) {
+ if (dayNumber == 1) {
+ return "SUNDAY";
+ }
+
+ if (dayNumber == 2) {
+ return "MONDAY";
+ }
+
+ if (dayNumber == 3) {
+ return "TUESDAY";
+ }
+
+ if (dayNumber == 4) {
+ return "WEDNESDAY";
+ }
+
+ if (dayNumber == 5) {
+ return "THURSDAY";
+ }
+
+ if (dayNumber == 6) {
+ return "FRIDAY";
+ }
+
+ if (dayNumber == 7) {
+ return "SATURDAY";
+ }
+
+ ServerBackup.getInstance().getLogger().log(Level.WARNING, "Error while converting number in day.");
+
+ return null;
+ }
+
+}
diff --git a/src/main/java/de/seblii/serverbackup/DynamicBackup.java b/src/main/java/de/seblii/serverbackup/DynamicBackup.java
new file mode 100644
index 00000000..a085da09
--- /dev/null
+++ b/src/main/java/de/seblii/serverbackup/DynamicBackup.java
@@ -0,0 +1,117 @@
+package de.seblii.serverbackup;
+
+import org.bukkit.Bukkit;
+import org.bukkit.Chunk;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerMoveEvent;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.logging.Level;
+
+public class DynamicBackup implements Listener {
+
+ final List chunks = Collections.synchronizedList(new ArrayList<>());
+ public boolean isSaving = false;
+
+ @EventHandler
+ public void onPlayerMove(PlayerMoveEvent e) {
+ if (ServerBackup.getInstance().getConfig().getBoolean("DynamicBackup")) {
+ if (e.getFrom().getChunk() != Objects.requireNonNull(e.getTo()).getChunk()) {
+ int regX = e.getTo().getChunk().getX() >> 5;
+ int regZ = e.getTo().getChunk().getZ() >> 5;
+
+ Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
+ String chunkInf = "Data." + Objects.requireNonNull(e.getTo().getWorld()).getName() + ".Chunk." + "r." + regX + "."
+ + regZ + ".mca";
+
+ if (!Bukkit.getWorldContainer().toString().equalsIgnoreCase(".")) {
+ chunkInf = "Data." + Bukkit.getWorldContainer() + "\\" + e.getTo().getWorld().getName()
+ + ".Chunk." + "r." + regX + "." + regZ + ".mca";
+ }
+
+ if (!chunks.contains(e.getTo().getChunk())) {
+ if (!ServerBackup.getInstance().bpInf.contains(chunkInf)) {
+ chunks.add(e.getTo().getChunk());
+ ServerBackup.getInstance().bpInf.set(chunkInf, chunks.get(chunks.size() - 1).getX());
+ ServerBackup.getInstance().bpInf.set(chunkInf, chunks.get(chunks.size() - 1).getZ());
+
+ saveChanges();
+ try {
+ chunks.remove(e.getTo().getChunk());
+ } catch (ArrayIndexOutOfBoundsException ignored) {
+ }
+ } else {
+ chunks.add(e.getTo().getChunk());
+ ServerBackup.getInstance().bpInf.set(chunkInf, chunks.get(chunks.size() - 1).getWorld());
+
+ saveChanges();
+ try {
+ chunks.remove(e.getTo().getChunk());
+ } catch (ArrayIndexOutOfBoundsException ignored) {
+ }
+ }
+ }
+ });
+ }
+ }
+ }
+
+ public void saveChanges() {
+ if (!isSaving) {
+ isSaving = true;
+
+ Bukkit.getScheduler().runTaskLaterAsynchronously(ServerBackup.getInstance(), () -> {
+ ServerBackup.getInstance().saveBpInf();
+ if (ServerBackup.getInstance().getConfig().getBoolean("SendLogMessages")) {
+ Bukkit.getLogger().log(Level.INFO, "DynamicBP: file saved.");
+ }
+
+ isSaving = false;
+ }, 20 * 5);
+ }
+ }
+
+ @EventHandler
+ public void onJoin(PlayerJoinEvent e) {
+ if (ServerBackup.getInstance().getConfig().getBoolean("DynamicBackup")) {
+ Player p = e.getPlayer();
+
+ int regX = p.getLocation().getChunk().getX() >> 5;
+ int regZ = p.getLocation().getChunk().getZ() >> 5;
+
+ Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
+ String chunkInf = "Data." + Objects.requireNonNull(p.getLocation().getWorld()).getName() + ".Chunk." + "r." + regX + "."
+ + regZ + ".mca";
+
+ if (!Bukkit.getWorldContainer().toString().equalsIgnoreCase(".")) {
+ chunkInf = "Data." + Bukkit.getWorldContainer() + "\\" + p.getLocation().getWorld().getName()
+ + ".Chunk." + "r." + regX + "." + regZ + ".mca";
+ }
+
+ if (!chunks.contains(p.getLocation().getChunk())) {
+ if (!ServerBackup.getInstance().bpInf.contains(chunkInf)) {
+ chunks.add(p.getLocation().getChunk());
+ ServerBackup.getInstance().bpInf.set(chunkInf + ".X", p.getLocation().getChunk().getX());
+ ServerBackup.getInstance().bpInf.set(chunkInf + ".Z", p.getLocation().getChunk().getZ());
+
+ ServerBackup.getInstance().saveBpInf();
+ chunks.remove(p.getLocation().getChunk());
+ } else {
+ chunks.add(p.getLocation().getChunk());
+ ServerBackup.getInstance().bpInf.set(chunkInf, p.getLocation().getChunk().getWorld());
+
+ ServerBackup.getInstance().saveBpInf();
+ chunks.remove(p.getLocation().getChunk());
+ }
+ }
+ });
+ }
+ }
+
+}
diff --git a/src/main/java/de/seblii/serverbackup/SBCommand.java b/src/main/java/de/seblii/serverbackup/SBCommand.java
new file mode 100644
index 00000000..f48ca6ad
--- /dev/null
+++ b/src/main/java/de/seblii/serverbackup/SBCommand.java
@@ -0,0 +1,232 @@
+package de.seblii.serverbackup;
+
+import de.seblii.serverbackup.commands.*;
+import de.seblii.serverbackup.utils.FtpManager;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.command.TabCompleter;
+import org.bukkit.util.StringUtil;
+
+import java.io.File;
+import java.util.*;
+
+public class SBCommand implements CommandExecutor, TabCompleter {
+
+ private final ServerBackup backup = ServerBackup.getInstance();
+
+ final Map sbCommands = new HashMap<>();
+
+ {
+ sbCommands.put("shutdown", new ShutdownCommand());
+ sbCommands.put("list", new ListCommand());
+ sbCommands.put("reload", new ReloadCommand());
+ sbCommands.put("rl", new ReloadCommand());
+ sbCommands.put("tasks", new TasksCommand());
+ sbCommands.put("task", new TasksCommand());
+ sbCommands.put("ftp", new FtpCommand());
+ sbCommands.put("zip", new ZipCommand());
+ sbCommands.put("unzip", new UnzipCommand());
+ sbCommands.put("remove", new RemoveCommand());
+ sbCommands.put("search", new SearchCommand());
+ sbCommands.put("dropbox", new DropboxCommand());
+ sbCommands.put("create", new CreateCommand());
+ sbCommands.put("webdav", new WebDavCommand());
+ }
+
+ @Override
+ public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
+ if (sender.hasPermission("backup.admin")) {
+ if (args.length > 0 && sbCommands.containsKey(args[0])) {
+ sbCommands.get(args[0]).execute(sender, args, backup);
+ } else {
+ sendHelp(sender);
+ }
+ } else {
+ sender.sendMessage(backup.processMessage("Error.NoPermission"));
+ }
+ return false;
+ }
+
+ private void sendHelp(CommandSender sender) {
+ sender.sendMessage("/backup reload - reloads the config");
+ sender.sendMessage("");
+ sender.sendMessage("/backup list - shows a list of 10 backups");
+ sender.sendMessage("");
+ sender.sendMessage(
+ "/backup search - shows a list of 10 backups that contain the given search argument");
+ sender.sendMessage("");
+ sender.sendMessage("/backup create - creates a new backup of a world");
+ sender.sendMessage("");
+ sender.sendMessage("/backup remove - removes an existing backup");
+ sender.sendMessage("");
+ sender.sendMessage("/backup zip - zipping folder");
+ sender.sendMessage("");
+ sender.sendMessage("/backup unzip - unzipping file");
+ sender.sendMessage("");
+ sender.sendMessage("/backup ftp - download, upload or list ftp backup files");
+ sender.sendMessage("");
+ sender.sendMessage("/backup dropbox upload - upload backup files to dropbox");
+ sender.sendMessage("");
+ sender.sendMessage("/backup webdav upload - upload backup files to dropbox");
+ sender.sendMessage("");
+ sender.sendMessage("/backup dropbox upload - upload a backup to dropbox");
+ sender.sendMessage("");
+ sender.sendMessage("/backup shutdown - shut downs the server after backup tasks are finished");
+ sender.sendMessage("");
+ sender.sendMessage("/backup tasks - prints a list of currently running backup jobs");
+ }
+
+ @Override
+ public List onTabComplete(CommandSender sender, Command cmd, String label, String[] args) {
+ List completions = new ArrayList<>();
+ List commands = new ArrayList<>();
+
+ if (sender.hasPermission("backup.admin")) {
+ if (args.length == 1) {
+ commands.add("reload");
+ commands.add("list");
+ commands.add("search");
+ commands.add("create");
+ commands.add("remove");
+ commands.add("zip");
+ commands.add("unzip");
+ commands.add("ftp");
+ commands.add("dropbox");
+ commands.add("webdav");
+ commands.add("tasks");
+ commands.add("shutdown");
+
+ StringUtil.copyPartialMatches(args[0], commands, completions);
+ } else if (args.length == 2) {
+ if (args[0].equalsIgnoreCase("list")) {
+ File[] backups = getFiles();
+
+ int maxPages = backups.length / 10;
+
+ if (backups.length % 10 != 0) {
+ maxPages++;
+ }
+
+ for (int i = 1; i < maxPages + 1; i++) {
+ commands.add(String.valueOf(i));
+ }
+ } else if (args[0].equalsIgnoreCase("remove")) {
+ File[] backups = getFiles();
+
+ for (File file : backups) {
+ commands.add(file.getName());
+ }
+ } else if (args[0].equalsIgnoreCase("create")) {
+ for (World world : Bukkit.getWorlds()) {
+ commands.add((!Bukkit.getWorldContainer().getPath().equalsIgnoreCase("."))
+ ? Bukkit.getWorldContainer() + "/" + world.getName()
+ : world.getName());
+ }
+
+ commands.add("@server");
+ } else if (args[0].equalsIgnoreCase("zip")) {
+ File[] backups = getFiles();
+
+ for (File backup : backups) {
+ if (!backup.getName().endsWith(".zip")) {
+ commands.add(backup.getName());
+ }
+ }
+ } else if (args[0].equalsIgnoreCase("unzip")) {
+ File[] backups = getFiles();
+
+ for (File backup : backups) {
+ if (backup.getName().endsWith(".zip")) {
+ commands.add(backup.getName());
+ }
+ }
+ } else if (args[0].equalsIgnoreCase("ftp")) {
+ commands.add("list");
+ commands.add("download");
+ commands.add("upload");
+ } else if (args[0].equalsIgnoreCase("dropbox")) {
+ commands.add("upload");
+ } else if (args[0].equalsIgnoreCase("webdav")) {
+ commands.add("upload");
+ }
+
+ StringUtil.copyPartialMatches(args[1], commands, completions);
+ } else if (args.length == 3) {
+ if (args[0].equalsIgnoreCase("ftp")) {
+ if (args[1].equalsIgnoreCase("list")) {
+ FtpManager ftpm = new FtpManager(sender);
+
+ List backups = ftpm.getFtpBackupList();
+
+ int maxPages = backups.size() / 10;
+
+ if (backups.size() % 10 != 0) {
+ maxPages++;
+ }
+
+ for (int i = 1; i < maxPages + 1; i++) {
+ commands.add(String.valueOf(i));
+ }
+ } else if (args[1].equalsIgnoreCase("download")) {
+ FtpManager ftpm = new FtpManager(sender);
+
+ List backups = ftpm.getFtpBackupList();
+
+ for (String backup : backups) {
+ commands.add(backup.split(" ")[1]);
+ }
+ } else if (args[1].equalsIgnoreCase("upload")) {
+ File[] backups = getFiles();
+
+ for (File backup : backups) {
+ if (backup.getName().endsWith(".zip")) {
+ commands.add(backup.getName());
+ }
+ }
+ }
+
+ } else if(args[0].equalsIgnoreCase("dropbox")) {
+ File[] backups = getFiles();
+
+ for (File backup : backups) {
+ if (backup.getName().endsWith(".zip")) {
+ commands.add(backup.getName());
+ }
+ }
+ } else if(args[0].equalsIgnoreCase("webdav")) {
+ File[] backups = getFiles();
+
+ for (File backup : backups) {
+ if (backup.getName().endsWith(".zip")) {
+ commands.add(backup.getName());
+ }
+ }
+ } else if (args[0].equalsIgnoreCase("create")) {
+ commands.add("-full");
+ }
+
+ StringUtil.copyPartialMatches(args[2], commands, completions);
+ } else if (args.length > 3) {
+ if (args[0].equalsIgnoreCase("create")) {
+ commands.add("-full");
+ }
+
+ StringUtil.copyPartialMatches(args[args.length - 1], commands, completions);
+ }
+ }
+
+ Collections.sort(completions);
+
+ return completions;
+ }
+
+ private static File[] getFiles() {
+ File[] backups = new File(ServerBackup.getInstance().backupDestination).listFiles();
+ assert backups != null;
+ return backups;
+ }
+
+}
diff --git a/src/de/seblii/serverbackup/ServerBackup.java b/src/main/java/de/seblii/serverbackup/ServerBackup.java
similarity index 85%
rename from src/de/seblii/serverbackup/ServerBackup.java
rename to src/main/java/de/seblii/serverbackup/ServerBackup.java
index e48612c2..50606214 100644
--- a/src/de/seblii/serverbackup/ServerBackup.java
+++ b/src/main/java/de/seblii/serverbackup/ServerBackup.java
@@ -1,534 +1,541 @@
-package de.seblii.serverbackup;
-
-import de.seblii.serverbackup.commands.SBCommand;
-import org.apache.commons.io.FileUtils;
-import org.bstats.MetricsBase;
-import org.bstats.bukkit.Metrics;
-import org.bstats.charts.SimplePie;
-import org.bstats.charts.SingleLineChart;
-import org.bukkit.Bukkit;
-import org.bukkit.configuration.file.YamlConfiguration;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.player.PlayerJoinEvent;
-import org.bukkit.plugin.java.JavaPlugin;
-import org.bukkit.scheduler.BukkitTask;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.nio.channels.Channels;
-import java.nio.channels.ReadableByteChannel;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Scanner;
-import java.util.concurrent.Callable;
-import java.util.logging.Level;
-
-public class ServerBackup extends JavaPlugin implements Listener {
-
- private static ServerBackup sb;
-
- public static ServerBackup getInstance() {
- return sb;
- }
-
- public String backupDestination = "Backups//";
-
- public File backupInfo = new File("plugins//ServerBackup//backupInfo.yml");
- public YamlConfiguration bpInf = YamlConfiguration.loadConfiguration(backupInfo);
-
- public File cloudInfo = new File("plugins//ServerBackup//cloudAccess.yml");
- public YamlConfiguration cloud = YamlConfiguration.loadConfiguration(cloudInfo);
-
- public File messagesFile = new File("plugins//ServerBackup//messages.yml");
- public YamlConfiguration messages = YamlConfiguration.loadConfiguration(messagesFile);
-
- boolean isUpdated = false;
-
- public boolean shutdownProgress = false;
-
- public String prefix = "";
-
- @Override
- public void onDisable() {
- stopTimer();
-
- for (BukkitTask task : Bukkit.getScheduler().getPendingTasks()) {
- task.cancel();
-
- this.getLogger().log(Level.WARNING, "WARNING - ServerBackup: Task [" + task.getTaskId()
- + "] cancelled due to server shutdown. There might be some unfinished Backups.");
- }
-
- this.getLogger().log(Level.INFO, "ServerBackup: Plugin disabled.");
- }
-
- @Override
- public void onEnable() {
- sb = this;
-
- loadFiles();
-
- getCommand("backup").setExecutor(new SBCommand());
-
- Bukkit.getPluginManager().registerEvents(this, this); //CHANGE
- Bukkit.getPluginManager().registerEvents(new DynamicBackup(), this);
-
- startTimer();
-
- this.getLogger().log(Level.INFO, "ServerBackup: Plugin enabled.");
-
- if (getConfig().getBoolean("UpdateAvailableMessage")) {
- checkVersion(); //CHANGE
- }
-
- int mpid = 14673; //17639 //CHANGE
-
- Metrics metrics = new Metrics(this, mpid);
-
- metrics.addCustomChart(new SimplePie("player_per_server", new Callable() {
- @Override
- public String call() throws Exception {
- return String.valueOf(Bukkit.getOnlinePlayers().size());
- }
- }));
-
- metrics.addCustomChart(new SimplePie("using_ftp_server", new Callable() {
- @Override
- public String call() throws Exception {
- if (getConfig().getBoolean("Ftp.UploadBackup")) {
- return "yes";
- } else {
- return "no";
- }
- }
- }));
-
- metrics.addCustomChart(new SimplePie("using_dropbox", new Callable() {
- @Override
- public String call() throws Exception {
- if (getConfig().getBoolean("CloudBackup.Dropbox")) {
- return "yes";
- } else {
- return "no";
- }
- }
- }));
-
- metrics.addCustomChart(new SimplePie("using_gdrive", new Callable() {
- @Override
- public String call() throws Exception {
- if (getConfig().getBoolean("CloudBackup.GoogleDrive")) {
- return "yes";
- } else {
- return "no";
- }
- }
- }));
-
- metrics.addCustomChart(new SingleLineChart("total_backup_space", new Callable() {
- @Override
- public Integer call() throws Exception {
- File file = new File(backupDestination);
-
- double fileSize = (double) FileUtils.sizeOf(file) / 1000 / 1000;
- fileSize = Math.round(fileSize * 100.0) / 100.0;
-
- return (int) fileSize;
- }
- }));
- }
-
- private void checkVersion() {
- this.getLogger().log(Level.INFO, "ServerBackup: Searching for updates...");
-
- Bukkit.getScheduler().runTaskAsynchronously(this, () -> {
- int resourceID = 79320;
- try (InputStream inputStream = (new URL(
- "https://api.spigotmc.org/legacy/update.php?resource=" + resourceID)).openStream();
- Scanner scanner = new Scanner(inputStream)) {
- if (scanner.hasNext()) {
- String latest = scanner.next();
- String current = getDescription().getVersion();
-
- int late = Integer.parseInt(latest.replaceAll("\\.", ""));
- int curr = Integer.parseInt(current.replaceAll("\\.", ""));
-
- if (curr >= late) {
- this.getLogger().log(Level.INFO,
- "ServerBackup: No updates found. The server is running the latest version.");
- } else {
- this.getLogger().log(Level.INFO, "ServerBackup: There is a newer version available - " + latest
- + ", you are on - " + current);
-
- if (getConfig().getBoolean("AutomaticUpdates")) {
- this.getLogger().log(Level.INFO, "ServerBackup: Downloading newest version...");
-
- URL url = new URL("https://server-backup.net/assets/downloads/alt/ServerBackup.jar");
-
- if (Bukkit.getVersion().contains("1.18") || Bukkit.getVersion().contains("1.19")) {
- url = new URL("https://server-backup.net/assets/downloads/ServerBackup.jar");
- }
-
- try (InputStream in = url.openStream();
- ReadableByteChannel rbc = Channels.newChannel(in);
- FileOutputStream fos = new FileOutputStream("plugins/ServerBackup.jar")) {
- fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
-
- this.getLogger().log(Level.INFO,
- "ServerBackup: Download finished. Please reload the server to complete the update.");
-
- isUpdated = true;
- }
- } else {
- this.getLogger().log(Level.INFO,
- "ServerBackup: Please download the latest version - https://server-backup.net/");
- }
- }
- }
- } catch (IOException exception) {
- this.getLogger().log(Level.WARNING,
- "ServerBackup: Cannot search for updates - " + exception.getMessage());
- }
- });
-
- }
-
- @SuppressWarnings("deprecation")
- public void loadFiles() {
- if (getConfig().contains("BackupDestination"))
- backupDestination = getConfig().getString("BackupDestination");
-
- if (!Files.exists(Paths.get(backupDestination))) {
- try {
- Files.createDirectories(Paths.get(backupDestination));
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- File files = new File(backupDestination + "//Files");
-
- if (!files.exists()) {
- files.mkdir();
- }
-
- getConfig().options()
- .header("BackupTimer = At what time should a Backup be created? The format is: 'hh-mm' e.g. '12-30'."
- + "\nDeleteOldBackups = Deletes old backups automatically after a specific time (in days, standard = 7 days)"
- + "\nDeleteOldBackups - Type '0' at DeleteOldBackups to disable the deletion of old backups."
- + "\nBackupLimiter = Deletes old backups automatically if number of total backups is greater than this number (e.g. if you enter '5' - the oldest backup will be deleted if there are more than 5 backups, so you will always keep the latest 5 backups)"
- + "\nBackupLimiter - Type '0' to disable this feature. If you don't type '0' the feature 'DeleteOldBackups' will be disabled and this feature ('BackupLimiter') will be enabled."
- + "\nKeepUniqueBackups - Type 'true' to disable the deletion of unique backups. The plugin will keep the newest backup of all backed up worlds or folders, no matter how old it is."
- + "\nBlacklist - A list of files/directories that will not be backed up."
- + "\nIMPORTANT FTP information: Set 'UploadBackup' to 'true' if you want to store your backups on a ftp server (sftp does not work at the moment - if you host your own server (e.g. vps/root server) you need to set up a ftp server on it)."
- + "\nIf you use ftp backups, you can set 'DeleteLocalBackup' to 'true' if you want the plugin to remove the created backup from your server once it has been uploaded to your ftp server."
- + "\nJoin the discord server if you need help or have a question: https://discord.gg/rNzngsCWFC");
- getConfig().options().copyDefaults(true);
-
- getConfig().addDefault("AutomaticBackups", true);
-
- List days = new ArrayList<>();
- days.add("MONDAY");
- days.add("TUESDAY");
- days.add("WEDNESDAY");
- days.add("THURSDAY");
- days.add("FRIDAY");
- days.add("SATURDAY");
- days.add("SUNDAY");
-
- List times = new ArrayList<>();
- times.add("00-00");
-
- getConfig().addDefault("BackupTimer.Days", days);
- getConfig().addDefault("BackupTimer.Times", times);
-
- List worlds = new ArrayList<>();
- worlds.add("world");
- worlds.add("world_nether");
- worlds.add("world_the_end");
-
- getConfig().addDefault("BackupWorlds", worlds);
-
- List blacklist = new ArrayList<>();
- blacklist.add("libraries");
- blacklist.add("plugins/ServerBackup/config.yml");
-
- getConfig().addDefault("Blacklist", blacklist);
-
- getConfig().addDefault("DeleteOldBackups", 14);
- getConfig().addDefault("BackupLimiter", 0);
-
- getConfig().addDefault("KeepUniqueBackups", false);
-
- getConfig().addDefault("UpdateAvailableMessage", true);
- getConfig().addDefault("AutomaticUpdates", true);
-
- getConfig().addDefault("BackupDestination", "Backups//");
-
- getConfig().addDefault("CloudBackup.Dropbox", false);
- //getConfig().addDefault("CloudBackup.GoogleDrive", true); //CHANGE
- getConfig().addDefault("CloudBackup.Options.Destination", "/");
- getConfig().addDefault("CloudBackup.Options.DeleteLocalBackup", false);
-
- getConfig().addDefault("Ftp.UploadBackup", false);
- getConfig().addDefault("Ftp.DeleteLocalBackup", false);
- getConfig().addDefault("Ftp.Server.IP", "127.0.0.1");
- getConfig().addDefault("Ftp.Server.Port", 21);
- getConfig().addDefault("Ftp.Server.User", "username");
- getConfig().addDefault("Ftp.Server.Password", "password");
- getConfig().addDefault("Ftp.Server.BackupDirectory", "Backups/");
-
- getConfig().addDefault("DynamicBackup", false);
- getConfig().addDefault("SendLogMessages", false);
-
- saveConfig();
-
- backupDestination = getConfig().getString("BackupDestination");
-
- if (getConfig().getBoolean("DynamicBackup")) {
- loadBpInf();
- }
-
- if (getConfig().getBoolean("CloudBackup.Dropbox")) {
- loadCloud();
- }
-
- loadMessages();
- }
-
- public void loadCloud() {
- if (!cloudInfo.exists()) {
- try {
- cloudInfo.createNewFile();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- cloud.options().header("Dropbox - Watch this video for explanation: https://youtu.be/k-0aIohxRUA"
- /*+"Google Drive - Watch this video for explanation: x"*/);
-
- if(!cloud.contains("Cloud.Dropbox")) {
- cloud.set("Cloud.Dropbox.AppKey", "appKey");
- cloud.set("Cloud.Dropbox.AppSecret", "appSecret");
- } else {
- if(cloud.getString("Cloud.Dropbox.AppKey") != "appKey" && !cloud.contains("Cloud.Dropbox.ActivationLink")) {
- cloud.set("Cloud.Dropbox.ActivationLink", "https://www.dropbox.com/oauth2/authorize?client_id=" + cloud.getString("Cloud.Dropbox.AppKey") + "&response_type=code&token_access_type=offline");
- if(!cloud.contains("Cloud.Dropbox.AccessToken")) {
- cloud.set("Cloud.Dropbox.AccessToken", "accessToken");
- }
- }
- }
-
- saveCloud();
- }
-
- public void saveCloud() {
- try {
- cloud.save(cloudInfo);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- public void loadBpInf() {
- if (!backupInfo.exists()) {
- try {
- backupInfo.createNewFile();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- saveBpInf();
- }
-
- public void saveBpInf() {
- try {
- bpInf.save(backupInfo);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- public void loadMessages() {
- if (!messagesFile.exists()) {
- try {
- messagesFile.createNewFile();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- messages.options().header("Use '&nl' to add a new line. Use '&' for color codes (e.g. '&4' for color red). For some messages you can use a placeholder (e.g. '%file%' for file name)." +
- "\nMinecraft color codes: https://htmlcolorcodes.com/minecraft-color-codes/");
- messages.options().copyDefaults(true);
-
- messages.addDefault("Prefix", "");
-
- messages.addDefault("Command.Zip.Header", "Zipping Backup..."
- + "&nl");
- messages.addDefault("Command.Zip.Footer", "&nl"
- + "&nlBackup [%file%] zipped."
- + "&nlBackup [%file%] saved.");
- messages.addDefault("Command.Unzip.Header", "Unzipping Backup..."
- + "&nl");
- messages.addDefault("Command.Unzip.Footer", "&nl"
- + "&nlBackup [%file%] unzipped.");
- messages.addDefault("Command.Reload", "Config reloaded.");
- messages.addDefault("Command.Tasks.Header", "----- Backup tasks -----"
- + "&nl");
- messages.addDefault("Command.Tasks.Footer", "&nl"
- + "----- Backup tasks -----");
- messages.addDefault("Command.Shutdown.Start", "The server will shut down after backup tasks (check with: '/backup tasks') are finished."
- + "&nlYou can cancel the shutdown by running this command again.");
- messages.addDefault("Command.Shutdown.Cancel", "Shutdown canceled.");
-
- messages.addDefault("Info.BackupFinished", "Backup [%file%] saved.");
- messages.addDefault("Info.BackupStarted", "Backup [%file%] started.");
- messages.addDefault("Info.BackupRemoved", "Backup [%file%] removed.");
- messages.addDefault("Info.FtpUpload", "Ftp: Uploading backup [%file%] ...");
- messages.addDefault("Info.FtpUploadSuccess", "Ftp: Upload successfully. Backup stored on ftp server.");
- messages.addDefault("Info.FtpDownload", "Ftp: Downloading backup [%file%] ...");
- messages.addDefault("Info.FtpDownloadSuccess", "Ftp: Download successful. Backup downloaded from ftp server.");
-
- messages.addDefault("Error.NoPermission", "&cI'm sorry but you do not have permission to perform this command.");
- messages.addDefault("Error.NoBackups", "No backups found.");
- messages.addDefault("Error.NoBackupFound", "No Backup named '%file%' found.");
- messages.addDefault("Error.NoBackupSearch", "No backups for search argument '%input%' found.");
- messages.addDefault("Error.DeletionFailed", "Error while deleting '%file%'.");
- messages.addDefault("Error.FolderExists", "There is already a folder named '%file%'.");
- messages.addDefault("Error.ZipExists", "There is already a ZIP file named '%file%.zip'.");
- messages.addDefault("Error.NoFtpBackups", "No ftp backups found.");
- messages.addDefault("Error.NoTasks", "No backup tasks are running.");
- messages.addDefault("Error.AlreadyZip", "%file% is already a ZIP file.");
- messages.addDefault("Error.NotAZip", "%file% is not a ZIP file.");
- messages.addDefault("Error.NotANumber", "%input% is not a valid number.");
- messages.addDefault("Error.BackupFailed", "An error occurred while saving Backup [%file%]. See console for more information.");
- messages.addDefault("Error.FtpUploadFailed", "Ftp: Error while uploading backup to ftp server. Check server details in config.yml (ip, port, user, password).");
- messages.addDefault("Error.FtpDownloadFailed", "Ftp: Error while downloading backup to ftp server. Check server details in config.yml (ip, port, user, password).");
- messages.addDefault("Error.FtpLocalDeletionFailed", "Ftp: Local backup deletion failed because the uploaded file was not found on the ftp server. Try again.");
- messages.addDefault("Error.FtpNotFound", "Ftp: ftp-backup %file% not found.");
- messages.addDefault("Error.FtpConnectionFailed", "Ftp: Error while connecting to FTP server.");
-
- saveMessages();
-
- prefix = ((messages.getString("Prefix").equals("")) ? messages.getString("Prefix") : (messages.getString("Prefix") + " "));
- }
-
- public void saveMessages() {
- try {
- messages.save(messagesFile);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- public String processMessage(String msgCode) {
- return (prefix + messages.getString(msgCode)).replace("&nl", "\n").replace("&", "§");
- }
-
- public void startTimer() {
- if (getConfig().getBoolean("AutomaticBackups")) {
- Bukkit.getScheduler().runTaskTimerAsynchronously(this, new BackupTimer(), 20 * 20, 20 * 20);
- }
- }
-
- public void stopTimer() {
- Bukkit.getScheduler().cancelTasks(this);
- }
-
- // Events
- @EventHandler
- public void onJoin(PlayerJoinEvent e) {
- Player p = e.getPlayer();
-
- if (p.hasPermission("backup.update")) {
- if (getConfig().getBoolean("UpdateAvailableMessage")) {
- Bukkit.getScheduler().runTaskAsynchronously(this, () -> {
- int resourceID = 79320;
- try (InputStream inputStream = (new URL(
- "https://api.spigotmc.org/legacy/update.php?resource=" + resourceID)).openStream();
- Scanner scanner = new Scanner(inputStream)) {
- if (scanner.hasNext()) {
- String latest = scanner.next();
- String current = getDescription().getVersion();
-
- int late = Integer.parseInt(latest.replaceAll("\\.", ""));
- int curr = Integer.parseInt(current.replaceAll("\\.", ""));
-
- if (curr >= late) {
- } else {
- if (isUpdated) {
- p.sendMessage("§8=====§fServerBackup§8=====");
- p.sendMessage("");
- p.sendMessage("§7There was a newer version available - §a" + latest
- + "§7, you are on - §c" + current);
- p.sendMessage(
- "\n§7The latest version has been downloaded automatically, please reload the server to complete the update.");
- p.sendMessage("");
- p.sendMessage("§8=====§9Plugin by Seblii§8=====");
- } else {
- if (getConfig().getBoolean("AutomaticUpdates")) {
- if (p.hasPermission("backup.admin")) {
- p.sendMessage("§8=====§fServerBackup§8=====");
- p.sendMessage("");
- p.sendMessage("§7There is a newer version available - §a" + latest
- + "§7, you are on - §c" + current);
- p.sendMessage("");
- p.sendMessage("§8=====§9Plugin by Seblii§8=====");
- p.sendMessage("");
- p.sendMessage("ServerBackup§7: Automatic update started...");
-
- URL url = new URL(
- "https://server-backup.net/assets/downloads/ServerBackup.jar");
-
- int bVer = Integer.parseInt(
- Bukkit.getVersion().split(" ")[Bukkit.getVersion().split(" ").length
- - 1].replaceAll("\\)", "").replaceAll("\\.", ""));
-
- if (bVer < 118) {
- url = new URL(
- "https://server-backup.net/assets/downloads/alt/ServerBackup.jar");
- }
-
- try (InputStream in = url.openStream();
- ReadableByteChannel rbc = Channels.newChannel(in);
- FileOutputStream fos = new FileOutputStream(
- "plugins/ServerBackup.jar")) {
- fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
-
- p.sendMessage(
- "ServerBackup§7: Download finished. Please reload the server to complete the update.");
-
- isUpdated = true;
- }
- }
- } else {
- p.sendMessage("§8=====§fServerBackup§8=====");
- p.sendMessage("");
- p.sendMessage("§7There is a newer version available - §a" + latest
- + "§7, you are on - §c" + current);
- p.sendMessage(
- "§7Please download the latest version - §4https://server-backup.net/");
- p.sendMessage("");
- p.sendMessage("§8=====§9Plugin by Seblii§8=====");
- }
- }
- }
- }
- } catch (IOException exception) {
- }
- });
- }
- }
- }
-
-}
+package de.seblii.serverbackup;
+
+import org.apache.commons.io.FileUtils;
+import org.bstats.bukkit.Metrics;
+import org.bstats.charts.SimplePie;
+import org.bstats.charts.SingleLineChart;
+import org.bukkit.Bukkit;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.bukkit.scheduler.BukkitTask;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Scanner;
+import java.util.logging.Level;
+
+public class ServerBackup extends JavaPlugin implements Listener {
+
+ private static ServerBackup sb;
+
+ public static ServerBackup getInstance() {
+ return sb;
+ }
+
+ public String backupDestination = "Backups//";
+
+ final public File backupInfo = new File("plugins//ServerBackup//backupInfo.yml");
+ final public YamlConfiguration bpInf = YamlConfiguration.loadConfiguration(backupInfo);
+
+ final public File cloudInfo = new File("plugins//ServerBackup//cloudAccess.yml");
+ final public YamlConfiguration cloud = YamlConfiguration.loadConfiguration(cloudInfo);
+
+ final public File messagesFile = new File("plugins//ServerBackup//messages.yml");
+ final public YamlConfiguration messages = YamlConfiguration.loadConfiguration(messagesFile);
+
+ boolean isUpdated = false;
+
+ public boolean shutdownProgress = false;
+
+ public String prefix = "";
+
+ @Override
+ public void onDisable() {
+ stopTimer();
+
+ for (BukkitTask task : Bukkit.getScheduler().getPendingTasks()) {
+ task.cancel();
+
+ this.getLogger().log(Level.WARNING, "WARNING - ServerBackup: Task [" + task.getTaskId()
+ + "] cancelled due to server shutdown. There might be some unfinished Backups.");
+ }
+
+ this.getLogger().log(Level.INFO, "ServerBackup: Plugin disabled.");
+ }
+
+ @Override
+ public void onEnable() {
+ sb = this;
+
+ loadFiles();
+
+ Objects.requireNonNull(getCommand("backup")).setExecutor(new SBCommand());
+
+ Bukkit.getPluginManager().registerEvents(this, this); //CHANGE
+ Bukkit.getPluginManager().registerEvents(new DynamicBackup(), this);
+
+ startTimer();
+
+ this.getLogger().log(Level.INFO, "ServerBackup: Plugin enabled.");
+
+ if (getConfig().getBoolean("UpdateAvailableMessage")) {
+ checkVersion(); //CHANGE
+ }
+
+ int mpid = 14673; //17639 //CHANGE
+
+ Metrics metrics = new Metrics(this, mpid);
+
+ metrics.addCustomChart(new SimplePie("player_per_server", () -> String.valueOf(Bukkit.getOnlinePlayers().size())));
+
+ metrics.addCustomChart(new SimplePie("using_ftp_server", () -> {
+ if (getConfig().getBoolean("Ftp.UploadBackup")) {
+ return "yes";
+ } else {
+ return "no";
+ }
+ }));
+
+ metrics.addCustomChart(new SimplePie("using_dropbox", () -> {
+ if (getConfig().getBoolean("CloudBackup.Dropbox")) {
+ return "yes";
+ } else {
+ return "no";
+ }
+ }));
+
+ metrics.addCustomChart(new SimplePie("using_gdrive", () -> {
+ if (getConfig().getBoolean("CloudBackup.GoogleDrive")) {
+ return "yes";
+ } else {
+ return "no";
+ }
+ }));
+
+ metrics.addCustomChart(new SingleLineChart("total_backup_space", () -> {
+ File file = new File(backupDestination);
+
+ double fileSize = (double) FileUtils.sizeOf(file) / 1000 / 1000;
+ fileSize = Math.round(fileSize * 100.0) / 100.0;
+
+ return (int) fileSize;
+ }));
+ }
+
+ private void checkVersion() {
+ this.getLogger().log(Level.INFO, "ServerBackup: Searching for updates...");
+
+ Bukkit.getScheduler().runTaskAsynchronously(this, () -> {
+ int resourceID = 79320;
+ try (InputStream inputStream = (new URL(
+ "https://api.spigotmc.org/legacy/update.php?resource=" + resourceID)).openStream();
+ Scanner scanner = new Scanner(inputStream)) {
+ if (scanner.hasNext()) {
+ String latest = scanner.next();
+ String current = getDescription().getVersion();
+
+ int late = Integer.parseInt(latest.replaceAll("\\.", ""));
+ int curr = Integer.parseInt(current.replaceAll("\\.", ""));
+
+ if (curr >= late) {
+ this.getLogger().log(Level.INFO,
+ "ServerBackup: No updates found. The server is running the latest version.");
+ } else {
+ this.getLogger().log(Level.INFO, "ServerBackup: There is a newer version available - " + latest
+ + ", you are on - " + current);
+
+ if (getConfig().getBoolean("AutomaticUpdates")) {
+ this.getLogger().log(Level.INFO, "ServerBackup: Downloading newest version...");
+
+ URL url = new URL("https://server-backup.net/assets/downloads/alt/ServerBackup.jar");
+
+ if (Bukkit.getVersion().contains("1.18") || Bukkit.getVersion().contains("1.19")) {
+ url = new URL("https://server-backup.net/assets/downloads/ServerBackup.jar");
+ }
+
+ try (InputStream in = url.openStream();
+ ReadableByteChannel rbc = Channels.newChannel(in);
+ FileOutputStream fos = new FileOutputStream("plugins/ServerBackup.jar")) {
+ fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+
+ this.getLogger().log(Level.INFO,
+ "ServerBackup: Download finished. Please reload the server to complete the update.");
+
+ isUpdated = true;
+ }
+ } else {
+ this.getLogger().log(Level.INFO,
+ "ServerBackup: Please download the latest version - https://server-backup.net/");
+ }
+ }
+ }
+ } catch (IOException exception) {
+ this.getLogger().log(Level.WARNING,
+ "ServerBackup: Cannot search for updates - " + exception.getMessage());
+ }
+ });
+
+ }
+
+ @SuppressWarnings("deprecation")
+ public void loadFiles() {
+ if (getConfig().contains("BackupDestination")) {
+ backupDestination = getConfig().getString("BackupDestination");
+ }
+ assert backupDestination != null;
+ if (!Files.exists(Paths.get(backupDestination))) {
+ try {
+ Files.createDirectories(Paths.get(backupDestination));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ File files = new File(backupDestination + "//Files");
+
+ if (!files.exists()) {
+ files.mkdir();
+ }
+
+ getConfig().options()
+ .header("BackupTimer = At what time should a Backup be created? The format is: 'hh-mm' e.g. '12-30'."
+ + "\nDeleteOldBackups = Deletes old backups automatically after a specific time (in days, standard = 7 days)"
+ + "\nDeleteOldBackups - Type '0' at DeleteOldBackups to disable the deletion of old backups."
+ + "\nBackupLimiter = Deletes old backups automatically if number of total backups is greater than this number (e.g. if you enter '5' - the oldest backup will be deleted if there are more than 5 backups, so you will always keep the latest 5 backups)"
+ + "\nBackupLimiter - Type '0' to disable this feature. If you don't type '0' the feature 'DeleteOldBackups' will be disabled and this feature ('BackupLimiter') will be enabled."
+ + "\nKeepUniqueBackups - Type 'true' to disable the deletion of unique backups. The plugin will keep the newest backup of all backed up worlds or folders, no matter how old it is."
+ + "\nBlacklist - A list of files/directories that will not be backed up."
+ + "\nIMPORTANT FTP information: Set 'UploadBackup' to 'true' if you want to store your backups on a ftp server (sftp does not work at the moment - if you host your own server (e.g. vps/root server) you need to set up a ftp server on it)."
+ + "\nIf you use ftp backups, you can set 'DeleteLocalBackup' to 'true' if you want the plugin to remove the created backup from your server once it has been uploaded to your ftp server."
+ + "\nCurrently WebDav doesn't Support uploading directly to the root directory so don't leave the destination blank."
+ + "\n"
+ + "\nJoin the discord server if you need help or have a question: https://discord.gg/rNzngsCWFC");
+ getConfig().options().copyDefaults(true);
+
+ getConfig().addDefault("AutomaticBackups", true);
+
+ List days = new ArrayList<>();
+ days.add("MONDAY");
+ days.add("TUESDAY");
+ days.add("WEDNESDAY");
+ days.add("THURSDAY");
+ days.add("FRIDAY");
+ days.add("SATURDAY");
+ days.add("SUNDAY");
+
+ List times = new ArrayList<>();
+ times.add("00-00");
+
+ getConfig().addDefault("BackupTimer.Days", days);
+ getConfig().addDefault("BackupTimer.Times", times);
+
+ List worlds = new ArrayList<>();
+ worlds.add("world");
+ worlds.add("world_nether");
+ worlds.add("world_the_end");
+
+ getConfig().addDefault("BackupWorlds", worlds);
+
+ List blacklist = new ArrayList<>();
+ blacklist.add("libraries");
+ blacklist.add("plugins/ServerBackup/config.yml");
+
+ getConfig().addDefault("Blacklist", blacklist);
+
+ getConfig().addDefault("DeleteOldBackups", 14);
+ getConfig().addDefault("BackupLimiter", 0);
+
+ getConfig().addDefault("KeepUniqueBackups", false);
+
+ getConfig().addDefault("UpdateAvailableMessage", true);
+ getConfig().addDefault("AutomaticUpdates", true);
+
+ getConfig().addDefault("BackupDestination", "Backups//");
+
+ getConfig().addDefault("CloudBackup.Dropbox", false);
+ getConfig().addDefault("CloudBackup.WebDav", false);
+ //getConfig().addDefault("CloudBackup.GoogleDrive", true); //CHANGE
+ getConfig().addDefault("CloudBackup.Options.DeleteLocalBackup", false);
+
+ getConfig().addDefault("Ftp.UploadBackup", false);
+ getConfig().addDefault("Ftp.DeleteLocalBackup", false);
+ getConfig().addDefault("Ftp.Server.IP", "127.0.0.1");
+ getConfig().addDefault("Ftp.Server.Port", 21);
+ getConfig().addDefault("Ftp.Server.User", "username");
+ getConfig().addDefault("Ftp.Server.Password", "password");
+ getConfig().addDefault("Ftp.Server.BackupDirectory", "Backups/");
+
+ getConfig().addDefault("DynamicBackup", false);
+ getConfig().addDefault("SendLogMessages", false);
+
+ saveConfig();
+
+ backupDestination = getConfig().getString("BackupDestination");
+
+ if (getConfig().getBoolean("DynamicBackup")) {
+ loadBpInf();
+ }
+
+ if (getConfig().getBoolean("CloudBackup.Dropbox")) {
+ loadDropbox();
+ }
+
+ if (getConfig().getBoolean("CloudBackup.WebDav")) {
+ loadWebDav();
+ }
+
+ loadMessages();
+ }
+
+ public void loadDropbox() {
+ if (!cloudInfo.exists()) {
+ try {
+ cloudInfo.createNewFile();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ cloud.options().header("Dropbox - Watch this video for explanation: https://youtu.be/k-0aIohxRUA"
+ /*+"Google Drive - Watch this video for explanation: x"*/);
+
+ if(!cloud.contains("Cloud.Dropbox")) {
+ cloud.set("Cloud.Dropbox.AppKey", "appKey");
+ cloud.set("Cloud.Dropbox.AppSecret", "appSecret");
+ cloud.set("Cloud.Dropbox.Destination", "Backup/");
+ } else {
+ if(!Objects.equals(cloud.getString("Cloud.Dropbox.AppKey"), "appKey") && !cloud.contains("Cloud.Dropbox.ActivationLink")) {
+ cloud.set("Cloud.Dropbox.ActivationLink", "https://www.dropbox.com/oauth2/authorize?client_id=" + cloud.getString("Cloud.Dropbox.AppKey") + "&response_type=code&token_access_type=offline");
+ if(!cloud.contains("Cloud.Dropbox.AccessToken")) {
+ cloud.set("Cloud.Dropbox.AccessToken", "accessToken");
+ }
+ }
+ }
+
+ saveCloud();
+ }
+
+ private void loadWebDav() {
+ if (!cloudInfo.exists()) {
+ try {
+ cloudInfo.createNewFile();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ if(!cloud.contains("Cloud.WebDav")) {
+ cloud.set("Cloud.WebDav.Url", "url");
+ cloud.set("Cloud.WebDav.Username", "username");
+ cloud.set("Cloud.WebDav.Password", "password");
+ cloud.set("Cloud.WebDav.Destination", "Backup/");
+ }
+
+ saveCloud();
+ }
+
+ public void saveCloud() {
+ try {
+ cloud.save(cloudInfo);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void loadBpInf() {
+ if (!backupInfo.exists()) {
+ try {
+ backupInfo.createNewFile();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ saveBpInf();
+ }
+
+ public void saveBpInf() {
+ try {
+ bpInf.save(backupInfo);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void loadMessages() {
+ if (!messagesFile.exists()) {
+ try {
+ messagesFile.createNewFile();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ messages.options().header("Use '&nl' to add a new line. Use '&' for color codes (e.g. '&4' for color red). For some messages you can use a placeholder (e.g. '%file%' for file name)." +
+ "\nMinecraft color codes: https://htmlcolorcodes.com/minecraft-color-codes/");
+ messages.options().copyDefaults(true);
+
+ messages.addDefault("Prefix", "");
+
+ messages.addDefault("Command.Zip.Header", "Zipping Backup..."
+ + "&nl");
+ messages.addDefault("Command.Zip.Footer", "&nl"
+ + "&nlBackup [%file%] zipped."
+ + "&nlBackup [%file%] saved.");
+ messages.addDefault("Command.Unzip.Header", "Unzipping Backup..."
+ + "&nl");
+ messages.addDefault("Command.Unzip.Footer", "&nl"
+ + "&nlBackup [%file%] unzipped.");
+ messages.addDefault("Command.Reload", "Config reloaded.");
+ messages.addDefault("Command.Tasks.Header", "----- Backup tasks -----"
+ + "&nl");
+ messages.addDefault("Command.Tasks.Footer", "&nl"
+ + "----- Backup tasks -----");
+ messages.addDefault("Command.Shutdown.Start", "The server will shut down after backup tasks (check with: '/backup tasks') are finished."
+ + "&nlYou can cancel the shutdown by running this command again.");
+ messages.addDefault("Command.Shutdown.Cancel", "Shutdown canceled.");
+
+ messages.addDefault("Info.BackupFinished", "Backup [%file%] saved.");
+ messages.addDefault("Info.BackupStarted", "Backup [%file%] started.");
+ messages.addDefault("Info.BackupRemoved", "[%file%] removed.");
+ messages.addDefault("Info.FtpUpload", "Ftp: Uploading backup [%file%] ...");
+ messages.addDefault("Info.FtpUploadSuccess", "Ftp: Upload successfully. Backup stored on ftp server.");
+ messages.addDefault("Info.FtpDownload", "Ftp: Downloading backup [%file%] ...");
+ messages.addDefault("Info.FtpDownloadSuccess", "Ftp: Download successful. Backup downloaded from ftp server.");
+
+ messages.addDefault("Error.NoPermission", "&cI'm sorry but you do not have permission to perform this command.");
+ messages.addDefault("Error.NoBackups", "No backups found.");
+ messages.addDefault("Error.NoBackupFound", "No Backup named '%file%' found.");
+ messages.addDefault("Error.NoBackupSearch", "No backups for search argument '%input%' found.");
+ messages.addDefault("Error.DeletionFailed", "Error while deleting '%file%'.");
+ messages.addDefault("Error.FolderExists", "There is already a folder named '%file%'.");
+ messages.addDefault("Error.ZipExists", "There is already a ZIP file named '%file%.zip'.");
+ messages.addDefault("Error.NoFtpBackups", "No ftp backups found.");
+ messages.addDefault("Error.NoTasks", "No backup tasks are running.");
+ messages.addDefault("Error.AlreadyZip", "%file% is already a ZIP file.");
+ messages.addDefault("Error.NotAZip", "%file% is not a ZIP file.");
+ messages.addDefault("Error.NotANumber", "%input% is not a valid number.");
+ messages.addDefault("Error.BackupFailed", "An error occurred while saving Backup [%file%]. See console for more information.");
+ messages.addDefault("Error.FtpUploadFailed", "Ftp: Error while uploading backup to ftp server. Check server details in config.yml (ip, port, user, password).");
+ messages.addDefault("Error.FtpDownloadFailed", "Ftp: Error while downloading backup to ftp server. Check server details in config.yml (ip, port, user, password).");
+ messages.addDefault("Error.FtpLocalDeletionFailed", "Ftp: Local backup deletion failed because the uploaded file was not found on the ftp server. Try again.");
+ messages.addDefault("Error.FtpNotFound", "Ftp: ftp-backup %file% not found.");
+ messages.addDefault("Error.FtpConnectionFailed", "Ftp: Error while connecting to FTP server.");
+
+ saveMessages();
+
+ prefix = ((Objects.equals(messages.getString("Prefix"), "")) ? messages.getString("Prefix") : (messages.getString("Prefix") + " "));
+ }
+
+ public void saveMessages() {
+ try {
+ messages.save(messagesFile);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public String processMessage(String msgCode) {
+ return (prefix + messages.getString(msgCode)).replace("&nl", "\n").replace("&", "§");
+ }
+
+ public void startTimer() {
+ if (getConfig().getBoolean("AutomaticBackups")) {
+ Bukkit.getScheduler().runTaskTimerAsynchronously(this, new BackupTimer(), 20 * 20, 20 * 20);
+ }
+ }
+
+ public void stopTimer() {
+ Bukkit.getScheduler().cancelTasks(this);
+ }
+
+ // Events
+ @EventHandler
+ public void onJoin(PlayerJoinEvent e) {
+ Player p = e.getPlayer();
+
+ if (p.hasPermission("backup.update")) {
+ if (getConfig().getBoolean("UpdateAvailableMessage")) {
+ Bukkit.getScheduler().runTaskAsynchronously(this, () -> {
+ int resourceID = 79320;
+ try (InputStream inputStream = (new URL(
+ "https://api.spigotmc.org/legacy/update.php?resource=" + resourceID)).openStream();
+ Scanner scanner = new Scanner(inputStream)) {
+ if (scanner.hasNext()) {
+ String latest = scanner.next();
+ String current = getDescription().getVersion();
+
+ int late = Integer.parseInt(latest.replaceAll("\\.", ""));
+ int curr = Integer.parseInt(current.replaceAll("\\.", ""));
+
+ if (!(curr >= late)) {
+ if (isUpdated) {
+ p.sendMessage("§8=====§fServerBackup§8=====");
+ p.sendMessage("");
+ p.sendMessage("§7There was a newer version available - §a" + latest
+ + "§7, you are on - §c" + current);
+ p.sendMessage(
+ "\n§7The latest version has been downloaded automatically, please reload the server to complete the update.");
+ p.sendMessage("");
+ p.sendMessage("§8=====§9Plugin by Seblii§8=====");
+ } else {
+ if (getConfig().getBoolean("AutomaticUpdates")) {
+ if (p.hasPermission("backup.admin")) {
+ p.sendMessage("§8=====§fServerBackup§8=====");
+ p.sendMessage("");
+ p.sendMessage("§7There is a newer version available - §a" + latest
+ + "§7, you are on - §c" + current);
+ p.sendMessage("");
+ p.sendMessage("§8=====§9Plugin by Seblii§8=====");
+ p.sendMessage("");
+ p.sendMessage("ServerBackup§7: Automatic update started...");
+
+ URL url = new URL(
+ "https://server-backup.net/assets/downloads/ServerBackup.jar");
+
+ int bVer = Integer.parseInt(
+ Bukkit.getVersion().split(" ")[Bukkit.getVersion().split(" ").length
+ - 1].replaceAll("\\)", "").replaceAll("\\.", ""));
+
+ if (bVer < 118) {
+ url = new URL(
+ "https://server-backup.net/assets/downloads/alt/ServerBackup.jar");
+ }
+
+ try (InputStream in = url.openStream();
+ ReadableByteChannel rbc = Channels.newChannel(in);
+ FileOutputStream fos = new FileOutputStream(
+ "plugins/ServerBackup.jar")) {
+ fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+
+ p.sendMessage(
+ "ServerBackup§7: Download finished. Please reload the server to complete the update.");
+
+ isUpdated = true;
+ }
+ }
+ } else {
+ p.sendMessage("§8=====§fServerBackup§8=====");
+ p.sendMessage("");
+ p.sendMessage("§7There is a newer version available - §a" + latest
+ + "§7, you are on - §c" + current);
+ p.sendMessage(
+ "§7Please download the latest version - §4https://server-backup.net/");
+ p.sendMessage("");
+ p.sendMessage("§8=====§9Plugin by Seblii§8=====");
+ }
+ }
+ }
+ }
+ } catch (IOException ignored) {
+ }
+ });
+ }
+ }
+ }
+
+}
diff --git a/src/de/seblii/serverbackup/ZipManager.java b/src/main/java/de/seblii/serverbackup/ZipManager.java
similarity index 76%
rename from src/de/seblii/serverbackup/ZipManager.java
rename to src/main/java/de/seblii/serverbackup/ZipManager.java
index 6d52d0cf..78ecc41e 100644
--- a/src/de/seblii/serverbackup/ZipManager.java
+++ b/src/main/java/de/seblii/serverbackup/ZipManager.java
@@ -1,261 +1,288 @@
-package de.seblii.serverbackup;
-
-import de.seblii.serverbackup.utils.DropboxManager;
-import de.seblii.serverbackup.utils.FtpManager;
-import org.apache.commons.io.FileUtils;
-import org.bukkit.Bukkit;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.logging.Level;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-import java.util.zip.ZipOutputStream;
-
-public class ZipManager {
-
- private String sourceFilePath;
- private String targetFilePath;
- private CommandSender sender;
- private boolean sendDebugMsg;
- private boolean isSaving;
- private boolean fullBackup;
-
- private ServerBackup backup = ServerBackup.getInstance();
-
- public ZipManager(String sourceFilePath, String targetFilePath, CommandSender sender, boolean sendDebugMsg,
- boolean isSaving, boolean fullBackup) {
- this.sourceFilePath = sourceFilePath;
- this.targetFilePath = targetFilePath;
- this.sender = sender;
- this.sendDebugMsg = sendDebugMsg;
- this.isSaving = isSaving;
- this.fullBackup = fullBackup;
- }
-
- public void zip() throws IOException {
- Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
- long sTime = System.nanoTime();
-
- ServerBackup.getInstance().getLogger().log(Level.INFO, "");
- ServerBackup.getInstance().getLogger().log(Level.INFO, "ServerBackup | Start zipping...");
- ServerBackup.getInstance().getLogger().log(Level.INFO, "");
-
- Path p;
- try {
- p = Files.createFile(Paths.get(targetFilePath));
- } catch (IOException e) {
- e.printStackTrace();
- ServerBackup.getInstance().getLogger().log(Level.WARNING, "Error while zipping files.");
- return;
- }
-
- try (ZipOutputStream zs = new ZipOutputStream(Files.newOutputStream(p))) {
- Path pp = Paths.get(sourceFilePath);
- Files.walk(pp).filter(path -> !Files.isDirectory(path)).forEach(path -> {
- if (!path.toString().contains(ServerBackup.getInstance().getConfig().getString("BackupDestination")
- .replaceAll("/", ""))) {
- ZipEntry zipEntry = new ZipEntry(pp.relativize(path).toString());
-
- for (String blacklist : ServerBackup.getInstance().getConfig().getStringList("Blacklist")) {
- File bl = new File(blacklist);
-
- if (bl.isDirectory()) {
- if (path.toFile().getParent().toString().startsWith(bl.toString())
- || path.toFile().getParent().toString().startsWith(".\\" + bl.toString())) {
- return;
- }
- } else {
- if (path.equals(new File(blacklist).toPath())
- || path.equals(new File(".\\" + blacklist).toPath())) {
- sender.sendMessage("Found '" + path.toString() + "' in blacklist. Skipping file.");
- return;
- }
- }
- }
-
- if (!fullBackup) {
- if (ServerBackup.getInstance().getConfig().getBoolean("DynamicBackup")) {
- if (path.getParent().toString().endsWith("region")
- || path.getParent().toString().endsWith("entities")
- || path.getParent().toString().endsWith("poi")) {
- boolean found = false;
- if (ServerBackup.getInstance().bpInf
- .contains("Data." + path.getParent().getParent().toString() + ".Chunk."
- + path.getFileName().toString())) {
- found = true;
- }
-
- if (!found)
- return;
- }
- }
- }
-
- try {
- if (sendDebugMsg) {
- if (ServerBackup.getInstance().getConfig().getBoolean("SendLogMessages")) {
- ServerBackup.getInstance().getLogger().log(Level.INFO,
- "Zipping '" + path.toString() + "'");
-
- if (Bukkit.getConsoleSender() != sender) {
- sender.sendMessage("Zipping '" + path.toString());
- }
- }
- }
-
- zs.putNextEntry(zipEntry);
-
- if (System.getProperty("os.name").startsWith("Windows")
- && path.toString().contains("session.lock")) {
- } else {
- try {
- Files.copy(path, zs);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- zs.closeEntry();
- } catch (IOException e) {
- e.printStackTrace();
- ServerBackup.getInstance().getLogger().log(Level.WARNING, "Error while zipping files.");
- return;
- }
- }
- });
- } catch (IOException e) {
- e.printStackTrace();
- ServerBackup.getInstance().getLogger().log(Level.WARNING, "Error while zipping files.");
- return;
- }
-
- long time = (System.nanoTime() - sTime) / 1000000;
-
- ServerBackup.getInstance().getLogger().log(Level.INFO, "");
- ServerBackup.getInstance().getLogger().log(Level.INFO, "ServerBackup | Files zipped. [" + time + "ms]");
- ServerBackup.getInstance().getLogger().log(Level.INFO, "");
-
- if (!isSaving) {
- File file = new File(sourceFilePath);
-
- try {
- FileUtils.deleteDirectory(file);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- sender.sendMessage(backup.processMessage("Command.Zip.Footer").replaceAll("%file%", sourceFilePath));
-
- BackupManager.tasks.remove("CREATE {" + sourceFilePath.replace("\\", "/") + "}");
-
- if (!fullBackup) {
- if (ServerBackup.getInstance().getConfig().getBoolean("DynamicBackup")) {
- if (!sourceFilePath.equalsIgnoreCase(".")) {
- ServerBackup.getInstance().bpInf.set("Data." + sourceFilePath, "");
-
- new File(targetFilePath).renameTo(new File(targetFilePath.split("backup")[0] + "dynamic-backup"
- + targetFilePath.split("backup")[1]));
- targetFilePath = targetFilePath.split("backup")[0] + "dynamic-backup"
- + targetFilePath.split("backup")[1];
-
- ServerBackup.getInstance().saveBpInf();
- }
- }
- }
-
- if (ServerBackup.getInstance().getConfig().getBoolean("Ftp.UploadBackup")) {
- FtpManager ftpm = new FtpManager(sender);
- ftpm.uploadFileToFtp(targetFilePath, false);
- }
-
- if(ServerBackup.getInstance().getConfig().getBoolean("CloudBackup.Dropbox")) {
- DropboxManager dm = new DropboxManager(sender);
- dm.uploadToDropbox(targetFilePath);
- }
-
- // CHANGE
- /*if(ServerBackup.getInstance().getConfig().getBoolean("CloudBackup.GoogleDrive")) {
- GDriveManager.uploadBasic(targetFilePath);
- }*/
-
- for (Player all : Bukkit.getOnlinePlayers()) {
- if (all.hasPermission("backup.notification")) {
- all.sendMessage(backup.processMessage("Info.BackupFinished").replaceAll("%file%", sourceFilePath));
- }
- }
- });
-
- }
-
- public void unzip() {
- Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
-
- long sTime = System.nanoTime();
-
- ServerBackup.getInstance().getLogger().log(Level.INFO, "");
- ServerBackup.getInstance().getLogger().log(Level.INFO, "ServerBackup | Start unzipping...");
- ServerBackup.getInstance().getLogger().log(Level.INFO, "");
-
- byte[] buffer = new byte[1024];
- try {
- File folder = new File(targetFilePath);
- if (!folder.exists()) {
- folder.mkdir();
- }
- ZipInputStream zis = new ZipInputStream(new FileInputStream(sourceFilePath));
- ZipEntry ze = zis.getNextEntry();
- while (ze != null) {
- String fileName = ze.getName();
- File newFile = new File(targetFilePath + File.separator + fileName);
-
- if (sendDebugMsg) {
- if (ServerBackup.getInstance().getConfig().getBoolean("SendLogMessages")) {
- ServerBackup.getInstance().getLogger().log(Level.INFO, "Unzipping '" + newFile.getPath());
-
- if (Bukkit.getConsoleSender() != sender) {
- sender.sendMessage("Unzipping '" + newFile.getPath());
- }
- }
- }
-
- new File(newFile.getParent()).mkdirs();
- FileOutputStream fos = new FileOutputStream(newFile);
- int len;
- while ((len = zis.read(buffer)) > 0) {
- fos.write(buffer, 0, len);
- }
- fos.close();
- ze = zis.getNextEntry();
- }
- zis.closeEntry();
- zis.close();
- } catch (IOException e) {
- e.printStackTrace();
- ServerBackup.getInstance().getLogger().log(Level.WARNING, "Error while unzipping files.");
- return;
- }
-
- long time = (System.nanoTime() - sTime) / 1000000;
-
- ServerBackup.getInstance().getLogger().log(Level.INFO, "");
- ServerBackup.getInstance().getLogger().log(Level.INFO, "ServerBackup | Files unzipped. [" + time + "ms]");
- ServerBackup.getInstance().getLogger().log(Level.INFO, "");
-
- File file = new File(sourceFilePath);
-
- file.delete();
-
- sender.sendMessage(backup.processMessage("Command.Unzip.Footer").replaceAll("%file%", sourceFilePath));
- });
- }
-
-}
+package de.seblii.serverbackup;
+
+import de.seblii.serverbackup.utils.DropboxManager;
+import de.seblii.serverbackup.utils.FtpManager;
+import de.seblii.serverbackup.utils.WebDavManager;
+import org.apache.commons.io.FileUtils;
+import org.bukkit.Bukkit;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Objects;
+import java.util.logging.Level;
+import java.util.regex.Pattern;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+
+public class ZipManager {
+
+ private final String sourceFilePath;
+ private String targetFilePath;
+ private final CommandSender sender;
+ private final boolean sendDebugMsg;
+ private final boolean isSaving;
+ private final boolean fullBackup;
+
+ private final ServerBackup backup = ServerBackup.getInstance();
+
+ public ZipManager(String sourceFilePath, String targetFilePath, CommandSender sender, boolean sendDebugMsg,
+ boolean isSaving, boolean fullBackup) {
+ this.sourceFilePath = sourceFilePath;
+ this.targetFilePath = targetFilePath;
+ this.sender = sender;
+ this.sendDebugMsg = sendDebugMsg;
+ this.isSaving = isSaving;
+ this.fullBackup = fullBackup;
+ }
+
+ public void zip(){
+ Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
+ long sTime = System.nanoTime();
+
+ ServerBackup.getInstance().getLogger().log(Level.INFO, "");
+ ServerBackup.getInstance().getLogger().log(Level.INFO, "ServerBackup | Started zipping: " + sourceFilePath);
+ ServerBackup.getInstance().getLogger().log(Level.INFO, "");
+
+ Path p;
+ try {
+ p = Files.createFile(Paths.get(targetFilePath));
+ } catch (IOException e) {
+ e.printStackTrace();
+ ServerBackup.getInstance().getLogger().log(Level.WARNING, "Error while zipping files.");
+ return;
+ }
+
+ try (ZipOutputStream zs = new ZipOutputStream(Files.newOutputStream(p))) {
+ Path pp = Paths.get(sourceFilePath);
+ Files.walk(pp).filter(path -> !Files.isDirectory(path)).forEach(path -> {
+ if (!path.toString().contains(Objects.requireNonNull(ServerBackup.getInstance().getConfig().getString("BackupDestination"))
+ .replaceAll("/", ""))) {
+ ZipEntry zipEntry = new ZipEntry(pp.relativize(path).toString());
+
+ for (String blacklist : ServerBackup.getInstance().getConfig().getStringList("Blacklist")) {
+ File bl = new File(blacklist);
+
+ if (bl.isDirectory()) {
+ if (path.toFile().getParent().startsWith(bl.toString())
+ || path.toFile().getParent().startsWith(".\\" + bl)) {
+ return;
+ }
+ } else {
+ if (path.equals(new File(blacklist).toPath())
+ || path.equals(new File(".\\" + blacklist).toPath())) {
+ sender.sendMessage("Found '" + path + "' in blacklist. Skipping file.");
+ return;
+ }
+ }
+ }
+
+ if (!fullBackup) {
+ if (ServerBackup.getInstance().getConfig().getBoolean("DynamicBackup")) {
+ if (path.getParent().toString().endsWith("region")
+ || path.getParent().toString().endsWith("entities")
+ || path.getParent().toString().endsWith("poi")) {
+ boolean found = ServerBackup.getInstance().bpInf
+ .contains("Data." + path.getParent().getParent().toString() + ".Chunk."
+ + path.getFileName().toString());
+
+ if (!found)
+ return;
+ }
+ }
+ }
+
+ try {
+ if (sendDebugMsg) {
+ if (ServerBackup.getInstance().getConfig().getBoolean("SendLogMessages")) {
+ ServerBackup.getInstance().getLogger().log(Level.INFO,
+ "Zipping '" + path + "'");
+
+ if (Bukkit.getConsoleSender() != sender) {
+ sender.sendMessage("Zipping '" + path);
+ }
+ }
+ }
+
+ zs.putNextEntry(zipEntry);
+
+ if (!(System.getProperty("os.name").startsWith("Windows")
+ && path.toString().contains("session.lock"))) {
+ try {
+ Files.copy(path, zs);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ zs.closeEntry();
+ } catch (IOException e) {
+ e.printStackTrace();
+ ServerBackup.getInstance().getLogger().log(Level.WARNING, "Error while zipping files.");
+ }
+ }
+ });
+ } catch (IOException e) {
+ e.printStackTrace();
+ ServerBackup.getInstance().getLogger().log(Level.WARNING, "Error while zipping files.");
+ return;
+ }
+
+ long time = (System.nanoTime() - sTime) / 1000000;
+
+ ServerBackup.getInstance().getLogger().log(Level.INFO, "");
+ ServerBackup.getInstance().getLogger().log(Level.INFO, "ServerBackup | Files zipped. [" + time + "ms]");
+ ServerBackup.getInstance().getLogger().log(Level.INFO, "");
+
+ if (!isSaving) {
+ File file = new File(sourceFilePath);
+
+ try {
+ FileUtils.deleteDirectory(file);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ sender.sendMessage(backup.processMessage("Command.Zip.Footer").replaceAll("%file%", sourceFilePath));
+
+ BackupManager.tasks.remove("CREATE {" + sourceFilePath.replace("\\", "/") + "}");
+
+ if (!fullBackup) {
+ if (ServerBackup.getInstance().getConfig().getBoolean("DynamicBackup")) {
+ if (!sourceFilePath.equalsIgnoreCase(".")) {
+ ServerBackup.getInstance().bpInf.set("Data." + sourceFilePath, "");
+
+ new File(targetFilePath).renameTo(new File(targetFilePath.split("backup")[0] + "dynamic-backup"
+ + targetFilePath.split("backup")[1]));
+ targetFilePath = targetFilePath.split("backup")[0] + "dynamic-backup"
+ + targetFilePath.split("backup")[1];
+
+ ServerBackup.getInstance().saveBpInf();
+ }
+ }
+ }
+
+ if (ServerBackup.getInstance().getConfig().getBoolean("Ftp.UploadBackup")) {
+ FtpManager ftpm = new FtpManager(sender);
+ ftpm.uploadFileToFtp(targetFilePath, false);
+ }
+
+ if(ServerBackup.getInstance().getConfig().getBoolean("CloudBackup.Dropbox")) {
+ DropboxManager dm = new DropboxManager(sender);
+ dm.uploadToDropbox(targetFilePath);
+ }
+
+ if(ServerBackup.getInstance().getConfig().getBoolean("CloudBackup.WebDav")) {
+ WebDavManager webDav = new WebDavManager(sender);
+
+ try {
+ webDav.uploadToWebDav(targetFilePath);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ // CHANGE
+// if(ServerBackup.getInstance().getConfig().getBoolean("CloudBackup.GoogleDrive")) {
+// GDriveManager.uploadBasic(targetFilePath);
+// }
+
+ for (Player all : Bukkit.getOnlinePlayers()) {
+ if (all.hasPermission("backup.notification")) {
+ all.sendMessage(backup.processMessage("Info.BackupFinished").replaceAll("%file%", sourceFilePath));
+ }
+ }
+ });
+
+ }
+
+ private void uploadToWebDav() {
+ WebDavManager webDav = new WebDavManager(sender);
+
+ String updatedFilePath = targetFilePath.replaceFirst(Pattern.quote(ServerBackup.getInstance().backupDestination), "");
+ updatedFilePath = updatedFilePath.substring(2);
+
+ try {
+ webDav.uploadToWebDav(updatedFilePath);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void unzip() {
+ Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
+
+ long sTime = System.nanoTime();
+
+ ServerBackup.getInstance().getLogger().log(Level.INFO, "");
+ ServerBackup.getInstance().getLogger().log(Level.INFO, "ServerBackup | Start unzipping: " + sourceFilePath);
+ ServerBackup.getInstance().getLogger().log(Level.INFO, "");
+
+ byte[] buffer = new byte[1024];
+ try {
+ File folder = new File(targetFilePath);
+ if (!folder.exists()) {
+ folder.mkdir();
+ }
+ ZipInputStream zis = new ZipInputStream(Files.newInputStream(Paths.get(sourceFilePath)));
+ ZipEntry ze = zis.getNextEntry();
+ while (ze != null) {
+ String fileName = ze.getName();
+ File newFile = new File(targetFilePath + File.separator + fileName);
+
+ if (sendDebugMsg) {
+ if (ServerBackup.getInstance().getConfig().getBoolean("SendLogMessages")) {
+ ServerBackup.getInstance().getLogger().log(Level.INFO, "Unzipping '" + newFile.getPath());
+
+ if (Bukkit.getConsoleSender() != sender) {
+ sender.sendMessage("Unzipping '" + newFile.getPath());
+ }
+ }
+ }
+
+ new File(newFile.getParent()).mkdirs();
+ FileOutputStream fos = new FileOutputStream(newFile);
+ if (!newFile.toPath().normalize().startsWith(targetFilePath)) {
+ throw new Exception("Bad zip entry");
+ }
+ int len;
+ while ((len = zis.read(buffer)) > 0) {
+ fos.write(buffer, 0, len);
+ }
+ fos.close();
+ ze = zis.getNextEntry();
+ }
+ zis.closeEntry();
+ zis.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ ServerBackup.getInstance().getLogger().log(Level.WARNING, "Error while unzipping files.");
+ return;
+ }
+
+ long time = (System.nanoTime() - sTime) / 1000000;
+
+ ServerBackup.getInstance().getLogger().log(Level.INFO, "");
+ ServerBackup.getInstance().getLogger().log(Level.INFO, "ServerBackup | Files unzipped. [" + time + "ms]");
+ ServerBackup.getInstance().getLogger().log(Level.INFO, "");
+
+ File file = new File(sourceFilePath);
+
+ try {
+ Files.delete(file.toPath());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ sender.sendMessage(backup.processMessage("Command.Unzip.Footer").replaceAll("%file%", sourceFilePath));
+ });
+ }
+
+}
diff --git a/src/main/java/de/seblii/serverbackup/commands/CreateCommand.java b/src/main/java/de/seblii/serverbackup/commands/CreateCommand.java
new file mode 100644
index 00000000..e1831bc3
--- /dev/null
+++ b/src/main/java/de/seblii/serverbackup/commands/CreateCommand.java
@@ -0,0 +1,62 @@
+package de.seblii.serverbackup.commands;
+
+import com.google.common.io.Files;
+import de.seblii.serverbackup.BackupManager;
+import de.seblii.serverbackup.ServerBackup;
+import org.apache.commons.io.FilenameUtils;
+import org.bukkit.Bukkit;
+import org.bukkit.command.CommandSender;
+
+import java.io.File;
+import java.io.IOException;
+
+public class CreateCommand implements ServerCommand{
+ @Override
+ public boolean execute(CommandSender sender, String[] args, ServerBackup backup) {
+ if (args.length < 2) {
+ sender.sendMessage("Invalid arguments provided. Correct usage: /backup create [-full]");
+ return false;
+ }
+ StringBuilder fileName = new StringBuilder(args[1]);
+
+ boolean fullBackup = false;
+ if (args.length > 2) {
+ for (int i = 2; i < args.length; i++) {
+ if (args[i].equalsIgnoreCase("-full")) {
+ fullBackup = true;
+ } else {
+ fileName.append(" ").append(args[i]);
+ }
+ }
+ }
+
+ File file = new File(fileName.toString());
+
+ if (!file.isDirectory() && !args[1].equalsIgnoreCase("@server")) {
+ Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
+ try {
+ File des = new File(ServerBackup.getInstance().backupDestination + "//Files//"
+ + file.getName().replaceAll("/", "-"));
+
+ if (des.exists()) {
+ des = new File(des.getPath()
+ .replaceAll("." + FilenameUtils.getExtension(des.getName()), "") + " "
+ + System.currentTimeMillis() / 1000 + "."
+ + FilenameUtils.getExtension(file.getName()));
+ }
+
+ Files.copy(file, des);
+
+ sender.sendMessage(backup.processMessage("Info.BackupFinished").replaceAll("%file%", file.getName()));
+ } catch (IOException e) {
+ sender.sendMessage(backup.processMessage("Error.BackupFailed").replaceAll("%file%", file.getName()));
+ e.printStackTrace();
+ }
+ });
+ } else {
+ BackupManager bm = new BackupManager(fileName.toString(), sender, fullBackup);
+ bm.createBackup();
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/de/seblii/serverbackup/commands/DropboxCommand.java b/src/main/java/de/seblii/serverbackup/commands/DropboxCommand.java
new file mode 100644
index 00000000..3a188953
--- /dev/null
+++ b/src/main/java/de/seblii/serverbackup/commands/DropboxCommand.java
@@ -0,0 +1,22 @@
+package de.seblii.serverbackup.commands;
+
+import de.seblii.serverbackup.ServerBackup;
+import de.seblii.serverbackup.utils.DropboxManager;
+import org.bukkit.Bukkit;
+import org.bukkit.command.CommandSender;
+
+public class DropboxCommand implements ServerCommand{
+ @Override
+ public boolean execute(CommandSender sender, String[] args, ServerBackup backup) {
+ if(args[1].equalsIgnoreCase("upload")) {
+ Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
+ DropboxManager dm = new DropboxManager(sender);
+
+ dm.uploadToDropbox(args[2]);
+ });
+ } else {
+ sender.sendMessage("Invalid arguments provided. Correct usage: /backup dropbox upload ");
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/de/seblii/serverbackup/commands/FtpCommand.java b/src/main/java/de/seblii/serverbackup/commands/FtpCommand.java
new file mode 100644
index 00000000..c5af940d
--- /dev/null
+++ b/src/main/java/de/seblii/serverbackup/commands/FtpCommand.java
@@ -0,0 +1,126 @@
+package de.seblii.serverbackup.commands;
+
+import de.seblii.serverbackup.ServerBackup;
+import de.seblii.serverbackup.utils.FtpManager;
+import net.md_5.bungee.api.chat.ClickEvent;
+import net.md_5.bungee.api.chat.ComponentBuilder;
+import net.md_5.bungee.api.chat.HoverEvent;
+import net.md_5.bungee.api.chat.TextComponent;
+import org.bukkit.Bukkit;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+
+import java.util.List;
+
+public class FtpCommand implements ServerCommand{
+ @Override
+ public boolean execute(CommandSender sender, String[] args, ServerBackup backup) {
+ if (args[1].equalsIgnoreCase("list")) {
+ Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
+ FtpManager ftpm = new FtpManager(sender);
+
+ List backups = ftpm.getFtpBackupList();
+
+ if (backups.size() == 0) {
+ sender.sendMessage(backup.processMessage("Error.NoFtpBackups"));
+
+ return;
+ }
+
+ if (args[2]!=null) {
+ try {
+ int page = Integer.parseInt(args[2]);
+
+ if (backups.size() < page * 10 - 9) {
+ sender.sendMessage("Try a lower value.");
+
+ return;
+ }
+
+ if (backups.size() <= page * 10 && backups.size() >= page * 10 - 10) {
+ sender.sendMessage("----- Ftp-Backup " + (page * 10 - 9) + "-"
+ + backups.size() + "/" + backups.size() + " -----");
+ } else {
+ sender.sendMessage("----- Ftp-Backup " + (page * 10 - 9) + "-"
+ + page * 10 + "/" + backups.size() + " -----");
+ }
+ sender.sendMessage("");
+
+ for (int i = page * 10 - 10; i < backups.size() && i < page * 10; i++) {
+ checkPlayer(sender, backups, i);
+ }
+
+ int maxPages = backups.size() / 10;
+
+ if (backups.size() % 10 != 0) {
+ maxPages++;
+ }
+
+ sender.sendMessage("");
+ sender.sendMessage("--------- Page " + page + "/" + maxPages + " ---------");
+ } catch (Exception e) {
+ sender.sendMessage(backup.processMessage("Error.NotANumber").replaceAll("%input%", args[1]));
+ }
+ } else {
+ Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
+ if (backups.size() == 0) {
+ sender.sendMessage(backup.processMessage("Error.NoFtpBackups"));
+ return;
+ }
+
+ if (backups.size() < 10) {
+ sender.sendMessage(
+ "----- Ftp-Backup 1-" + backups.size() + "/" + backups.size() + " -----");
+ } else {
+ sender.sendMessage("----- Ftp-Backup 1-10/" + backups.size() + " -----");
+ }
+ sender.sendMessage("");
+
+ for (int i = 0; i < backups.size() && i < 10; i++) {
+ checkPlayer(sender, backups, i);
+ }
+
+ int maxPages = backups.size() / 10;
+
+ if (backups.size() % 10 != 0) {
+ maxPages++;
+ }
+
+ sender.sendMessage("");
+ sender.sendMessage("--------- Page 1/" + maxPages + " ---------");
+ });
+ }
+ });
+ } else if (args[1].equalsIgnoreCase("download")) {
+ Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
+ FtpManager ftpm = new FtpManager(sender);
+
+ ftpm.downloadFileFromFtp(args[2]);
+ });
+ } else if (args[1].equalsIgnoreCase("upload")) {
+ Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
+ FtpManager ftpm = new FtpManager(sender);
+
+ ftpm.uploadFileToFtp(args[2], false);
+ });
+ } else {
+ sender.sendMessage("Invalid arguments provided. Correct usage: /backup ftp ");
+ }
+ return false;
+ }
+
+ private void checkPlayer(CommandSender sender, List backups, int i) {
+ if (sender instanceof Player) {
+ Player p = (Player) sender;
+ TextComponent msg = new TextComponent(backups.get(i));
+ msg.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
+ new ComponentBuilder("Click to get Backup name").create()));
+ msg.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND,
+ backups.get(i).split(" ")[1]));
+
+ p.spigot().sendMessage(msg);
+ } else {
+ sender.sendMessage(backups.get(i));
+ }
+ }
+}
diff --git a/src/main/java/de/seblii/serverbackup/commands/ListCommand.java b/src/main/java/de/seblii/serverbackup/commands/ListCommand.java
new file mode 100644
index 00000000..d72f4b99
--- /dev/null
+++ b/src/main/java/de/seblii/serverbackup/commands/ListCommand.java
@@ -0,0 +1,135 @@
+package de.seblii.serverbackup.commands;
+
+import de.seblii.serverbackup.ServerBackup;
+import net.md_5.bungee.api.chat.ClickEvent;
+import net.md_5.bungee.api.chat.ComponentBuilder;
+import net.md_5.bungee.api.chat.HoverEvent;
+import net.md_5.bungee.api.chat.TextComponent;
+import org.apache.commons.io.FileUtils;
+import org.bukkit.Bukkit;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+
+import java.io.File;
+import java.util.Arrays;
+
+public class ListCommand implements ServerCommand{
+ @Override
+ public boolean execute(CommandSender sender, String[] args, ServerBackup backup) {
+ if (args.length > 2) {
+ sender.sendMessage("Invalid arguments provided. Correct usage: /backup list [page]");
+ return false;
+ } else if (args.length == 1) {
+ Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
+ File[] backups = getFiles(sender, backup);
+ if (backups == null) return;
+
+ if ((backups.length - 1) < 10) {
+ sender.sendMessage(
+ "----- Backup 1-" + (backups.length - 1) + "/" + (backups.length - 1) + " -----");
+ } else {
+ sender.sendMessage("----- Backup 1-10/" + (backups.length - 1) + " -----");
+ }
+ sender.sendMessage("");
+
+ for (int i = 0; i < (backups.length - 1) && i < 10; i++) {
+ if (backups[i].getName().equalsIgnoreCase("Files")) {
+ i--;
+ continue;
+ }
+
+ calcFileSize(sender, backups, i);
+ }
+
+ int maxPages = (backups.length - 1) / 10;
+
+ if ((backups.length - 1) % 10 != 0) {
+ maxPages++;
+ }
+
+ sender.sendMessage("");
+ sender.sendMessage("-------- Page 1/" + maxPages + " --------");
+ });
+ } else if (args.length == 2) {
+ Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
+ File[] backups = getFiles(sender, backup);
+ if (backups == null) return;
+
+ try {
+ int page = Integer.parseInt(args[1]);
+
+ if ((backups.length - 1) < page * 10 - 9) {
+ sender.sendMessage("Try a lower value.");
+
+ return;
+ }
+
+ if ((backups.length - 1) <= page * 10 && (backups.length - 1) >= page * 10 - 10) {
+ sender.sendMessage("----- Backup " + (page * 10 - 9) + "-"
+ + (backups.length - 1) + "/" + (backups.length - 1) + " -----");
+ } else {
+ sender.sendMessage("----- Backup " + (page * 10 - 9) + "-"
+ + page * 10 + "/" + (backups.length - 1) + " -----");
+ }
+ sender.sendMessage("");
+
+ for (int i = page * 10 - 10; i < (backups.length - 1) && i < page * 10; i++) {
+ if (backups[0].getName().equalsIgnoreCase("Files")) {
+ i--;
+ continue;
+ }
+
+ calcFileSize(sender, backups, i);
+ }
+
+ int maxPages = (backups.length - 1) / 10;
+
+ if ((backups.length - 1) % 10 != 0) {
+ maxPages++;
+ }
+
+ sender.sendMessage("");
+ sender.sendMessage("-------- Page " + page + "/" + maxPages + " --------");
+ } catch (Exception e) {
+ sender.sendMessage(backup.processMessage("Error.NotANumber").replaceAll("%input%", args[1]));
+ }
+ });
+ }
+ return false;
+ }
+
+ private static File[] getFiles(CommandSender sender, ServerBackup backup) {
+ File[] backups = new File(ServerBackup.getInstance().backupDestination).listFiles();
+ assert backups != null;
+
+ if (backups.length == 0
+ || backups.length == 1 && backups[0].getName().equalsIgnoreCase("Files")) {
+ sender.sendMessage(backup.processMessage("Error.NoBackups"));
+
+ return null;
+ }
+
+ Arrays.sort(backups);
+ return backups;
+ }
+
+ private void calcFileSize(CommandSender sender, File[] backups, int i) {
+ double fileSize = (double) FileUtils.sizeOf(backups[i]) / 1000 / 1000;
+ fileSize = Math.round(fileSize * 100.0) / 100.0;
+
+ if (sender instanceof Player) {
+ Player p = (Player) sender;
+
+ TextComponent msg = new TextComponent("§7[" + (i + 1) + "] §r"
+ + backups[i].getName() + " §7[" + fileSize + "MB]");
+ msg.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
+ new ComponentBuilder("Click to get Backup name").create()));
+ msg.setClickEvent(
+ new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, backups[i].getName()));
+
+ p.spigot().sendMessage(msg);
+ } else {
+ sender.sendMessage(backups[i].getName());
+ }
+ }
+}
diff --git a/src/main/java/de/seblii/serverbackup/commands/ReloadCommand.java b/src/main/java/de/seblii/serverbackup/commands/ReloadCommand.java
new file mode 100644
index 00000000..183467d3
--- /dev/null
+++ b/src/main/java/de/seblii/serverbackup/commands/ReloadCommand.java
@@ -0,0 +1,37 @@
+package de.seblii.serverbackup.commands;
+
+import de.seblii.serverbackup.ServerBackup;
+import org.bukkit.command.CommandSender;
+
+import java.util.logging.Level;
+
+public class ReloadCommand implements ServerCommand {
+ @Override
+ public boolean execute(CommandSender sender, String[] args, ServerBackup backup) {
+ ServerBackup.getInstance().reloadConfig();
+
+ ServerBackup.getInstance().stopTimer();
+ ServerBackup.getInstance().startTimer();
+
+ String oldDes = ServerBackup.getInstance().backupDestination;
+
+ if (!oldDes
+ .equalsIgnoreCase(ServerBackup.getInstance().getConfig().getString("BackupDestination"))) {
+ ServerBackup.getInstance().backupDestination = ServerBackup.getInstance().getConfig()
+ .getString("BackupDestination");
+
+ ServerBackup.getInstance().getLogger().log(Level.INFO,
+ "ServerBackup: Backup destination [" + oldDes + " >> "
+ + ServerBackup.getInstance().backupDestination + "] updated successfully.");
+ }
+
+ if(ServerBackup.getInstance().cloudInfo.exists()){
+ ServerBackup.getInstance().saveCloud();
+ }
+
+ ServerBackup.getInstance().loadFiles();
+
+ sender.sendMessage(backup.processMessage("Command.Reload"));
+ return false;
+ }
+}
diff --git a/src/main/java/de/seblii/serverbackup/commands/RemoveCommand.java b/src/main/java/de/seblii/serverbackup/commands/RemoveCommand.java
new file mode 100644
index 00000000..099955a3
--- /dev/null
+++ b/src/main/java/de/seblii/serverbackup/commands/RemoveCommand.java
@@ -0,0 +1,25 @@
+package de.seblii.serverbackup.commands;
+
+import de.seblii.serverbackup.BackupManager;
+import de.seblii.serverbackup.ServerBackup;
+import org.bukkit.command.CommandSender;
+
+public class RemoveCommand implements ServerCommand{
+ @Override
+ public boolean execute(CommandSender sender, String[] args, ServerBackup backup) {
+ if ( args.length != 2) {
+ sender.sendMessage("Invalid arguments provided. Correct usage: /backup remove ");
+ return false;
+ }
+ if (args[1].equalsIgnoreCase("Files")) {
+ sender.sendMessage("You can not delete the 'Files' backup folder.");
+
+ return false;
+ }
+
+ BackupManager bm = new BackupManager(args[1], sender, true);
+
+ bm.removeBackup();
+ return false;
+ }
+}
diff --git a/src/main/java/de/seblii/serverbackup/commands/SearchCommand.java b/src/main/java/de/seblii/serverbackup/commands/SearchCommand.java
new file mode 100644
index 00000000..afbf6931
--- /dev/null
+++ b/src/main/java/de/seblii/serverbackup/commands/SearchCommand.java
@@ -0,0 +1,154 @@
+package de.seblii.serverbackup.commands;
+
+import de.seblii.serverbackup.ServerBackup;
+import net.md_5.bungee.api.chat.ClickEvent;
+import net.md_5.bungee.api.chat.ComponentBuilder;
+import net.md_5.bungee.api.chat.HoverEvent;
+import net.md_5.bungee.api.chat.TextComponent;
+import org.apache.commons.io.FileUtils;
+import org.bukkit.Bukkit;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class SearchCommand implements ServerCommand{
+ @Override
+ public boolean execute(CommandSender sender, String[] args, ServerBackup backup) {
+ if (args.length < 2 || args.length > 4) {
+ sender.sendMessage("Invalid arguments provided. Correct usage: /backup search [page]");
+ return false;
+ } else if (args.length == 2) {
+ Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
+ File[] backups = new File(ServerBackup.getInstance().backupDestination).listFiles();
+ assert backups != null;
+
+ List backupsMatch = matchBackups(sender, args, backup, backups);
+ if (backupsMatch == null) return;
+
+ int count = 1;
+
+ if (backupsMatch.size() < 10) {
+ sender.sendMessage(
+ "----- Backup 1-" + backupsMatch.size() + "/" + backupsMatch.size() + " -----");
+ } else {
+ sender.sendMessage("----- Backup 1-10/" + backupsMatch.size() + " -----");
+ }
+ sender.sendMessage("");
+
+ for (File file : backupsMatch) {
+ if (count <= 10 && count <= backupsMatch.size()) {
+ calcFileSize(sender, count, file);
+ }
+ count++;
+ }
+
+ int maxPages = backupsMatch.size() / 10;
+
+ if (backupsMatch.size() % 10 != 0) {
+ maxPages++;
+ }
+
+ sender.sendMessage("");
+ sender.sendMessage("-------- Page 1/" + maxPages + " --------");
+ });
+ } else if (args.length == 3) {
+ Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
+ File[] backups = new File(ServerBackup.getInstance().backupDestination).listFiles();
+ assert backups != null;
+
+ List backupsMatch = matchBackups(sender, args, backup, backups);
+ if (backupsMatch == null) return;
+
+ try {
+ int page = Integer.parseInt(args[2]);
+
+ if (backups.length < page * 10 - 9) {
+ sender.sendMessage("Try a lower value.");
+
+ return;
+ }
+
+ int count = page * 10 - 9;
+
+ if (backupsMatch.size() <= page * 10 && backupsMatch.size() >= page * 10 - 10) {
+ sender.sendMessage("----- Backup " + (page * 10 - 9) + "-"
+ + backupsMatch.size() + "/" + backupsMatch.size() + " -----");
+ } else {
+ sender.sendMessage("----- Backup " + (page * 10 - 9) + "-"
+ + page * 10 + "/" + backupsMatch.size() + " -----");
+ }
+ sender.sendMessage("");
+
+ for (File file : backupsMatch) {
+ if (count <= page * 10 && count <= backupsMatch.size()) {
+ SearchCommand.calcFileSize(sender, count, file);
+ }
+ count++;
+ }
+
+ int maxPages = backupsMatch.size() / 10;
+
+ if (backupsMatch.size() % 10 != 0) {
+ maxPages++;
+ }
+
+ sender.sendMessage("");
+ sender.sendMessage("-------- Page " + page + "/" + maxPages + " --------");
+ } catch (Exception e) {
+ sender.sendMessage(backup.processMessage("Error.NotANumber").replaceAll("%input%", args[2]));
+ }
+ });
+ }
+ return false;
+ }
+
+ private static List matchBackups(CommandSender sender, String[] args, ServerBackup backup, File[] backups) {
+ if (backups.length == 0
+ || backups.length == 1 && backups[0].getName().equalsIgnoreCase("Files")) {
+ sender.sendMessage(backup.processMessage("Error.NoBackups"));
+
+ return null;
+ }
+
+ List backupsMatch = new ArrayList<>();
+
+ for (File file : backups) {
+ if (file.getName().contains(args[1])) {
+ backupsMatch.add(file);
+ }
+ }
+
+ if (backupsMatch.size() == 0) {
+ sender.sendMessage(backup.processMessage("NoBackupSearch").replaceAll("%input%", args[1]));
+
+ return null;
+ }
+
+ Collections.sort(backupsMatch);
+ return backupsMatch;
+ }
+
+ static void calcFileSize(CommandSender sender, int count, File file) {
+ double fileSize = (double) FileUtils.sizeOf(file) / 1000 / 1000;
+ fileSize = Math.round(fileSize * 100.0) / 100.0;
+
+ if (sender instanceof Player) {
+ Player p = (Player) sender;
+
+ TextComponent msg = new TextComponent("§7[" + count + "] §r"
+ + file.getName() + " §7[" + fileSize + "MB]");
+ msg.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
+ new ComponentBuilder("Click to get Backup name").create()));
+ msg.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND,
+ "/backup remove " + file.getName()));
+
+ p.spigot().sendMessage(msg);
+ } else {
+ sender.sendMessage(file.getName());
+ }
+ }
+}
diff --git a/src/main/java/de/seblii/serverbackup/commands/ServerCommand.java b/src/main/java/de/seblii/serverbackup/commands/ServerCommand.java
new file mode 100644
index 00000000..0eafad06
--- /dev/null
+++ b/src/main/java/de/seblii/serverbackup/commands/ServerCommand.java
@@ -0,0 +1,8 @@
+package de.seblii.serverbackup.commands;
+
+import de.seblii.serverbackup.ServerBackup;
+import org.bukkit.command.CommandSender;
+
+public interface ServerCommand {
+ boolean execute(CommandSender sender, String[] args, ServerBackup backup);
+}
diff --git a/src/main/java/de/seblii/serverbackup/commands/ShutdownCommand.java b/src/main/java/de/seblii/serverbackup/commands/ShutdownCommand.java
new file mode 100644
index 00000000..dbb02d86
--- /dev/null
+++ b/src/main/java/de/seblii/serverbackup/commands/ShutdownCommand.java
@@ -0,0 +1,21 @@
+package de.seblii.serverbackup.commands;
+
+import de.seblii.serverbackup.ServerBackup;
+import org.bukkit.command.CommandSender;
+
+public class ShutdownCommand implements ServerCommand{
+
+ @Override
+ public boolean execute(CommandSender sender, String[] args, ServerBackup backup) {
+ if (backup.shutdownProgress) {
+ backup.shutdownProgress = false;
+
+ sender.sendMessage(backup.processMessage("Command.Shutdown.Cancel"));
+ } else {
+ ServerBackup.getInstance().shutdownProgress = true;
+
+ sender.sendMessage(backup.processMessage("Command.Shutdown.Start"));
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/de/seblii/serverbackup/commands/TasksCommand.java b/src/main/java/de/seblii/serverbackup/commands/TasksCommand.java
new file mode 100644
index 00000000..2e5d7ec8
--- /dev/null
+++ b/src/main/java/de/seblii/serverbackup/commands/TasksCommand.java
@@ -0,0 +1,23 @@
+package de.seblii.serverbackup.commands;
+
+import de.seblii.serverbackup.BackupManager;
+import de.seblii.serverbackup.ServerBackup;
+import org.bukkit.command.CommandSender;
+
+public class TasksCommand implements ServerCommand{
+ @Override
+ public boolean execute(CommandSender sender, String[] args, ServerBackup backup) {
+ if (BackupManager.tasks.size() > 0) {
+ sender.sendMessage(backup.processMessage("Command.Tasks.Header"));
+
+ for (String task : BackupManager.tasks) {
+ sender.sendMessage(task);
+ }
+
+ sender.sendMessage(backup.processMessage("Command.Tasks.Footer"));
+ } else {
+ sender.sendMessage(backup.processMessage("Error.NoTasks"));
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/de/seblii/serverbackup/commands/UnzipCommand.java b/src/main/java/de/seblii/serverbackup/commands/UnzipCommand.java
new file mode 100644
index 00000000..732951fe
--- /dev/null
+++ b/src/main/java/de/seblii/serverbackup/commands/UnzipCommand.java
@@ -0,0 +1,43 @@
+package de.seblii.serverbackup.commands;
+
+import de.seblii.serverbackup.ZipManager;
+import de.seblii.serverbackup.ServerBackup;
+import org.bukkit.command.CommandSender;
+
+import java.io.File;
+
+public class UnzipCommand implements ServerCommand{
+ @Override
+ public boolean execute(CommandSender sender, String[] args, ServerBackup backup) {
+ if (args.length != 2) {
+ sender.sendMessage("Invalid arguments provided. Correct usage: /backup unzip ");
+ }
+ String filePath = args[1];
+
+ if (!args[1].contains(".zip")) {
+ sender.sendMessage(backup.processMessage("Error.NotAZip").replaceAll("%file%", args[1]));
+ return false;
+ }
+
+ File file = new File(ServerBackup.getInstance().backupDestination + "//" + filePath);
+ File newFile = new File(
+ ServerBackup.getInstance().backupDestination + "//" + filePath.replaceAll(".zip", ""));
+
+ if (!newFile.exists()) {
+ sender.sendMessage(backup.processMessage("Command.Unzip.Header"));
+
+ if (file.exists()) {
+ ZipManager zm = new ZipManager(file.getPath(),
+ ServerBackup.getInstance().backupDestination + "//" + newFile.getName(), sender,
+ false, true, true);
+
+ zm.unzip();
+ } else {
+ sender.sendMessage(backup.processMessage("Error.NoBackupFound").replaceAll("%file%", args[1]));
+ }
+ } else {
+ sender.sendMessage(backup.processMessage("Error.ZipExists").replaceAll("%file%", args[1]));
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/de/seblii/serverbackup/commands/WebDavCommand.java b/src/main/java/de/seblii/serverbackup/commands/WebDavCommand.java
new file mode 100644
index 00000000..4b448342
--- /dev/null
+++ b/src/main/java/de/seblii/serverbackup/commands/WebDavCommand.java
@@ -0,0 +1,40 @@
+package de.seblii.serverbackup.commands;
+
+import de.seblii.serverbackup.ServerBackup;
+import de.seblii.serverbackup.utils.WebDavManager;
+import org.bukkit.Bukkit;
+import org.bukkit.command.CommandSender;
+
+import java.io.IOException;
+
+public class WebDavCommand implements ServerCommand{
+ @Override
+ public boolean execute(CommandSender sender, String[] args, ServerBackup backup) {
+ if (!ServerBackup.getInstance().getConfig().getBoolean("CloudBackup.WebDav")){
+ sender.sendMessage("WebDav is disabled in the config.yml");
+ return false;
+ }
+
+ if (args.length != 3) {
+ sender.sendMessage("Invalid arguments provided. Correct usage: /backup dropbox upload ");
+ return false;
+ }
+
+ try {
+ if (args[1].equalsIgnoreCase("upload")){
+ Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
+ WebDavManager webDav = new WebDavManager(sender);
+
+ try {
+ webDav.uploadToWebDav(args[2]);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ });
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/de/seblii/serverbackup/commands/ZipCommand.java b/src/main/java/de/seblii/serverbackup/commands/ZipCommand.java
new file mode 100644
index 00000000..faf68da9
--- /dev/null
+++ b/src/main/java/de/seblii/serverbackup/commands/ZipCommand.java
@@ -0,0 +1,42 @@
+package de.seblii.serverbackup.commands;
+
+import de.seblii.serverbackup.ServerBackup;
+import de.seblii.serverbackup.ZipManager;
+import org.bukkit.command.CommandSender;
+
+import java.io.File;
+import java.io.IOException;
+
+public class ZipCommand implements ServerCommand{
+ @Override
+ public boolean execute(CommandSender sender, String[] args, ServerBackup backup) {
+ if (args.length < 2) {
+ sender.sendMessage("Invalid arguments provided. Correct usage: /backup zip ");
+ return false;
+ }
+ String filePath = args[1];
+
+ if (args[1].contains(".zip")) {
+ sender.sendMessage(backup.processMessage("Error.AlreadyZip").replaceAll("%file%", args[1]));
+ return false;
+ }
+
+ File file = new File(ServerBackup.getInstance().backupDestination + "//" + filePath);
+ File newFile = new File(ServerBackup.getInstance().backupDestination + "//" + filePath + ".zip");
+
+ if (!newFile.exists()) {
+ sender.sendMessage(backup.processMessage("Command.Zip.Header"));
+
+ if (file.exists()) {
+ ZipManager zm = new ZipManager(file.getPath(), newFile.getPath(), sender, true, false, true);
+
+ zm.zip();
+ } else {
+ sender.sendMessage(backup.processMessage("Error.NoBackupFound").replaceAll("%file%", args[1]));
+ }
+ } else {
+ sender.sendMessage(backup.processMessage("Error.FolderExists").replaceAll("%file%", args[1]));
+ }
+ return false;
+ }
+}
diff --git a/src/de/seblii/serverbackup/utils/DropboxManager.java b/src/main/java/de/seblii/serverbackup/utils/DropboxManager.java
similarity index 77%
rename from src/de/seblii/serverbackup/utils/DropboxManager.java
rename to src/main/java/de/seblii/serverbackup/utils/DropboxManager.java
index eec9fa6e..ea7d4d5e 100644
--- a/src/de/seblii/serverbackup/utils/DropboxManager.java
+++ b/src/main/java/de/seblii/serverbackup/utils/DropboxManager.java
@@ -1,86 +1,90 @@
-package de.seblii.serverbackup.utils;
-
-import com.dropbox.core.*;
-import com.dropbox.core.android.Auth;
-import com.dropbox.core.oauth.DbxCredential;
-import com.dropbox.core.v2.DbxClientV2;
-import com.dropbox.core.v2.files.FileMetadata;
-import com.dropbox.core.v2.files.UploadErrorException;
-import de.seblii.serverbackup.ServerBackup;
-import org.apache.commons.net.ftp.FTPFile;
-import org.bukkit.command.CommandSender;
-
-import java.io.*;
-
-public class DropboxManager {
-
- private CommandSender sender;
- public DropboxManager(CommandSender sender) {
- this.sender = sender;
- }
-
- private static final String ACCESS_TOKEN = ServerBackup.getInstance().cloud.getString("Cloud.Dropbox.AccessToken");
-
- public void uploadToDropbox(String filePath) {
- File file = new File(filePath);
-
- if (!file.getPath().contains(ServerBackup.getInstance().backupDestination.replaceAll("/", ""))) {
- file = new File(ServerBackup.getInstance().backupDestination + "//" + filePath);
- filePath = file.getPath();
- }
-
- if (!file.exists()) {
- sender.sendMessage("Dropbox: Backup '" + file.getName() + "' not found.");
-
- return;
- }
-
- DbxRequestConfig config = DbxRequestConfig.newBuilder("dropbox/ServerBackupG").build();
-
- String appKey = ServerBackup.getInstance().cloud.getString("Cloud.Dropbox.AppKey");
- String secretKey = ServerBackup.getInstance().cloud.getString("Cloud.Dropbox.AppSecret");
-
- DbxClientV2 client = null;
- DbxCredential credential = null;
-
- if(!ServerBackup.getInstance().cloud.contains("Cloud.Dropbox.RT")) {
- DbxAppInfo appInfo = new DbxAppInfo(appKey, secretKey);
- DbxWebAuth webAuth = new DbxWebAuth(config, appInfo);
- DbxAuthFinish authFinish = null;
- try {
- authFinish = webAuth.finishFromCode(ACCESS_TOKEN);
- } catch (DbxException e) {
- throw new RuntimeException(e);
- }
- credential = new DbxCredential(authFinish.getAccessToken(), 60L, authFinish.getRefreshToken(), appKey, secretKey);
-
- ServerBackup.getInstance().cloud.set("Cloud.Dropbox.RT", authFinish.getRefreshToken());
- ServerBackup.getInstance().saveCloud();
- } else {
- credential = new DbxCredential("isly", 0L, ServerBackup.getInstance().cloud.getString("Cloud.Dropbox.RT"), appKey, secretKey);
- }
-
- client = new DbxClientV2(config, credential);
-
- sender.sendMessage("Dropbox: Uploading backup [" + file.getName() + "] ...");
-
- String des = ServerBackup.getInstance().getConfig().getString("CloudBackup.Options.Destination").replaceAll("/", "");
- try (InputStream in = new FileInputStream(filePath)) {
- FileMetadata metadata = client.files().uploadBuilder("/" + (des.equals("") ? "" : des + "/") + file.getName()).uploadAndFinish(in);
- } catch (UploadErrorException e) {
- throw new RuntimeException(e);
- } catch (IOException e) {
- throw new RuntimeException(e);
- } catch (DbxException e) {
- throw new RuntimeException(e);
- } finally {
- sender.sendMessage("Dropbox: Upload successfully. Backup stored on your dropbox account.");
-
- if (ServerBackup.getInstance().getConfig().getBoolean("CloudBackup.Options.DeleteLocalBackup")) {
- file.delete();
- System.out.println("File [" + file.getPath() + "] deleted.");
- }
- }
- }
-
-}
+package de.seblii.serverbackup.utils;
+
+import com.dropbox.core.*;
+import com.dropbox.core.oauth.DbxCredential;
+import com.dropbox.core.v2.DbxClientV2;
+import com.dropbox.core.v2.files.FileMetadata;
+import de.seblii.serverbackup.ServerBackup;
+import org.bukkit.command.CommandSender;
+
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Objects;
+
+public class DropboxManager {
+
+ private final CommandSender sender;
+ public DropboxManager(CommandSender sender) {
+ this.sender = sender;
+ }
+
+ private static final String ACCESS_TOKEN = ServerBackup.getInstance().cloud.getString("Cloud.Dropbox.AccessToken");
+
+ public void uploadToDropbox(String filePath) {
+ File file = new File(filePath);
+
+ if (!file.getPath().contains(ServerBackup.getInstance().backupDestination.replaceAll("/", ""))) {
+ file = new File(ServerBackup.getInstance().backupDestination + "//" + filePath);
+ filePath = file.getPath();
+ }
+
+ if (!file.exists()) {
+ sender.sendMessage("Dropbox: Backup '" + file.getName() + "' not found.");
+
+ return;
+ }
+
+ DbxRequestConfig config = DbxRequestConfig.newBuilder("dropbox/ServerBackupG").build();
+
+ String appKey = ServerBackup.getInstance().cloud.getString("Cloud.Dropbox.AppKey");
+ String secretKey = ServerBackup.getInstance().cloud.getString("Cloud.Dropbox.AppSecret");
+
+ DbxClientV2 client;
+ DbxCredential credential;
+
+ if(!ServerBackup.getInstance().cloud.contains("Cloud.Dropbox.RT")) {
+ DbxAppInfo appInfo = new DbxAppInfo(appKey, secretKey);
+ DbxWebAuth webAuth = new DbxWebAuth(config, appInfo);
+ DbxAuthFinish authFinish ;
+ try {
+ authFinish = webAuth.finishFromCode(ACCESS_TOKEN);
+ } catch (DbxException e) {
+ throw new RuntimeException(e);
+ }
+ credential = new DbxCredential(authFinish.getAccessToken(), 60L, authFinish.getRefreshToken(), appKey, secretKey);
+
+ ServerBackup.getInstance().cloud.set("Cloud.Dropbox.RT", authFinish.getRefreshToken());
+ ServerBackup.getInstance().saveCloud();
+ } else {
+ credential = new DbxCredential("isly", 0L, ServerBackup.getInstance().cloud.getString("Cloud.Dropbox.RT"), appKey, secretKey);
+ }
+
+ client = new DbxClientV2(config, credential);
+
+ sender.sendMessage("Dropbox: Uploading backup [" + file.getName() + "] ...");
+
+ String des = Objects.requireNonNull(ServerBackup.getInstance().cloud.getString("Cloud.Dropbox.Destination")).replaceAll("/", "");
+
+ boolean success = false;
+ try (InputStream in = Files.newInputStream(Paths.get(filePath))) {
+ FileMetadata metadata = client.files().uploadBuilder("/" + (des.equals("") ? "" : des + "/") + file.getName()).uploadAndFinish(in);
+ success = true;
+ } catch (IOException | DbxException e) {
+ throw new RuntimeException(e);
+ }
+ if (success){
+ sender.sendMessage("Dropbox: Upload successfully. Backup stored on your dropbox account.");
+
+ if (ServerBackup.getInstance().getConfig().getBoolean("CloudBackup.Options.DeleteLocalBackup")) {
+ try {
+ Files.delete(file.toPath());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ System.out.println("File [" + file.getPath() + "] deleted.");
+ }
+ }
+ }
+
+}
diff --git a/src/de/seblii/serverbackup/utils/FtpManager.java b/src/main/java/de/seblii/serverbackup/utils/FtpManager.java
similarity index 88%
rename from src/de/seblii/serverbackup/utils/FtpManager.java
rename to src/main/java/de/seblii/serverbackup/utils/FtpManager.java
index 3cf7998c..c7479be5 100644
--- a/src/de/seblii/serverbackup/utils/FtpManager.java
+++ b/src/main/java/de/seblii/serverbackup/utils/FtpManager.java
@@ -1,384 +1,401 @@
-package de.seblii.serverbackup.utils;
-
-import de.seblii.serverbackup.ServerBackup;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.net.ftp.FTP;
-import org.apache.commons.net.ftp.FTPClient;
-import org.apache.commons.net.ftp.FTPFile;
-import org.apache.commons.net.ftp.FTPSClient;
-import org.bukkit.Bukkit;
-import org.bukkit.command.CommandSender;
-
-import java.io.*;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Level;
-
-public class FtpManager {
-
- private CommandSender sender;
-
- String server = ServerBackup.getInstance().getConfig().getString("Ftp.Server.IP");
- int port = ServerBackup.getInstance().getConfig().getInt("Ftp.Server.Port");
- String user = ServerBackup.getInstance().getConfig().getString("Ftp.Server.User");
- String pass = ServerBackup.getInstance().getConfig().getString("Ftp.Server.Password");
-
- public FtpManager(CommandSender sender) {
- this.sender = sender;
- }
-
- boolean isSSL = true;
-
- ServerBackup backup = ServerBackup.getInstance();
-
- public void uploadFileToFtp(String filePath, boolean direct) {
- File file = new File(filePath);
-
- if (!file.getPath().contains(ServerBackup.getInstance().backupDestination.replaceAll("/", ""))) {
- file = new File(ServerBackup.getInstance().backupDestination + "//" + filePath);
- filePath = file.getPath();
- }
-
- if (!file.exists()) {
- sender.sendMessage(backup.processMessage("Error.NoBackupFound").replaceAll("%file%", file.getName()));
-
- return;
- }
-
- FTPSClient ftpClient = new FTPSClient();
- FTPClient ftpC = new FTPClient();
-
- try {
- if (!isSSL) {
- try {
- if (ftpClient.isConnected()) {
- ftpClient.logout();
- ftpClient.disconnect();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- ftpC.connect(server, port);
- ftpC.login(user, pass);
- ftpC.enterLocalPassiveMode();
-
- ftpC.setFileType(FTP.BINARY_FILE_TYPE);
- ftpC.setFileTransferMode(FTP.BINARY_FILE_TYPE);
-
- ftpC.changeWorkingDirectory(
- ServerBackup.getInstance().getConfig().getString("Ftp.Server.BackupDirectory"));
-
- sender.sendMessage(backup.processMessage("Info.FtpUpload").replaceAll("%file%", file.getName()));
-
- ftpC.setControlKeepAliveTimeout(100);
-
- InputStream inputStream = new FileInputStream(file);
-
- boolean done = ftpC.storeFile(file.getName(), inputStream);
-
- // DEBUG
- Bukkit.getLogger().log(Level.INFO, "(BETA) FTP-DEBUG INFO: " + ftpC.getReplyString());
- Bukkit.getLogger().log(Level.INFO,
- "Use this info for reporting ftp related bugs. Ignore it if everything is fine.");
-
- inputStream.close();
-
- if (done) {
- sender.sendMessage(backup.processMessage("Info.FtpUploadSuccess"));
-
- if (ServerBackup.getInstance().getConfig().getBoolean("Ftp.DeleteLocalBackup")) {
- boolean exists = false;
- for (FTPFile backup : ftpC.listFiles()) {
- if (backup.getName().equalsIgnoreCase(file.getName()))
- exists = true;
- }
-
- if (exists) {
- file.delete();
- } else {
- sender.sendMessage(backup.processMessage("Error.FtpLocalDeletionFailed"));
- }
- }
- } else {
- sender.sendMessage(backup.processMessage("Error.FtpUploadFailed"));
- }
- } else {
- try {
- try {
- if (ftpC.isConnected()) {
- ftpC.logout();
- ftpC.disconnect();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- ftpClient.connect(server, port);
- ftpClient.login(user, pass);
- ftpClient.enterLocalPassiveMode();
-
- ftpClient.execPBSZ(0);
- ftpClient.execPROT("P");
-
- ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
- ftpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);
-
- ftpClient.changeWorkingDirectory(
- ServerBackup.getInstance().getConfig().getString("Ftp.Server.BackupDirectory"));
-
- ftpClient.setControlKeepAliveTimeout(100);
-
- InputStream inputStream = new FileInputStream(file);
-
- boolean done = ftpClient.storeFile(file.getName(), inputStream);
-
- // DEBUG
- Bukkit.getLogger().log(Level.INFO, "(BETA) FTPS-DEBUG INFO: " + ftpClient.getReplyString());
- Bukkit.getLogger().log(Level.INFO,
- "Use this info for reporting ftp related bugs. Ignore it if everything is fine.");
-
- inputStream.close();
-
- if (done) {
- sender.sendMessage(backup.processMessage("Info.FtpUploadSuccess"));
-
- if (ServerBackup.getInstance().getConfig().getBoolean("Ftp.DeleteLocalBackup")) {
- boolean exists = false;
- for (FTPFile backup : ftpClient.listFiles()) {
- if (backup.getName().equalsIgnoreCase(file.getName()))
- exists = true;
- }
-
- if (exists) {
- file.delete();
- } else {
- sender.sendMessage(backup.processMessage("Error.FtpLocalDeletionFailed"));
- }
- }
- } else {
- sender.sendMessage(backup.processMessage("Error.FtpUploadFailed"));
- }
- } catch (Exception e) {
- isSSL = false;
- uploadFileToFtp(filePath, direct);
- }
- }
- } catch (IOException e) {
- sender.sendMessage(backup.processMessage("Error.FtpUploadFailed"));
- e.printStackTrace();
- } finally {
- try {
- if (ftpClient.isConnected()) {
- ftpClient.disconnect();
- }
-
- if (ftpC.isConnected()) {
- ftpC.disconnect();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
-
- public void downloadFileFromFtp(String filePath) {
- File file = new File(filePath);
-
- FTPSClient ftpClient = new FTPSClient();
- FTPClient ftpC = new FTPClient();
-
- try {
- if (!isSSL) {
- ftpC.connect(server, port);
- ftpC.login(user, pass);
- ftpC.enterLocalPassiveMode();
-
- ftpC.setFileType(FTP.BINARY_FILE_TYPE);
-
- ftpC.changeWorkingDirectory(
- ServerBackup.getInstance().getConfig().getString("Ftp.Server.BackupDirectory"));
-
- boolean exists = false;
- for (FTPFile backup : ftpC.listFiles()) {
- if (backup.getName().equalsIgnoreCase(file.getName()))
- exists = true;
- }
-
- if (!exists) {
- sender.sendMessage(backup.processMessage("Error.FtpNotFound").replaceAll("%file%", file.getName()));
-
- return;
- }
-
- sender.sendMessage(backup.processMessage("Info.FtpDownload").replaceAll("%file%", file.getName()));
-
- OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file));
- boolean success = ftpC.retrieveFile(file.getName(), outputStream);
- outputStream.close();
-
- Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
- File dFile = new File(ServerBackup.getInstance().backupDestination + "//" + file.getPath());
-
- try {
- FileUtils.copyFile(file, dFile);
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- if (dFile.exists()) {
- file.delete();
- }
- });
-
- if (success) {
- sender.sendMessage(backup.processMessage("Info.FtpDownloadSuccess"));
- } else {
- sender.sendMessage(backup.processMessage("Error.FtpDownloadFailed"));
- }
- } else {
- try {
- ftpClient.connect(server, port);
- ftpClient.login(user, pass);
- ftpClient.enterLocalPassiveMode();
-
- ftpClient.execPBSZ(0);
- ftpClient.execPROT("P");
-
- ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
-
- ftpClient.changeWorkingDirectory(
- ServerBackup.getInstance().getConfig().getString("Ftp.Server.BackupDirectory"));
-
- boolean exists = false;
- for (FTPFile backup : ftpClient.listFiles()) {
- if (backup.getName().equalsIgnoreCase(file.getName()))
- exists = true;
- }
-
- if (!exists) {
- sender.sendMessage(backup.processMessage("Error.FtpNotFound").replaceAll("%file%", file.getName()));
-
- return;
- }
-
- sender.sendMessage(backup.processMessage("Info.FtpDownload").replaceAll("%file%", file.getName()));
-
- OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file));
- boolean success = ftpClient.retrieveFile(file.getName(), outputStream);
- outputStream.close();
-
- Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
- File dFile = new File(ServerBackup.getInstance().backupDestination + "//" + file.getPath());
-
- try {
- FileUtils.copyFile(file, dFile);
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- if (dFile.exists()) {
- file.delete();
- }
- });
-
- if (success) {
- sender.sendMessage(backup.processMessage("Info.FtpDownloadSuccess"));
- } else {
- sender.sendMessage(backup.processMessage("Error.FtpDownloadFailed"));
- }
- } catch (Exception e) {
- isSSL = false;
- downloadFileFromFtp(filePath);
- }
- }
- } catch (IOException e) {
- sender.sendMessage(backup.processMessage("Error.FtpDownloadFailed"));
- e.printStackTrace();
- } finally {
- try {
- if (ftpClient.isConnected()) {
- ftpClient.logout();
- ftpClient.disconnect();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
-
- public List getFtpBackupList() {
- List backups = new ArrayList<>();
-
- FTPSClient ftpClient = new FTPSClient();
- FTPClient ftpC = new FTPClient();
-
- try {
- if (!isSSL) {
- ftpC.connect(server, port);
- ftpC.login(user, pass);
- ftpC.enterLocalPassiveMode();
-
- ftpC.changeWorkingDirectory(
- ServerBackup.getInstance().getConfig().getString("Ftp.Server.BackupDirectory"));
-
- FTPFile[] files = ftpC.listFiles();
-
- int c = 1;
-
- for (FTPFile file : files) {
- double fileSize = (double) file.getSize() / 1000 / 1000;
- fileSize = Math.round(fileSize * 100.0) / 100.0;
-
- backups.add("§7[" + c + "]§f " + file.getName() + " §7[" + fileSize + "MB]");
-
- c++;
- }
- } else {
- try {
- ftpClient.connect(server, port);
- ftpClient.login(user, pass);
- ftpClient.enterLocalPassiveMode();
-
- ftpClient.execPBSZ(0);
- ftpClient.execPROT("P");
-
- ftpClient.changeWorkingDirectory(
- ServerBackup.getInstance().getConfig().getString("Ftp.Server.BackupDirectory"));
-
- FTPFile[] files = ftpClient.listFiles();
-
- int c = 1;
-
- for (FTPFile file : files) {
- double fileSize = (double) file.getSize() / 1000 / 1000;
- fileSize = Math.round(fileSize * 100.0) / 100.0;
-
- backups.add("§7[" + c + "]§f " + file.getName() + " §7[" + fileSize + "MB]");
-
- c++;
- }
- } catch (Exception e) {
- isSSL = false;
- getFtpBackupList();
- }
- }
-
- } catch (IOException e) {
- sender.sendMessage(backup.processMessage("Error.FtpConnectionFailed"));
- e.printStackTrace();
- } finally {
- try {
- if (ftpClient.isConnected()) {
- ftpClient.logout();
- ftpClient.disconnect();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- return backups;
- }
-
-}
+package de.seblii.serverbackup.utils;
+
+import de.seblii.serverbackup.ServerBackup;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.net.ftp.FTP;
+import org.apache.commons.net.ftp.FTPClient;
+import org.apache.commons.net.ftp.FTPFile;
+import org.apache.commons.net.ftp.FTPSClient;
+import org.bukkit.Bukkit;
+import org.bukkit.command.CommandSender;
+
+import java.io.*;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+
+public class FtpManager {
+
+ private final CommandSender sender;
+
+ final String server = ServerBackup.getInstance().getConfig().getString("Ftp.Server.IP");
+ final int port = ServerBackup.getInstance().getConfig().getInt("Ftp.Server.Port");
+ final String user = ServerBackup.getInstance().getConfig().getString("Ftp.Server.User");
+ final String pass = ServerBackup.getInstance().getConfig().getString("Ftp.Server.Password");
+
+ public FtpManager(CommandSender sender) {
+ this.sender = sender;
+ }
+
+ boolean isSSL = true;
+
+ final ServerBackup backup = ServerBackup.getInstance();
+
+ public void uploadFileToFtp(String filePath, boolean direct) {
+ File file = new File(filePath);
+
+ if (!file.getPath().contains(ServerBackup.getInstance().backupDestination.replaceAll("/", ""))) {
+ file = new File(ServerBackup.getInstance().backupDestination + "//" + filePath);
+ filePath = file.getPath();
+ }
+
+ if (!file.exists()) {
+ sender.sendMessage(backup.processMessage("Error.NoBackupFound").replaceAll("%file%", file.getName()));
+
+ return;
+ }
+
+ FTPSClient ftpClient = new FTPSClient();
+ FTPClient ftpC = new FTPClient();
+
+ try {
+ if (!isSSL) {
+ try {
+ if (ftpClient.isConnected()) {
+ ftpClient.logout();
+ ftpClient.disconnect();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ ftpC.connect(server, port);
+ ftpC.login(user, pass);
+ ftpC.enterLocalPassiveMode();
+
+ ftpC.setFileType(FTP.BINARY_FILE_TYPE);
+ ftpC.setFileTransferMode(FTP.BINARY_FILE_TYPE);
+
+ ftpC.changeWorkingDirectory(
+ ServerBackup.getInstance().getConfig().getString("Ftp.Server.BackupDirectory"));
+
+ sender.sendMessage(backup.processMessage("Info.FtpUpload").replaceAll("%file%", file.getName()));
+
+ ftpC.setControlKeepAliveTimeout(100);
+
+ InputStream inputStream = Files.newInputStream(file.toPath());
+
+ boolean done = ftpC.storeFile(file.getName(), inputStream);
+
+ // DEBUG
+ Bukkit.getLogger().log(Level.INFO, "(BETA) FTP-DEBUG INFO: " + ftpC.getReplyString());
+ Bukkit.getLogger().log(Level.INFO,
+ "Use this info for reporting ftp related bugs. Ignore it if everything is fine.");
+
+ inputStream.close();
+
+ if (done) {
+ sender.sendMessage(backup.processMessage("Info.FtpUploadSuccess"));
+
+ if (ServerBackup.getInstance().getConfig().getBoolean("Ftp.DeleteLocalBackup")) {
+ boolean exists = false;
+ for (FTPFile backup : ftpC.listFiles()) {
+ if (backup.getName().equalsIgnoreCase(file.getName()))
+ exists = true;
+ }
+
+ if (exists) {
+ try {
+ Files.delete(file.toPath());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ } else {
+ sender.sendMessage(backup.processMessage("Error.FtpLocalDeletionFailed"));
+ }
+ }
+ } else {
+ sender.sendMessage(backup.processMessage("Error.FtpUploadFailed"));
+ }
+ } else {
+ try {
+ try {
+ if (ftpC.isConnected()) {
+ ftpC.logout();
+ ftpC.disconnect();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ ftpClient.connect(server, port);
+ ftpClient.login(user, pass);
+ ftpClient.enterLocalPassiveMode();
+
+ ftpClient.execPBSZ(0);
+ ftpClient.execPROT("P");
+
+ ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
+ ftpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);
+
+ ftpClient.changeWorkingDirectory(
+ ServerBackup.getInstance().getConfig().getString("Ftp.Server.BackupDirectory"));
+
+ ftpClient.setControlKeepAliveTimeout(100);
+
+ InputStream inputStream = Files.newInputStream(file.toPath());
+
+ boolean done = ftpClient.storeFile(file.getName(), inputStream);
+
+ // DEBUG
+ Bukkit.getLogger().log(Level.INFO, "(BETA) FTPS-DEBUG INFO: " + ftpClient.getReplyString());
+ Bukkit.getLogger().log(Level.INFO,
+ "Use this info for reporting ftp related bugs. Ignore it if everything is fine.");
+
+ inputStream.close();
+
+ if (done) {
+ sender.sendMessage(backup.processMessage("Info.FtpUploadSuccess"));
+
+ if (ServerBackup.getInstance().getConfig().getBoolean("Ftp.DeleteLocalBackup")) {
+ boolean exists = false;
+ for (FTPFile backup : ftpClient.listFiles()) {
+ if (backup.getName().equalsIgnoreCase(file.getName()))
+ exists = true;
+ }
+
+ if (exists) {
+ try {
+ Files.delete(file.toPath());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ } else {
+ sender.sendMessage(backup.processMessage("Error.FtpLocalDeletionFailed"));
+ }
+ }
+ } else {
+ sender.sendMessage(backup.processMessage("Error.FtpUploadFailed"));
+ }
+ } catch (Exception e) {
+ isSSL = false;
+ uploadFileToFtp(filePath, direct);
+ }
+ }
+ } catch (IOException e) {
+ sender.sendMessage(backup.processMessage("Error.FtpUploadFailed"));
+ e.printStackTrace();
+ } finally {
+ try {
+ if (ftpClient.isConnected()) {
+ ftpClient.disconnect();
+ }
+
+ if (ftpC.isConnected()) {
+ ftpC.disconnect();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public void downloadFileFromFtp(String filePath) {
+ File file = new File(filePath);
+
+ FTPSClient ftpClient = new FTPSClient();
+ FTPClient ftpC = new FTPClient();
+
+ try {
+ if (!isSSL) {
+ ftpC.connect(server, port);
+ ftpC.login(user, pass);
+ ftpC.enterLocalPassiveMode();
+
+ ftpC.setFileType(FTP.BINARY_FILE_TYPE);
+
+ ftpC.changeWorkingDirectory(
+ ServerBackup.getInstance().getConfig().getString("Ftp.Server.BackupDirectory"));
+
+ boolean exists = false;
+ for (FTPFile backup : ftpC.listFiles()) {
+ if (backup.getName().equalsIgnoreCase(file.getName()))
+ exists = true;
+ }
+
+ if (!exists) {
+ sender.sendMessage(backup.processMessage("Error.FtpNotFound").replaceAll("%file%", file.getName()));
+
+ return;
+ }
+
+ sender.sendMessage(backup.processMessage("Info.FtpDownload").replaceAll("%file%", file.getName()));
+
+ OutputStream outputStream = new BufferedOutputStream(Files.newOutputStream(file.toPath()));
+ boolean success = ftpC.retrieveFile(file.getName(), outputStream);
+ outputStream.close();
+
+ Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
+ File dFile = new File(ServerBackup.getInstance().backupDestination + "//" + file.getPath());
+
+ try {
+ FileUtils.copyFile(file, dFile);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ if (dFile.exists()) {
+ try {
+ Files.delete(file.toPath());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ });
+
+ if (success) {
+ sender.sendMessage(backup.processMessage("Info.FtpDownloadSuccess"));
+ } else {
+ sender.sendMessage(backup.processMessage("Error.FtpDownloadFailed"));
+ }
+ } else {
+ try {
+ ftpClient.connect(server, port);
+ ftpClient.login(user, pass);
+ ftpClient.enterLocalPassiveMode();
+
+ ftpClient.execPBSZ(0);
+ ftpClient.execPROT("P");
+
+ ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
+
+ ftpClient.changeWorkingDirectory(
+ ServerBackup.getInstance().getConfig().getString("Ftp.Server.BackupDirectory"));
+
+ boolean exists = false;
+ for (FTPFile backup : ftpClient.listFiles()) {
+ if (backup.getName().equalsIgnoreCase(file.getName()))
+ exists = true;
+ }
+
+ if (!exists) {
+ sender.sendMessage(backup.processMessage("Error.FtpNotFound").replaceAll("%file%", file.getName()));
+
+ return;
+ }
+
+ sender.sendMessage(backup.processMessage("Info.FtpDownload").replaceAll("%file%", file.getName()));
+
+ OutputStream outputStream = new BufferedOutputStream(Files.newOutputStream(file.toPath()));
+ boolean success = ftpClient.retrieveFile(file.getName(), outputStream);
+ outputStream.close();
+
+ Bukkit.getScheduler().runTaskAsynchronously(ServerBackup.getInstance(), () -> {
+ File dFile = new File(ServerBackup.getInstance().backupDestination + "//" + file.getPath());
+
+ try {
+ FileUtils.copyFile(file, dFile);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ if (dFile.exists()) {
+ try {
+ Files.delete(file.toPath());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ });
+
+ if (success) {
+ sender.sendMessage(backup.processMessage("Info.FtpDownloadSuccess"));
+ } else {
+ sender.sendMessage(backup.processMessage("Error.FtpDownloadFailed"));
+ }
+ } catch (Exception e) {
+ isSSL = false;
+ downloadFileFromFtp(filePath);
+ }
+ }
+ } catch (IOException e) {
+ sender.sendMessage(backup.processMessage("Error.FtpDownloadFailed"));
+ e.printStackTrace();
+ } finally {
+ try {
+ if (ftpClient.isConnected()) {
+ ftpClient.logout();
+ ftpClient.disconnect();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public List getFtpBackupList() {
+ List backups = new ArrayList<>();
+
+ FTPSClient ftpClient = new FTPSClient();
+ FTPClient ftpC = new FTPClient();
+
+ try {
+ if (!isSSL) {
+ ftpC.connect(server, port);
+ ftpC.login(user, pass);
+ ftpC.enterLocalPassiveMode();
+
+ ftpC.changeWorkingDirectory(
+ ServerBackup.getInstance().getConfig().getString("Ftp.Server.BackupDirectory"));
+
+ FTPFile[] files = ftpC.listFiles();
+
+ int c = 1;
+
+ for (FTPFile file : files) {
+ double fileSize = (double) file.getSize() / 1000 / 1000;
+ fileSize = Math.round(fileSize * 100.0) / 100.0;
+
+ backups.add("§7[" + c + "]§f " + file.getName() + " §7[" + fileSize + "MB]");
+
+ c++;
+ }
+ } else {
+ try {
+ ftpClient.connect(server, port);
+ ftpClient.login(user, pass);
+ ftpClient.enterLocalPassiveMode();
+
+ ftpClient.execPBSZ(0);
+ ftpClient.execPROT("P");
+
+ ftpClient.changeWorkingDirectory(
+ ServerBackup.getInstance().getConfig().getString("Ftp.Server.BackupDirectory"));
+
+ FTPFile[] files = ftpClient.listFiles();
+
+ int c = 1;
+
+ for (FTPFile file : files) {
+ double fileSize = (double) file.getSize() / 1000 / 1000;
+ fileSize = Math.round(fileSize * 100.0) / 100.0;
+
+ backups.add("§7[" + c + "]§f " + file.getName() + " §7[" + fileSize + "MB]");
+
+ c++;
+ }
+ } catch (Exception e) {
+ isSSL = false;
+ getFtpBackupList();
+ }
+ }
+
+ } catch (IOException e) {
+ sender.sendMessage(backup.processMessage("Error.FtpConnectionFailed"));
+ e.printStackTrace();
+ } finally {
+ try {
+ if (ftpClient.isConnected()) {
+ ftpClient.logout();
+ ftpClient.disconnect();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ return backups;
+ }
+
+}
diff --git a/src/main/java/de/seblii/serverbackup/utils/WebDavManager.java b/src/main/java/de/seblii/serverbackup/utils/WebDavManager.java
new file mode 100644
index 00000000..51566ba9
--- /dev/null
+++ b/src/main/java/de/seblii/serverbackup/utils/WebDavManager.java
@@ -0,0 +1,98 @@
+package de.seblii.serverbackup.utils;
+
+import com.github.sardine.DavResource;
+import com.github.sardine.Sardine;
+import com.github.sardine.SardineFactory;
+import de.seblii.serverbackup.ServerBackup;
+import org.bukkit.command.CommandSender;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.Objects;
+
+public class WebDavManager {
+
+ private final CommandSender sender;
+ private final String URL;
+ private final String USERNAME;
+ private final String PASSWORD;
+
+ public WebDavManager(CommandSender sender) {
+ this.sender = sender;
+ URL = ServerBackup.getInstance().cloud.getString("Cloud.WebDav.Url");
+ USERNAME = ServerBackup.getInstance().cloud.getString("Cloud.WebDav.Username");
+ PASSWORD = ServerBackup.getInstance().cloud.getString("Cloud.WebDav.Password");
+ }
+
+ public void uploadToWebDav(String filePath) throws IOException {
+
+ File file = new File(filePath);
+
+ if (!file.getPath().contains(ServerBackup.getInstance().backupDestination.replaceAll("/", ""))) {
+ file = new File(ServerBackup.getInstance().backupDestination + "//" + filePath);
+ filePath = file.getPath();
+ }
+
+ if (!file.exists()) {
+ sender.sendMessage("WebDav: Backup '" + file.getName() + "' not found.");
+
+ return;
+ }
+
+ Sardine sardine = SardineFactory.begin(USERNAME, PASSWORD);
+ sardine.enablePreemptiveAuthentication(URL);
+
+ String des = Objects.requireNonNull(ServerBackup.getInstance().cloud.getString("Cloud.WebDav.Destination")).replaceAll("/", "");
+
+ String folderWebDav = URL + (des.equals("") || des.equals(".") ? "" : des + "/");
+
+ if (!des.equals("") && !des.equals(".")) {
+
+ List resources = sardine.list(URL);
+
+ System.out.println(des);
+
+ for (DavResource res: resources
+ ) {
+ System.out.println(res);
+ }
+
+ boolean containsFolder = resources.stream()
+ .anyMatch(resource -> {
+ String[] parts = resource.getName().split("/");
+ String lastPart = parts[parts.length - 1];
+ return lastPart.equals(des);
+ });
+
+ if (!containsFolder) {
+ System.out.println("We in this");
+ sardine.createDirectory(folderWebDav);
+ }
+ }
+
+ boolean success = false;
+ try (InputStream in = Files.newInputStream(Paths.get(filePath))) {
+ sardine.put(folderWebDav + file.getName(), in);
+ success = true;
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ if (success){
+ sender.sendMessage("WebDav: Upload successfully. Backup stored in your WebDav storage.");
+
+ if (ServerBackup.getInstance().getConfig().getBoolean("CloudBackup.Options.DeleteLocalBackup")) {
+ try {
+ Files.delete(file.toPath());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ System.out.println("File [" + file.getPath() + "] deleted.");
+ }
+ }
+ }
+}
diff --git a/src/plugin.yml b/src/main/resources/plugin.yml
similarity index 85%
rename from src/plugin.yml
rename to src/main/resources/plugin.yml
index a47d8ce5..3bd0af9b 100644
--- a/src/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -1,19 +1,19 @@
-name: ServerBackup
-author: Seblii
-version: 2.9.6
-api-version: 1.18
-
-main: de.seblii.serverbackup.ServerBackup
-
-commands:
- backup:
- aliases: [serverbackup]
- permission: backup.admin
-
-permissions:
- backup.admin:
- description: Permission for all backup commands
- backup.notification:
- description: Permission for receiving information about backups
- backup.update:
- description: Permission for receiving update messages
+name: ServerBackup
+author: Seblii
+version: 2.9.6
+api-version: 1.16
+
+main: de.seblii.serverbackup.ServerBackup
+
+commands:
+ backup:
+ aliases: [serverbackup, sb]
+ permission: backup.admin
+
+permissions:
+ backup.admin:
+ description: Permission for all backup commands
+ backup.notification:
+ description: Permission for receiving information about backups
+ backup.update:
+ description: Permission for receiving update messages