PlotSquared/PlotSquared/src/main/java/com/intellectualcrafters/plot/util/ExpireManager.java

279 lines
13 KiB
Java
Raw Normal View History

2015-01-09 15:05:10 +01:00
package com.intellectualcrafters.plot.util;
2015-02-19 09:51:10 +01:00
import com.intellectualcrafters.plot.PlotSquared;
2015-01-10 11:37:46 +01:00
import com.intellectualcrafters.plot.config.C;
2015-01-09 15:05:10 +01:00
import com.intellectualcrafters.plot.config.Settings;
import com.intellectualcrafters.plot.database.DBFunc;
import com.intellectualcrafters.plot.flag.Flag;
import com.intellectualcrafters.plot.flag.FlagManager;
import com.intellectualcrafters.plot.generator.ClassicPlotManager;
import com.intellectualcrafters.plot.generator.HybridUtils;
2015-07-03 11:30:26 +02:00
import com.intellectualcrafters.plot.object.*;
2015-02-20 07:28:21 +01:00
import com.intellectualcrafters.plot.util.bukkit.UUIDHandler;
2015-07-03 11:30:26 +02:00
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import java.io.File;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
2015-01-09 15:05:10 +01:00
public class ExpireManager {
public static ConcurrentHashMap<String, List<Plot>> expiredPlots = new ConcurrentHashMap<>();
2015-01-09 15:05:10 +01:00
public static ConcurrentHashMap<String, Boolean> updatingPlots = new ConcurrentHashMap<>();
2015-02-05 10:24:07 +01:00
public static ConcurrentHashMap<String, Long> timestamp = new ConcurrentHashMap<>();
public static ConcurrentHashMap<UUID, Long> dates = new ConcurrentHashMap<>();
2015-01-09 15:05:10 +01:00
public static int task;
2015-02-23 02:32:27 +01:00
2015-02-05 10:24:07 +01:00
public static long getTimeStamp(final String world) {
if (timestamp.containsKey(world)) {
return timestamp.get(world);
2015-02-20 07:34:19 +01:00
} else {
2015-02-05 10:24:07 +01:00
timestamp.put(world, 0l);
return 0;
}
}
2015-02-23 02:32:27 +01:00
2015-02-05 10:24:07 +01:00
public static boolean updateExpired(final String world) {
2015-01-09 15:05:10 +01:00
updatingPlots.put(world, true);
2015-02-20 07:34:19 +01:00
final long now = System.currentTimeMillis();
2015-02-05 10:24:07 +01:00
if (now > getTimeStamp(world)) {
timestamp.put(world, now + 86400000l);
2015-02-20 07:34:19 +01:00
TaskManager.runTaskAsync(new Runnable() {
2015-01-09 15:05:10 +01:00
@Override
public void run() {
try {
final List<Plot> plots = getOldPlots(world);
PlotSquared.log("&7[&5Expire&dManager&7] &3Found " + plots.size() + " expired plots for " + world + "!");
expiredPlots.put(world, plots);
updatingPlots.put(world, false);
}
catch (Exception e) {
e.printStackTrace();
}
2015-01-09 15:05:10 +01:00
}
});
2015-02-05 10:24:07 +01:00
return true;
2015-02-20 07:34:19 +01:00
} else {
2015-01-09 15:05:10 +01:00
updatingPlots.put(world, false);
2015-02-05 10:24:07 +01:00
return false;
2015-01-09 15:05:10 +01:00
}
}
2015-02-23 02:32:27 +01:00
2015-01-09 15:05:10 +01:00
public static void runTask() {
ExpireManager.task = TaskManager.runTaskRepeat(new Runnable() {
2015-01-09 15:05:10 +01:00
@Override
public void run() {
try {
2015-07-03 11:30:26 +02:00
for (final String world : PlotSquared.getInstance().getPlotWorldsString()) {
if (!ExpireManager.updatingPlots.containsKey(world)) {
ExpireManager.updatingPlots.put(world, false);
}
final Boolean updating = ExpireManager.updatingPlots.get(world);
if (updating) {
PlotSquared.log("&7[&5Expire&dManager&7] &3Waiting on fetch...");
2015-02-05 10:24:07 +01:00
return;
}
if (!expiredPlots.containsKey(world)) {
PlotSquared.log("&7[&5Expire&dManager&7] &3Updating expired plots for: " + world);
updateExpired(world);
return;
}
final List<Plot> plots = expiredPlots.get(world);
if ((plots == null) || (plots.size() == 0)) {
if (updateExpired(world)) {
PlotSquared.log("&7[&5Expire&dManager&7] &3Re-evaluating expired plots for: " + world);
return;
}
continue;
2015-01-10 11:37:46 +01:00
}
final Plot plot = plots.iterator().next();
if (!isExpired(plot)) {
expiredPlots.get(world).remove(plot);
PlotSquared.log("&7[&5Expire&dManager&7] &bSkipping no longer expired: " + plot);
return;
}
for (final UUID helper : plot.trusted) {
final PlotPlayer player = UUIDHandler.getPlayer(helper);
if (player != null) {
MainUtil.sendMessage(player, C.PLOT_REMOVED_USER, plot.id.toString());
}
}
for (final UUID helper : plot.members) {
final PlotPlayer player = UUIDHandler.getPlayer(helper);
if (player != null) {
MainUtil.sendMessage(player, C.PLOT_REMOVED_USER, plot.id.toString());
}
}
2015-07-03 11:30:26 +02:00
final PlotManager manager = PlotSquared.getInstance().getPlotManager(world);
if (manager == null) {
PlotSquared.log("&7[&5Expire&dManager&7] &cThis is a friendly reminder to create or delete " + world +" as it is currently setup incorrectly");
expiredPlots.get(world).remove(plot);
return;
}
2015-07-03 11:30:26 +02:00
final PlotWorld plotworld = PlotSquared.getInstance().getPlotWorld(world);
RunnableVal run = new RunnableVal<Integer>() {
@Override
public void run() {
2015-07-03 11:30:26 +02:00
int changed = this.value;
if (Settings.MIN_BLOCKS_CHANGED_IGNORED > 0 || Settings.MIN_BLOCKS_CHANGED > 0 && manager instanceof ClassicPlotManager) {
if (changed >= Settings.MIN_BLOCKS_CHANGED && Settings.MIN_BLOCKS_CHANGED > 0) {
PlotSquared.log("&7[&5Expire&dManager&7] &bKeep flag added to: " + plot.id + (changed != -1 ? " (changed " + value + ")" : ""));
FlagManager.addPlotFlag(plot, new Flag(FlagManager.getFlag("keep"), true));
expiredPlots.get(world).remove(plot);
return;
}
else if (changed >= Settings.MIN_BLOCKS_CHANGED_IGNORED && Settings.MIN_BLOCKS_CHANGED_IGNORED > 0) {
PlotSquared.log("&7[&5Expire&dManager&7] &bIgnoring modified plot: " + plot.id + (changed != -1 ? " (changed " + value + ")" : ""));
FlagManager.addPlotFlag(plot, new Flag(FlagManager.getFlag("modified-blocks"), value));
expiredPlots.get(world).remove(plot);
return;
}
2015-06-15 18:47:56 +02:00
}
if (plot.settings.isMerged()) {
MainUtil.unlinkPlot(plot);
}
manager.clearPlot(plotworld, plot, false, null);
MainUtil.removeSign(plot);
DBFunc.delete(world, plot);
2015-07-03 11:30:26 +02:00
PlotSquared.getInstance().removePlot(world, plot.id, false);
expiredPlots.get(world).remove(plot);
PlotSquared.log("&7[&5Expire&dManager&7] &cDeleted expired plot: " + plot.id + (changed != -1 ? " (changed " + value + ")" : ""));
PlotSquared.log("&3 - World: " + plot.world);
if (plot.hasOwner()) {
PlotSquared.log("&3 - Owner: " + UUIDHandler.getName(plot.owner));
} else {
PlotSquared.log("&3 - Owner: Unowned");
}
}
};
if (Settings.MIN_BLOCKS_CHANGED_IGNORED > 0 || Settings.MIN_BLOCKS_CHANGED > 0 && manager instanceof ClassicPlotManager) {
Flag flag = FlagManager.getPlotFlagAbs(plot, "modified-blocks");
if (flag != null) {
if ((Integer) flag.getValue() > Settings.MIN_BLOCKS_CHANGED_IGNORED) {
PlotSquared.log("&7[&5Expire&dManager&7] &bSkipping modified: " + plot);
2015-06-15 18:47:56 +02:00
expiredPlots.get(world).remove(plot);
this.run();
2015-06-15 18:47:56 +02:00
return;
}
}
else {
HybridUtils.manager.checkModified(plot, run);
}
}
else {
run.value = -1;
run.run();
}
return;
2015-01-09 15:05:10 +01:00
}
}
catch (Exception e) {
e.printStackTrace();
2015-01-09 15:05:10 +01:00
}
}
}, Settings.CLEAR_INTERVAL * 20);
2015-01-09 15:05:10 +01:00
}
2015-02-23 02:32:27 +01:00
2015-02-20 07:34:19 +01:00
public static boolean isExpired(final UUID uuid) {
2015-03-20 03:13:27 +01:00
if (UUIDHandler.getPlayer(uuid) != null) {
return false;
}
2015-02-20 07:34:19 +01:00
final String name = UUIDHandler.getName(uuid);
if (name != null) {
long last;
if (dates.contains(uuid)) {
last = dates.get(uuid);
}
else {
final OfflinePlayer op = Bukkit.getOfflinePlayer(name);
if (op.hasPlayedBefore()) {
last = op.getLastPlayed();
dates.put(uuid, last);
}
else {
return false;
2015-02-20 07:34:19 +01:00
}
}
if (last == 0) {
return false;
}
final long compared = System.currentTimeMillis() - last;
if (compared >= (86400000l * Settings.AUTO_CLEAR_DAYS)) {
return true;
}
2015-02-20 07:34:19 +01:00
}
2015-01-09 15:05:10 +01:00
return false;
}
2015-03-20 03:13:27 +01:00
public static boolean isExpired(Plot plot) {
for (UUID owner : PlotHandler.getOwners(plot)) {
if (!isExpired(owner)) {
return false;
}
}
return true;
}
2015-02-23 02:32:27 +01:00
public static List<Plot> getOldPlots(final String world) {
2015-07-03 11:30:26 +02:00
final Collection<Plot> plots = PlotSquared.getInstance().getPlots(world).values();
final List<Plot> toRemove = new ArrayList<>();
2015-05-15 10:12:52 +02:00
Iterator<Plot> iter = plots.iterator();
while (iter.hasNext()) {
Plot plot = iter.next();
final Flag keepFlag = FlagManager.getPlotFlag(plot, "keep");
if (keepFlag != null && (Boolean) keepFlag.getValue()) {
continue;
}
2015-03-20 05:11:02 +01:00
final UUID uuid = plot.owner;
if (uuid == null) {
toRemove.add(plot);
2015-01-09 15:05:10 +01:00
continue;
}
2015-02-21 13:52:50 +01:00
final PlotPlayer player = UUIDHandler.getPlayer(uuid);
2015-01-10 11:20:20 +01:00
if (player != null) {
continue;
}
if (isExpired(plot)) {
if (Settings.AUTO_CLEAR_CHECK_DISK) {
2015-02-20 07:34:19 +01:00
final String worldname = Bukkit.getWorlds().get(0).getName();
String foldername;
String filename = null;
2015-07-03 11:45:00 +02:00
if (PlotSquared.getInstance().IMP.checkVersion(1, 7, 5)) {
foldername = "playerdata";
2015-02-04 05:44:27 +01:00
try {
final OfflinePlotPlayer op = UUIDHandler.uuidWrapper.getOfflinePlayer(uuid);
2015-02-21 13:52:50 +01:00
filename = op.getUUID() + ".dat";
2015-02-20 07:34:19 +01:00
} catch (final Throwable e) {
2015-02-04 05:44:27 +01:00
filename = uuid.toString() + ".dat";
}
2015-02-20 07:34:19 +01:00
} else {
foldername = "players";
2015-02-20 07:34:19 +01:00
final String playername = UUIDHandler.getName(uuid);
if (playername != null) {
filename = playername + ".dat";
}
}
if (filename != null) {
2015-02-20 07:34:19 +01:00
final File playerFile = new File(worldname + File.separator + foldername + File.separator + filename);
if (!playerFile.exists()) {
2015-02-19 11:23:36 +01:00
PlotSquared.log("Could not find file: " + filename);
2015-02-20 07:34:19 +01:00
} else {
try {
long last = playerFile.lastModified();
long compared = System.currentTimeMillis() - last;
2015-02-20 07:34:19 +01:00
if (compared < (86400000l * Settings.AUTO_CLEAR_DAYS)) {
continue;
}
2015-02-20 07:34:19 +01:00
} catch (final Exception e) {
2015-02-19 11:23:36 +01:00
PlotSquared.log("Please disable disk checking in old plot auto clearing; Could not read file: " + filename);
}
}
}
}
toRemove.add(plot);
2015-01-09 15:05:10 +01:00
}
}
return toRemove;
}
}