From ca71243ad591ec494d5fc314abccf40e4c8bade1 Mon Sep 17 00:00:00 2001 From: destro174 <40720638+destro174@users.noreply.github.com> Date: Tue, 15 Feb 2022 14:07:31 +0100 Subject: [PATCH] Add alternative claim expiriation --- .../CleanupUnusedClaimTask.java | 33 +++++++++++++- .../GriefPrevention/GriefPrevention.java | 20 +++++++++ .../alttd/config/AlttdConfig.java | 43 +++++++++++++++++++ .../alttd/tasks/ClaimExpireTask.java | 37 ++++++++++++++++ src/main/resources/plugin.yml | 4 ++ 5 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 src/main/java/me/ryanhamshire/GriefPrevention/alttd/tasks/ClaimExpireTask.java diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/CleanupUnusedClaimTask.java b/src/main/java/me/ryanhamshire/GriefPrevention/CleanupUnusedClaimTask.java index ce3f1c6..988354a 100644 --- a/src/main/java/me/ryanhamshire/GriefPrevention/CleanupUnusedClaimTask.java +++ b/src/main/java/me/ryanhamshire/GriefPrevention/CleanupUnusedClaimTask.java @@ -18,6 +18,7 @@ package me.ryanhamshire.GriefPrevention; +import me.ryanhamshire.GriefPrevention.alttd.config.AlttdConfig; import me.ryanhamshire.GriefPrevention.events.ClaimExpirationEvent; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; @@ -31,12 +32,19 @@ class CleanupUnusedClaimTask implements Runnable Claim claim; PlayerData ownerData; OfflinePlayer ownerInfo; + boolean forced; CleanupUnusedClaimTask(Claim claim, PlayerData ownerData, OfflinePlayer ownerInfo) + { + this(claim, ownerData, ownerInfo, false); + } + + CleanupUnusedClaimTask(Claim claim, PlayerData ownerData, OfflinePlayer ownerInfo, boolean forced) { this.claim = claim; this.ownerData = ownerData; this.ownerInfo = ownerInfo; + this.forced = forced; } @Override @@ -80,13 +88,34 @@ class CleanupUnusedClaimTask implements Runnable Calendar earliestPermissibleLastLogin = Calendar.getInstance(); earliestPermissibleLastLogin.add(Calendar.DATE, -GriefPrevention.instance.config_claims_expirationDays); - if (earliestPermissibleLastLogin.getTime().after(new Date(ownerInfo.getLastPlayed()))) + if (earliestPermissibleLastLogin.getTime().after(new Date(ownerInfo.getLastPlayed())) || forced) { if (expireEventCanceled()) return; //make a copy of this player's claim list Vector claims = new Vector<>(ownerData.getClaims()); - + // Alternative logic for deleting claims + if(AlttdConfig.alternativeClaimExpiring) { + for (Claim claim : claims) + { + // remove all subclaims a claim has + for (int j = 1; (j - 1) < claim.children.size(); j++) + { + GriefPrevention.instance.dataStore.deleteClaim(claim.children.get(j - 1), true); + } + // remove all trusted players + claim.clearPermissions(); + // public trust + claim.setPermission("public", ClaimPermission.Build); + // make the claim an (expiring) admin claim + GriefPrevention.instance.dataStore.changeClaimOwner(claim, null); + AlttdConfig.addExpiringClaim(claim.id); + } + GriefPrevention.AddLogEntry(" All of " + claim.getOwnerName() + "'s claims have expired and converted to a temp claim.", CustomLogEntryTypes.AdminActivity); + GriefPrevention.AddLogEntry("earliestPermissibleLastLogin#getTime: " + earliestPermissibleLastLogin.getTime(), CustomLogEntryTypes.Debug, true); + GriefPrevention.AddLogEntry("ownerInfo#getLastPlayed: " + ownerInfo.getLastPlayed(), CustomLogEntryTypes.Debug, true); + return; + } //delete them GriefPrevention.instance.dataStore.deleteClaimsForPlayer(claim.ownerID, true); GriefPrevention.AddLogEntry(" All of " + claim.getOwnerName() + "'s claims have expired.", CustomLogEntryTypes.AdminActivity); diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/GriefPrevention.java b/src/main/java/me/ryanhamshire/GriefPrevention/GriefPrevention.java index ce86fc9..b099311 100644 --- a/src/main/java/me/ryanhamshire/GriefPrevention/GriefPrevention.java +++ b/src/main/java/me/ryanhamshire/GriefPrevention/GriefPrevention.java @@ -19,6 +19,7 @@ package me.ryanhamshire.GriefPrevention; import me.ryanhamshire.GriefPrevention.DataStore.NoTransferException; +import me.ryanhamshire.GriefPrevention.alttd.tasks.ClaimExpireTask; import me.ryanhamshire.GriefPrevention.events.PreventBlockBreakEvent; import me.ryanhamshire.GriefPrevention.events.SaveTrappedPlayerEvent; import me.ryanhamshire.GriefPrevention.events.TrustChangedEvent; @@ -355,6 +356,10 @@ public class GriefPrevention extends JavaPlugin FindUnusedClaimsTask task2 = new FindUnusedClaimsTask(); this.getServer().getScheduler().scheduleSyncRepeatingTask(this, task2, 20L * 60, 20L * config_advanced_claim_expiration_check_rate); + // start task to clean up temporary admin claims + ClaimExpireTask claimExpireTask = new ClaimExpireTask(this); + claimExpireTask.init(); + //register for events PluginManager pluginManager = this.getServer().getPluginManager(); @@ -1269,6 +1274,21 @@ public class GriefPrevention extends JavaPlugin return this.abandonClaimHandler(player, true); } + //forceabandonclaim + if (cmd.getName().equalsIgnoreCase("forceabandonclaim") && player != null) + { + Claim claim = this.dataStore.getClaimAt(player.getLocation(), true /*ignore height*/, true, null); + if (claim == null) + { + GriefPrevention.sendMessage(player, TextMode.Instr, Messages.AbandonClaimMissing); + return true; + } + PlayerData ownerData = GriefPrevention.instance.dataStore.getPlayerDataFromStorage(claim.ownerID); + OfflinePlayer ownerInfo = Bukkit.getServer().getOfflinePlayer(claim.ownerID); + Bukkit.getScheduler().scheduleSyncDelayedTask(GriefPrevention.instance, new CleanupUnusedClaimTask(claim, ownerData, ownerInfo, true), 0); + return true; + } + //ignoreclaims if (cmd.getName().equalsIgnoreCase("ignoreclaims") && player != null) { diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/alttd/config/AlttdConfig.java b/src/main/java/me/ryanhamshire/GriefPrevention/alttd/config/AlttdConfig.java index 3eb52b3..ddbd2dc 100644 --- a/src/main/java/me/ryanhamshire/GriefPrevention/alttd/config/AlttdConfig.java +++ b/src/main/java/me/ryanhamshire/GriefPrevention/alttd/config/AlttdConfig.java @@ -2,6 +2,13 @@ package me.ryanhamshire.GriefPrevention.alttd.config; import com.alttd.galaxy.configuration.AbstractConfiguration; import me.ryanhamshire.GriefPrevention.GriefPrevention; +import me.ryanhamshire.GriefPrevention.alttd.util.Logger; +import org.spongepowered.configurate.ConfigurationNode; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; @SuppressWarnings("unused") public class AlttdConfig extends AbstractConfiguration @@ -23,9 +30,45 @@ public class AlttdConfig extends AbstractConfiguration config.readConfig(AlttdConfig.class, null); } + private HashMap getMap(String path, HashMap def) { + set(path, def); + ConfigurationNode node = config.getNode(path); + HashMap map = new HashMap<>(); + for (Map.Entry entry : node.childrenMap().entrySet()) { + try { + map.put(Long.parseLong(entry.getKey().toString()), Long.parseLong(entry.getValue().getString())); + } catch (NumberFormatException exception) { + // handle + } + } + return map; + } + public static boolean DEBUG_MODE = false; + public static boolean alternativeClaimExpiring = false; + public static int alternativeClaimExpireDays = 1; + public static int expireCheckRate = 1200; + public static HashMap expiringClaims = new HashMap<>(); private static void settings() { + String node = "alternative-claim-expiring"; DEBUG_MODE = config.getBoolean("debug-mode", DEBUG_MODE); + alternativeClaimExpiring = config.getBoolean(node + ".enabled", alternativeClaimExpiring); + alternativeClaimExpireDays = config.getInt(node + ".days", alternativeClaimExpireDays); + expireCheckRate = config.getInt(node + ".expire-check-rate", expireCheckRate); + // todo create an alternative way of loading these in + expiringClaims.clear(); + config.getMap(node + ".claims", new HashMap<>()) + .forEach((key, value) -> { + try { + expiringClaims.put(Long.parseLong(key.toString()), value); + } catch (NumberFormatException ignored) {} + }); + } + + public static void addExpiringClaim(Long id) { + expiringClaims.put(id, System.currentTimeMillis() + TimeUnit.DAYS.toMillis(alternativeClaimExpireDays)); + config.set("alternative-claim-expiring.claims", expiringClaims); + config.saveConfig(); } } diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/alttd/tasks/ClaimExpireTask.java b/src/main/java/me/ryanhamshire/GriefPrevention/alttd/tasks/ClaimExpireTask.java new file mode 100644 index 0000000..685b550 --- /dev/null +++ b/src/main/java/me/ryanhamshire/GriefPrevention/alttd/tasks/ClaimExpireTask.java @@ -0,0 +1,37 @@ +package me.ryanhamshire.GriefPrevention.alttd.tasks; + +import me.ryanhamshire.GriefPrevention.GriefPrevention; +import me.ryanhamshire.GriefPrevention.alttd.config.AlttdConfig; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.Iterator; +import java.util.Map; + +public class ClaimExpireTask extends BukkitRunnable +{ + private GriefPrevention plugin; + + public ClaimExpireTask(GriefPrevention plugin) + { + this.plugin = plugin; + } + + public void init() + { + runTaskTimer(plugin, 0, AlttdConfig.expireCheckRate); + } + + @Override + public void run() + { + //Config.expiringClaims.entrySet().removeIf(entry -> System.currentTimeMillis() >= entry.getValue()); + for(Iterator> it = AlttdConfig.expiringClaims.entrySet().iterator(); it.hasNext(); ) { + Map.Entry entry = it.next(); + if(System.currentTimeMillis() >= entry.getValue()) { + it.remove(); + plugin.getLogger().info("Removed temporary admin claim with id " + entry.getKey()); + } + } + } + +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 198665f..a3994cf 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -19,6 +19,10 @@ commands: description: Deletes ALL your claims. usage: /AbandonAllClaims permission: griefprevention.claims + forceabandonclaim: + description: Forces the claim you are standing in to abandon. + usage: /forceabandonclaim + permission: griefprevention.forceabandonclaim trust: description: Grants a player full access to your claim(s). usage: /Trust Grants a player permission to build. See also /UnTrust, /ContainerTrust, /AccessTrust, and /PermissionTrust.