Use new inactivity cleanup system
This commit is contained in:
		@@ -351,6 +351,16 @@ public class Faction extends Entity<Faction> implements FactionsParticipator
 | 
			
		||||
		this.changed();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public long getAge()
 | 
			
		||||
	{
 | 
			
		||||
		return this.getAge(System.currentTimeMillis());
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public long getAge(long now)
 | 
			
		||||
	{
 | 
			
		||||
		return now - this.getCreatedAtMillis();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	// FIELD: home
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
 
 | 
			
		||||
@@ -60,7 +60,7 @@ public class MConf extends Entity<MConf>
 | 
			
		||||
	// VERSION
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	
 | 
			
		||||
	public int version = 1;
 | 
			
		||||
	public int version = 2;
 | 
			
		||||
	
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	// COMMAND ALIASES
 | 
			
		||||
@@ -111,17 +111,17 @@ public class MConf extends Entity<MConf>
 | 
			
		||||
	
 | 
			
		||||
	// The Default
 | 
			
		||||
	@EditorType(TypeMillisDiff.class)
 | 
			
		||||
	public long removePlayerMillisDefault = 10 * TimeUnit.MILLIS_PER_DAY; // 10 days
 | 
			
		||||
	public long playercleanToleranceMillis = 10 * TimeUnit.MILLIS_PER_DAY; // 10 days
 | 
			
		||||
	
 | 
			
		||||
	// Player Age Bonus
 | 
			
		||||
	@EditorTypeInner({TypeMillisDiff.class, TypeMillisDiff.class})
 | 
			
		||||
	public Map<Long, Long> removePlayerMillisPlayerAgeToBonus = MUtil.map(
 | 
			
		||||
	public Map<Long, Long> playercleanToleranceMillisPlayerAgeToBonus = MUtil.map(
 | 
			
		||||
		2 * TimeUnit.MILLIS_PER_WEEK, 10 * TimeUnit.MILLIS_PER_DAY  // +10 days after 2 weeks
 | 
			
		||||
	);
 | 
			
		||||
	
 | 
			
		||||
	// Faction Age Bonus
 | 
			
		||||
	@EditorTypeInner({TypeMillisDiff.class, TypeMillisDiff.class})
 | 
			
		||||
	public Map<Long, Long> removePlayerMillisFactionAgeToBonus = MUtil.map(
 | 
			
		||||
	public Map<Long, Long> playercleanToleranceMillisFactionAgeToBonus = MUtil.map(
 | 
			
		||||
		4 * TimeUnit.MILLIS_PER_WEEK, 10 * TimeUnit.MILLIS_PER_DAY, // +10 days after 4 weeks
 | 
			
		||||
		2 * TimeUnit.MILLIS_PER_WEEK,  5 * TimeUnit.MILLIS_PER_DAY  // +5 days after 2 weeks
 | 
			
		||||
	);
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,6 @@ import com.massivecraft.factions.event.EventFactionsChunksChange;
 | 
			
		||||
import com.massivecraft.factions.event.EventFactionsDisband;
 | 
			
		||||
import com.massivecraft.factions.event.EventFactionsMembershipChange;
 | 
			
		||||
import com.massivecraft.factions.event.EventFactionsMembershipChange.MembershipChangeReason;
 | 
			
		||||
import com.massivecraft.factions.event.EventFactionsRemovePlayerMillis;
 | 
			
		||||
import com.massivecraft.factions.mixin.PowerMixin;
 | 
			
		||||
import com.massivecraft.factions.util.RelationUtil;
 | 
			
		||||
import com.massivecraft.massivecore.mixin.MixinSenderPs;
 | 
			
		||||
@@ -19,6 +18,7 @@ import com.massivecraft.massivecore.mixin.MixinTitle;
 | 
			
		||||
import com.massivecraft.massivecore.ps.PS;
 | 
			
		||||
import com.massivecraft.massivecore.ps.PSFormatHumanSpace;
 | 
			
		||||
import com.massivecraft.massivecore.store.SenderEntity;
 | 
			
		||||
import com.massivecraft.massivecore.store.inactive.Inactive;
 | 
			
		||||
import com.massivecraft.massivecore.util.IdUtil;
 | 
			
		||||
import com.massivecraft.massivecore.util.MUtil;
 | 
			
		||||
import com.massivecraft.massivecore.util.Txt;
 | 
			
		||||
@@ -34,7 +34,7 @@ import java.util.Iterator;
 | 
			
		||||
import java.util.Map.Entry;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
public class MPlayer extends SenderEntity<MPlayer> implements FactionsParticipator
 | 
			
		||||
public class MPlayer extends SenderEntity<MPlayer> implements FactionsParticipator, Inactive
 | 
			
		||||
{
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	// META
 | 
			
		||||
@@ -701,57 +701,7 @@ public class MPlayer extends SenderEntity<MPlayer> implements FactionsParticipat
 | 
			
		||||
		if (ps == null) return false;
 | 
			
		||||
		return BoardColl.get().getFactionAt(ps).getRelationTo(this) == Rel.ENEMY;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	// INACTIVITY TIMEOUT
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
 | 
			
		||||
	public long getRemovePlayerMillis(boolean async)
 | 
			
		||||
	{
 | 
			
		||||
		EventFactionsRemovePlayerMillis event = new EventFactionsRemovePlayerMillis(async, this);
 | 
			
		||||
		event.run();
 | 
			
		||||
		return event.getMillis();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public boolean considerRemovePlayerMillis(boolean async)
 | 
			
		||||
	{
 | 
			
		||||
		// This may or may not be required.
 | 
			
		||||
		// Some users have been reporting a loop issue with the same player
 | 
			
		||||
		// detaching over and over again.
 | 
			
		||||
		// Maybe skipping ahead if the player is detached will solve the issue.
 | 
			
		||||
		if (this.detached()) return false;
 | 
			
		||||
 | 
			
		||||
		// Get the last activity millis.
 | 
			
		||||
		long lastActivityMillis = this.getLastActivityMillis();
 | 
			
		||||
 | 
			
		||||
		// Consider
 | 
			
		||||
		long toleranceMillis = this.getRemovePlayerMillis(async);
 | 
			
		||||
		if (System.currentTimeMillis() - lastActivityMillis <= toleranceMillis) return false;
 | 
			
		||||
 | 
			
		||||
		// Inform
 | 
			
		||||
		if (MConf.get().logFactionLeave || MConf.get().logFactionKick)
 | 
			
		||||
		{
 | 
			
		||||
			Factions.get().log("Player " + this.getName() + " was auto-removed due to inactivity.");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Apply
 | 
			
		||||
 | 
			
		||||
		// Promote a new leader if required.
 | 
			
		||||
		if (this.getRole() == Rel.LEADER)
 | 
			
		||||
		{
 | 
			
		||||
			Faction faction = this.getFaction();
 | 
			
		||||
			if (faction != null)
 | 
			
		||||
			{
 | 
			
		||||
				this.getFaction().promoteNewLeader();
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		this.leave();
 | 
			
		||||
		this.detach();
 | 
			
		||||
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	// ACTIONS
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,6 @@
 | 
			
		||||
package com.massivecraft.factions.entity;
 | 
			
		||||
 | 
			
		||||
import com.massivecraft.factions.Factions;
 | 
			
		||||
import com.massivecraft.massivecore.store.SenderColl;
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
 | 
			
		||||
public class MPlayerColl extends SenderColl<MPlayer>
 | 
			
		||||
{
 | 
			
		||||
@@ -14,6 +10,10 @@ public class MPlayerColl extends SenderColl<MPlayer>
 | 
			
		||||
	
 | 
			
		||||
	private static MPlayerColl i = new MPlayerColl();
 | 
			
		||||
	public static MPlayerColl get() { return i; }
 | 
			
		||||
	public MPlayerColl()
 | 
			
		||||
	{
 | 
			
		||||
		this.setPlayercleanTaskEnabled(true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	// STACK TRACEABILITY
 | 
			
		||||
@@ -29,29 +29,10 @@ public class MPlayerColl extends SenderColl<MPlayer>
 | 
			
		||||
	// EXTRAS
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	
 | 
			
		||||
	public void considerRemovePlayerMillis()
 | 
			
		||||
	@Override
 | 
			
		||||
	public long getPlayercleanToleranceMillis()
 | 
			
		||||
	{
 | 
			
		||||
		// If the config option is 0 or below that means the server owner want it disabled.
 | 
			
		||||
		if (MConf.get().removePlayerMillisDefault <= 0.0) return;
 | 
			
		||||
		
 | 
			
		||||
		// For each of the offline players...
 | 
			
		||||
		// NOTE: If the player is currently online it's most definitely not inactive.
 | 
			
		||||
		// NOTE: This check catches some important special cases like the @console "player".
 | 
			
		||||
		final Collection<MPlayer> mplayersOffline = this.getAllOffline();
 | 
			
		||||
		
 | 
			
		||||
		Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), new Runnable()
 | 
			
		||||
		{
 | 
			
		||||
			@Override
 | 
			
		||||
			public void run()
 | 
			
		||||
			{
 | 
			
		||||
				// For each offline player ...
 | 
			
		||||
				for (MPlayer mplayer : mplayersOffline)
 | 
			
		||||
				{
 | 
			
		||||
					// ... see if they should be removed.
 | 
			
		||||
					mplayer.considerRemovePlayerMillis(true);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
		return MConf.get().playercleanToleranceMillis;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,23 @@
 | 
			
		||||
package com.massivecraft.factions.entity.migrator;
 | 
			
		||||
 | 
			
		||||
import com.massivecraft.factions.entity.MConf;
 | 
			
		||||
import com.massivecraft.massivecore.store.migrator.MigratorFieldRename;
 | 
			
		||||
import com.massivecraft.massivecore.store.migrator.MigratorRoot;
 | 
			
		||||
 | 
			
		||||
public class MigratorMConf002Playerclean extends MigratorRoot
 | 
			
		||||
{
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	// INSTANCE & CONSTRUCT
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	
 | 
			
		||||
	private static MigratorMConf002Playerclean i = new MigratorMConf002Playerclean();
 | 
			
		||||
	public static MigratorMConf002Playerclean get() { return i; }
 | 
			
		||||
	private MigratorMConf002Playerclean()
 | 
			
		||||
	{
 | 
			
		||||
		super(MConf.class);
 | 
			
		||||
		this.addInnerMigrator(MigratorFieldRename.get("removePlayerMillisDefault", "playercleanToleranceMillis"));
 | 
			
		||||
		this.addInnerMigrator(MigratorFieldRename.get("removePlayerMillisPlayerAgeToBonus", "playercleanToleranceMillisPlayerAgeToBonus"));
 | 
			
		||||
		this.addInnerMigrator(MigratorFieldRename.get("removePlayerMillisFactionAgeToBonus", "playercleanToleranceMillisFactionAgeToBonus"));
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user