Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Created the ClearData command #817

Merged
merged 8 commits into from
Dec 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,276 @@
package com.iridium.iridiumskyblock.commands;

import com.iridium.iridiumcore.utils.StringUtils;
import com.iridium.iridiumskyblock.IridiumSkyblock;
import com.iridium.iridiumskyblock.database.Island;
import com.iridium.iridiumskyblock.database.User;
import com.iridium.iridiumskyblock.managers.DatabaseManager;
import com.iridium.iridiumskyblock.managers.tablemanagers.*;
import com.iridium.iridiumteams.IridiumTeams;
import com.iridium.iridiumteams.commands.Command;
import com.iridium.iridiumteams.database.*;
import com.iridium.iridiumteams.gui.ConfirmationGUI;
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.nio.file.StandardCopyOption;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;

public class ClearDataCommand extends Command < Island, User > {

public ClearDataCommand() {
super(Collections.singletonList("cleardata"), "Deletes data from database", "%prefix% &7/is cleardata <table> <team> --skip-confirm", "iridiumSkyblock.clearData", 10);
}

@Override
public boolean execute(CommandSender sender, String[] args, IridiumTeams < Island, User > iridiumTeams) {
DataTable table = DataTable.ALL;
boolean skipConfirmation = false;
Optional < Island > island = Optional.empty();

if (args.length == 0 || Arrays.stream(DataTable.values()).noneMatch(dataTable -> dataTable.name().equalsIgnoreCase(args[0]))) {
sender.sendMessage(StringUtils.color(syntax.replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix)));
return false;
}

switch (args.length) {
case 2: {
if (!args[1].equalsIgnoreCase("--skip-confirm")) {
island = IridiumSkyblock.getInstance().getIslandManager().getTeamViaNameOrPlayer(args[1]);
if (!island.isPresent()) {
sender.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().teamDoesntExistByName
.replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix)));
return false;
}
}
}
case 1: {
try {
if (Arrays.stream(DataTable.values()).anyMatch(dataTable -> dataTable.name().equalsIgnoreCase(args[0])))
table = DataTable.valueOf(args[0]);
} catch (IllegalArgumentException e) {
IridiumSkyblock.getInstance().getLogger().warning(e.getMessage());
return false;
}
}
}

if (Arrays.stream(args).anyMatch(argument -> argument.equalsIgnoreCase("--skip-confirm")))
skipConfirmation = true;

if (sender instanceof Player && !skipConfirmation) {
confirmDataDeletion((Player) sender, island, table);
return true;
}
deleteData(sender, island, table);

return true;
}

private void confirmDataDeletion(Player player, Optional < Island > island, DataTable table) {
String islandName = "ALL";
if (island.isPresent()) islandName = island.get().getName() + " (" + island.get().getOwner().get().getName() + ")";
player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().confirmDataDeletion
.replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix)
.replace("%table%", table.name())
.replace("%island%", islandName)));

player.openInventory(new ConfirmationGUI < > (() -> deleteData(player, island, table), IridiumSkyblock.getInstance()).getInventory());
}

