delete inactive claims close #54
This commit is contained in:
parent
2d3108f4c5
commit
8e2291ecb2
@ -15,6 +15,9 @@ Flan 1.5.0
|
|||||||
- Add EDITPOTIONS permission for that. There are no limits to potion effects so
|
- Add EDITPOTIONS permission for that. There are no limits to potion effects so
|
||||||
this should be admin reserved only.
|
this should be admin reserved only.
|
||||||
Default global value is ALLFALSE so disabled for that reason
|
Default global value is ALLFALSE so disabled for that reason
|
||||||
|
- Add claim deletion for inactive players. Added config for that are:
|
||||||
|
inactivityTime - How long in days a player has to be offline for it to check the player
|
||||||
|
inactivityBlocksMax - How much claimblocks the player can have at max for it to delete the claims
|
||||||
|
|
||||||
Flan 1.4.2
|
Flan 1.4.2
|
||||||
======================
|
======================
|
||||||
|
@ -6,12 +6,16 @@ import net.minecraft.server.MinecraftServer;
|
|||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
|
||||||
public class Flan {
|
public class Flan {
|
||||||
|
|
||||||
public static final Logger logger = LogManager.getLogger("flan");
|
public static final Logger logger = LogManager.getLogger("flan");
|
||||||
|
|
||||||
public static boolean permissionAPI, gunpowder, playerAbilityLib;
|
public static boolean permissionAPI, gunpowder, playerAbilityLib;
|
||||||
|
|
||||||
|
public static final DateTimeFormatter onlineTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
|
||||||
|
|
||||||
public static void lockRegistry(MinecraftServer server) {
|
public static void lockRegistry(MinecraftServer server) {
|
||||||
PermissionRegistry.lock();
|
PermissionRegistry.lock();
|
||||||
}
|
}
|
||||||
|
@ -62,6 +62,7 @@ public class ClaimStorage {
|
|||||||
public ClaimStorage(MinecraftServer server, ServerWorld world) {
|
public ClaimStorage(MinecraftServer server, ServerWorld world) {
|
||||||
this.globalClaim = new GlobalClaim(world);
|
this.globalClaim = new GlobalClaim(world);
|
||||||
this.read(server, world);
|
this.read(server, world);
|
||||||
|
OfflinePlayerData.deleteUnusedClaims(server, this, world);
|
||||||
}
|
}
|
||||||
|
|
||||||
public UUID generateUUID() {
|
public UUID generateUUID() {
|
||||||
@ -304,6 +305,10 @@ public class ClaimStorage {
|
|||||||
file.createNewFile();
|
file.createNewFile();
|
||||||
dirty = true;
|
dirty = true;
|
||||||
} else {
|
} else {
|
||||||
|
if (e.getValue().isEmpty()) {
|
||||||
|
file.delete();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (this.dirty.remove(owner.equals(adminClaimString) ? null : e.getKey())) {
|
if (this.dirty.remove(owner.equals(adminClaimString) ? null : e.getKey())) {
|
||||||
dirty = true;
|
dirty = true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -58,6 +58,9 @@ public class Config {
|
|||||||
public boolean lockDrops = true;
|
public boolean lockDrops = true;
|
||||||
public int dropTicks = 6000;
|
public int dropTicks = 6000;
|
||||||
|
|
||||||
|
public int inactivityTime = 30;
|
||||||
|
public int inactivityBlocksMax = 2000;
|
||||||
|
|
||||||
public boolean log;
|
public boolean log;
|
||||||
|
|
||||||
public Map<String, Map<ClaimPermission, Boolean>> defaultGroups = createHashMap(map -> {
|
public Map<String, Map<ClaimPermission, Boolean>> defaultGroups = createHashMap(map -> {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package io.github.flemmli97.flan.player;
|
package io.github.flemmli97.flan.player;
|
||||||
|
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
|
import io.github.flemmli97.flan.Flan;
|
||||||
import io.github.flemmli97.flan.api.IPlayerData;
|
import io.github.flemmli97.flan.api.IPlayerData;
|
||||||
import io.github.flemmli97.flan.claim.Claim;
|
import io.github.flemmli97.flan.claim.Claim;
|
||||||
import io.github.flemmli97.flan.claim.ClaimStorage;
|
import io.github.flemmli97.flan.claim.ClaimStorage;
|
||||||
@ -11,13 +12,18 @@ import net.minecraft.util.WorldSavePath;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileReader;
|
import java.io.FileReader;
|
||||||
|
import java.io.FileWriter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class OfflinePlayerData implements IPlayerData {
|
public class OfflinePlayerData implements IPlayerData {
|
||||||
|
|
||||||
public final int claimBlocks, additionalClaimBlocks;
|
public final int claimBlocks, additionalClaimBlocks;
|
||||||
|
public final LocalDateTime lastOnline;
|
||||||
public final UUID owner;
|
public final UUID owner;
|
||||||
public final MinecraftServer server;
|
public final MinecraftServer server;
|
||||||
|
|
||||||
@ -26,15 +32,17 @@ public class OfflinePlayerData implements IPlayerData {
|
|||||||
int claim = ConfigHandler.config.startingBlocks;
|
int claim = ConfigHandler.config.startingBlocks;
|
||||||
int add = 0;
|
int add = 0;
|
||||||
this.owner = uuid;
|
this.owner = uuid;
|
||||||
|
LocalDateTime last = LocalDateTime.now();
|
||||||
if (dir.exists()) {
|
if (dir.exists()) {
|
||||||
try {
|
try {
|
||||||
File file = new File(dir, uuid + ".json");
|
File file = new File(dir, uuid + ".json");
|
||||||
if (file.exists()) {
|
if (file.exists()) {
|
||||||
FileReader reader = new FileReader(file);
|
FileReader reader = new FileReader(file);
|
||||||
JsonObject obj = ConfigHandler.GSON.fromJson(reader, JsonObject.class);
|
JsonObject obj = ConfigHandler.GSON.fromJson(reader, JsonObject.class);
|
||||||
|
reader.close();
|
||||||
claim = obj.get("ClaimBlocks").getAsInt();
|
claim = obj.get("ClaimBlocks").getAsInt();
|
||||||
add = obj.get("AdditionalBlocks").getAsInt();
|
add = obj.get("AdditionalBlocks").getAsInt();
|
||||||
reader.close();
|
last = LocalDateTime.parse(obj.get("LastSeen").getAsString(), Flan.onlineTimeFormatter);
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -42,6 +50,36 @@ public class OfflinePlayerData implements IPlayerData {
|
|||||||
}
|
}
|
||||||
this.claimBlocks = claim;
|
this.claimBlocks = claim;
|
||||||
this.additionalClaimBlocks = add;
|
this.additionalClaimBlocks = add;
|
||||||
|
this.lastOnline = last;
|
||||||
|
this.server = server;
|
||||||
|
}
|
||||||
|
|
||||||
|
private OfflinePlayerData(MinecraftServer server, File dataFile, UUID uuid) {
|
||||||
|
int claim = ConfigHandler.config.startingBlocks;
|
||||||
|
int add = 0;
|
||||||
|
LocalDateTime last = LocalDateTime.now();
|
||||||
|
try {
|
||||||
|
FileReader reader = new FileReader(dataFile);
|
||||||
|
JsonObject obj = ConfigHandler.GSON.fromJson(reader, JsonObject.class);
|
||||||
|
reader.close();
|
||||||
|
|
||||||
|
claim = obj.get("ClaimBlocks").getAsInt();
|
||||||
|
add = obj.get("AdditionalBlocks").getAsInt();
|
||||||
|
if (obj.has("LastSeen")) {
|
||||||
|
last = LocalDateTime.parse(obj.get("LastSeen").getAsString(), Flan.onlineTimeFormatter);
|
||||||
|
} else {
|
||||||
|
obj.addProperty("LastSeen", last.format(Flan.onlineTimeFormatter));
|
||||||
|
FileWriter write = new FileWriter(dataFile);
|
||||||
|
ConfigHandler.GSON.toJson(obj, write);
|
||||||
|
write.close();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
this.claimBlocks = claim;
|
||||||
|
this.additionalClaimBlocks = add;
|
||||||
|
this.lastOnline = last;
|
||||||
|
this.owner = uuid;
|
||||||
this.server = server;
|
this.server = server;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,4 +103,33 @@ public class OfflinePlayerData implements IPlayerData {
|
|||||||
}
|
}
|
||||||
return usedClaimsBlocks;
|
return usedClaimsBlocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Map<UUID, OfflinePlayerData> collectAllPlayerData(MinecraftServer server) {
|
||||||
|
File dir = new File(server.getSavePath(WorldSavePath.PLAYERDATA).toFile(), "/claimData/");
|
||||||
|
Map<UUID, OfflinePlayerData> playerDatas = new HashMap<>();
|
||||||
|
if (dir.exists()) {
|
||||||
|
for (File data : dir.listFiles()) {
|
||||||
|
if (data.getName().endsWith(".json")) {
|
||||||
|
UUID uuid = UUID.fromString(data.getName().replace(".json", ""));
|
||||||
|
playerDatas.put(uuid, new OfflinePlayerData(server, data, uuid));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return playerDatas;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void deleteUnusedClaims(MinecraftServer server, ClaimStorage storage, ServerWorld world) {
|
||||||
|
if (ConfigHandler.config.inactivityTime == -1)
|
||||||
|
return;
|
||||||
|
Map<UUID, OfflinePlayerData> playerData = collectAllPlayerData(server);
|
||||||
|
LocalDateTime now = LocalDateTime.now();
|
||||||
|
playerData.forEach((uuid, data) -> {
|
||||||
|
if (now.isAfter(data.lastOnline.plusDays(ConfigHandler.config.inactivityTime))
|
||||||
|
&& data.claimBlocks + data.additionalClaimBlocks < ConfigHandler.config.inactivityBlocksMax) {
|
||||||
|
Flan.log("{} Deleting all claims for inactive player {} last seen {}", world.getRegistryKey(), data.owner, data.lastOnline);
|
||||||
|
storage.allClaimsFromPlayer(data.owner)
|
||||||
|
.forEach(claim -> storage.deleteClaim(claim, true, EnumEditMode.DEFAULT, world));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,9 @@ import java.io.File;
|
|||||||
import java.io.FileReader;
|
import java.io.FileReader;
|
||||||
import java.io.FileWriter;
|
import java.io.FileWriter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -60,6 +62,8 @@ public class PlayerClaimData implements IPlayerData {
|
|||||||
|
|
||||||
private final Map<String, Map<ClaimPermission, Boolean>> defaultGroups = new HashMap<>();
|
private final Map<String, Map<ClaimPermission, Boolean>> defaultGroups = new HashMap<>();
|
||||||
|
|
||||||
|
private Date lastOnline;
|
||||||
|
|
||||||
public PlayerClaimData(ServerPlayerEntity player) {
|
public PlayerClaimData(ServerPlayerEntity player) {
|
||||||
this.player = player;
|
this.player = player;
|
||||||
this.claimBlocks = ConfigHandler.config.startingBlocks;
|
this.claimBlocks = ConfigHandler.config.startingBlocks;
|
||||||
@ -316,6 +320,7 @@ public class PlayerClaimData implements IPlayerData {
|
|||||||
JsonObject obj = new JsonObject();
|
JsonObject obj = new JsonObject();
|
||||||
obj.addProperty("ClaimBlocks", this.claimBlocks);
|
obj.addProperty("ClaimBlocks", this.claimBlocks);
|
||||||
obj.addProperty("AdditionalBlocks", this.additionalClaimBlocks);
|
obj.addProperty("AdditionalBlocks", this.additionalClaimBlocks);
|
||||||
|
obj.addProperty("LastSeen", LocalDateTime.now().format(Flan.onlineTimeFormatter));
|
||||||
JsonObject defPerm = new JsonObject();
|
JsonObject defPerm = new JsonObject();
|
||||||
this.defaultGroups.forEach((key, value) -> {
|
this.defaultGroups.forEach((key, value) -> {
|
||||||
JsonObject perm = new JsonObject();
|
JsonObject perm = new JsonObject();
|
||||||
|
Loading…
Reference in New Issue
Block a user