Add alternative claim expiriation

This commit is contained in:
destro174 2022-02-15 14:07:31 +01:00
parent 9a12797204
commit ca71243ad5
5 changed files with 135 additions and 2 deletions

View File

@ -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<Claim> 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);

View File

@ -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)
{

View File

@ -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<Long, Long> getMap(String path, HashMap<Long, Long> def) {
set(path, def);
ConfigurationNode node = config.getNode(path);
HashMap<Long, Long> map = new HashMap<>();
for (Map.Entry<Object, ? extends ConfigurationNode> 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<Long, Long> 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();
}
}

View File

@ -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<Map.Entry<Long, Long>> it = AlttdConfig.expiringClaims.entrySet().iterator(); it.hasNext(); ) {
Map.Entry<Long, Long> entry = it.next();
if(System.currentTimeMillis() >= entry.getValue()) {
it.remove();
plugin.getLogger().info("Removed temporary admin claim with id " + entry.getKey());
}
}
}
}

View File

@ -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 <player> Grants a player permission to build. See also /UnTrust, /ContainerTrust, /AccessTrust, and /PermissionTrust.