private CompletableFuture < Void > deleteData(CommandSender sender, Optional < Island > island, DataTable table) {
return CompletableFuture.runAsync(() -> {

if (!backupDatabaseFile()) return;

List < Island > islands = new ArrayList < > ();
if (!island.isPresent()) {
islands = IridiumSkyblock.getInstance().getIslandManager().getTeams();
} else islands.add(island.get());

boolean all = table == DataTable.ALL;

DatabaseManager databaseManager = IridiumSkyblock.getInstance().getDatabaseManager();

try {
switch (table) {
case ALL:
case ISLAND: {
databaseManager.getIslandTableManager().delete(islands).join();
if (!all) break;
}
case INVITE: {
ForeignIslandTableManager < String, TeamInvite > inviteTableManager = databaseManager.getInvitesTableManager();
for (Island islandEntry: islands) {
for (TeamInvite teamInvite: inviteTableManager.getEntries(islandEntry)) {
inviteTableManager.delete(teamInvite).join();
}
}
if (!all) break;
}
case TRUST: {
ForeignIslandTableManager < String, TeamTrust > trustTableManager = databaseManager.getTrustTableManager();
for (Island islandEntry: islands) {
for (TeamTrust teamTrust: trustTableManager.getEntries(islandEntry)) {
trustTableManager.delete(teamTrust).join();
}
}
if (!all) break;
}
case PERMISSION: {
ForeignIslandTableManager < String, TeamPermission > permissionTableManager = databaseManager.getPermissionsTableManager();
for (Island islandEntry: islands) {
for (TeamPermission teamPermission: permissionTableManager.getEntries(islandEntry)) {
permissionTableManager.delete(teamPermission).join();
}
}
if (!all) break;
}
case BANK: {
ForeignIslandTableManager < String, TeamBank > bankTableManager = databaseManager.getBankTableManager();
for (Island islandEntry: islands) {
for (TeamBank teamBank: bankTableManager.getEntries(islandEntry)) {
bankTableManager.delete(teamBank).join();
}
}
if (!all) break;
}
case ENHANCEMENT: {
ForeignIslandTableManager < String, TeamEnhancement > enhancementTableManager = databaseManager.getEnhancementTableManager();
for (Island islandEntry: islands) {
for (TeamEnhancement teamEnhancement: enhancementTableManager.getEntries(islandEntry)) {
enhancementTableManager.delete(teamEnhancement).join();
}
}
if (!all) break;
}
case TEAM_BLOCK: {
ForeignIslandTableManager < String, TeamBlock > blockTableManager = databaseManager.getTeamBlockTableManager();
for (Island islandEntry: islands) {
for (TeamBlock teamBlock: blockTableManager.getEntries(islandEntry)) {
blockTableManager.delete(teamBlock).join();
}
}
if (!all) break;
}
case TEAM_SPAWNER: {
ForeignIslandTableManager < String, TeamSpawners > spawnerTableManager = databaseManager.getTeamSpawnerTableManager();
for (Island islandEntry: islands) {
for (TeamSpawners teamSpawners: spawnerTableManager.getEntries(islandEntry)) {
spawnerTableManager.delete(teamSpawners).join();
}
}
if (!all) break;
}
case TEAM_WARP: {
ForeignIslandTableManager < String, TeamWarp > warpTableManager = databaseManager.getTeamWarpTableManager();
for (Island islandEntry: islands) {
for (TeamWarp teamWarp: warpTableManager.getEntries(islandEntry)) {
warpTableManager.delete(teamWarp).join();
}
}
if (!all) break;
}
case TEAM_MISSION: {
ForeignIslandTableManager < String, TeamMission > missionTableManager = databaseManager.getTeamMissionTableManager();
for (Island islandEntry: islands) {
for (TeamMission teamMission: missionTableManager.getEntries(islandEntry)) {
IridiumSkyblock.getInstance().getIslandManager().deleteTeamMission(teamMission);
IridiumSkyblock.getInstance().getIslandManager().deleteTeamMissionData(teamMission);
}
}
if (!all) break;
}

case TEAM_REWARDS: {
ForeignIslandTableManager < String, TeamReward > rewardTableManager = databaseManager.getTeamRewardsTableManager();
for (Island islandEntry: islands) {
for (TeamReward teamReward: rewardTableManager.getEntries(islandEntry)) {
rewardTableManager.delete(teamReward).join();
}
}
if (!all) break;
}
case TEAM_SETTINGS: {
ForeignIslandTableManager < String, TeamSetting > settingTableManager = databaseManager.getTeamSettingsTableManager();
for (Island islandEntry: islands) {
for (TeamSetting teamSetting: settingTableManager.getEntries(islandEntry)) {
settingTableManager.delete(teamSetting).join();
}
}
}
}
} catch (Exception e) {
IridiumSkyblock.getInstance().getLogger().warning(e.getMessage());
return;
}

sender.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().dataDeletion
.replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix)));
});
}

private boolean backupDatabaseFile() {
IridiumSkyblock.getInstance().getLogger().info("Creating a backup for IridiumSkyblock.db in \"backups\" folder...");

File pluginFolder = new File(IridiumSkyblock.getInstance().getDataFolder().getPath());
File file = new File(pluginFolder + File.separator + "IridiumSkyblock.db");
File backupFolder = new File(pluginFolder.getPath() + File.separator + "backups");
File backupDatabaseFile = new File(backupFolder + File.separator + file.getName());

try {
if (!backupFolder.exists()) backupFolder.mkdir();
Files.copy(file.toPath(), backupDatabaseFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
IridiumSkyblock.getInstance().getLogger().info("Success! Backup \"IridiumSkyblock.db\" created, check \"" + backupFolder.getPath() + "\".");
return true;
} catch (IOException exception) {
IridiumSkyblock.getInstance().getLogger().severe("Failed to move \"IridiumSkyblock.db\" to " + backupFolder + ": " +
exception.getMessage());
return false;
}
}

@Override
public List < String > onTabComplete(CommandSender commandSender, String[] args, IridiumTeams < Island, User > iridiumTeams) {
switch (args.length) {
case 1: {
List < String > tables = new ArrayList < > ();
for (DataTable table: DataTable.values()) {
tables.add(table.name());
}
return tables;
}
case 2: {
List < String > fullTabComplete = Bukkit.getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toList());
fullTabComplete.add("--skip-confirm");
return fullTabComplete;
}
case 3:
return Collections.singletonList("--skip-confirm");
default:
return Collections.emptyList();
}
}
}

enum DataTable {
ALL,
ISLAND,
INVITE,
TRUST,
PERMISSION,
BANK,
ENHANCEMENT,
TEAM_BLOCK,
TEAM_SPAWNER,
TEAM_WARP,
TEAM_MISSION,
TEAM_REWARDS,
TEAM_SETTINGS;
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package com.iridium.iridiumskyblock.configs;

import com.iridium.iridiumskyblock.commands.BiomeCommand;
import com.iridium.iridiumskyblock.commands.BorderCommand;
import com.iridium.iridiumskyblock.commands.RegenCommand;
import com.iridium.iridiumskyblock.commands.VisitCommand;
import com.iridium.iridiumskyblock.commands.*;
import com.iridium.iridiumskyblock.database.Island;
import com.iridium.iridiumskyblock.database.User;

Expand All @@ -16,4 +13,5 @@ public Commands() {
public BorderCommand borderCommand = new BorderCommand();
public RegenCommand regenCommand = new RegenCommand();
public BiomeCommand biomeCommand = new BiomeCommand();
public ClearDataCommand clearDataCommand = new ClearDataCommand();
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,7 @@ public Messages() {
public String noBiomeCategory = "%prefix% &7No biome category with that name.";
public String noBiome = "%prefix% &7No biome with that name.";
public String changedBiome = "%prefix% &7%player% successfully changed your Island biome to %biome%.";
public String specifyData = "%prefix% &7Due to the nature of this destructive command, you must specify the data to be deleted (or specify \"all\").";
public String confirmDataDeletion = "%prefix% &7You are about to delete the following data: %table% | [for: %island%] in 5 seconds. &cAre you sure you want to do this? (DATA IS &4&lUNRECOVERABLE&r&c)";
public String dataDeletion = "%prefix% &cData has been deleted successfully. &7You may need to restart your server for it to take effect.";
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public void registerCommands() {
registerCommand(IridiumSkyblock.getInstance().getCommands().borderCommand);
registerCommand(IridiumSkyblock.getInstance().getCommands().regenCommand);
registerCommand(IridiumSkyblock.getInstance().getCommands().biomeCommand);
registerCommand(IridiumSkyblock.getInstance().getCommands().clearDataCommand);
registerCommand(new IsThisWorking());
registerCommand(new IsMyComputerOnFire());
}
Expand Down
Loading