2013-04-22 03:26:19 +02:00
package com.massivecraft.factions.util ;
2014-04-04 20:55:21 +02:00
import com.massivecraft.factions.* ;
2013-04-22 03:26:19 +02:00
import com.massivecraft.factions.struct.Role ;
2014-04-04 20:55:21 +02:00
import org.bukkit.scheduler.BukkitRunnable ;
2013-04-22 03:26:19 +02:00
2014-04-04 20:55:21 +02:00
import java.util.ArrayList ;
import java.util.ListIterator ;
2013-04-22 03:26:19 +02:00
2014-04-04 20:55:21 +02:00
public class AutoLeaveProcessTask extends BukkitRunnable {
private transient boolean readyToGo = false ;
private transient boolean finished = false ;
private transient ListIterator < FPlayer > iterator ;
private transient double toleranceMillis ;
public AutoLeaveProcessTask ( ) {
2014-07-01 21:52:40 +02:00
ArrayList < FPlayer > fplayers = new ArrayList < FPlayer > ( FPlayers . i . get ( ) ) ; this . iterator = fplayers . listIterator ( ) ;
this . toleranceMillis = Conf . autoLeaveAfterDaysOfInactivity * 24 * 60 * 60 * 1000 ; this . readyToGo = true ;
2014-04-04 20:55:21 +02:00
this . finished = false ;
}
public void run ( ) {
if ( Conf . autoLeaveAfterDaysOfInactivity < = 0 . 0 | | Conf . autoLeaveRoutineMaxMillisecondsPerTick < = 0 . 0 ) {
2014-07-01 21:52:40 +02:00
this . stop ( ) ; return ;
2014-04-04 20:55:21 +02:00
}
2014-07-01 21:49:42 +02:00
if ( ! readyToGo ) { return ; }
2014-04-04 20:55:21 +02:00
// this is set so it only does one iteration at a time, no matter how frequently the timer fires
readyToGo = false ;
// and this is tracked to keep one iteration from dragging on too long and possibly choking the system if there are a very large number of players to go through
long loopStartTime = System . currentTimeMillis ( ) ;
while ( iterator . hasNext ( ) ) {
long now = System . currentTimeMillis ( ) ;
// if this iteration has been running for maximum time, stop to take a breather until next tick
if ( now > loopStartTime + Conf . autoLeaveRoutineMaxMillisecondsPerTick ) {
2014-07-01 21:52:40 +02:00
readyToGo = true ; return ;
2014-04-04 20:55:21 +02:00
}
FPlayer fplayer = iterator . next ( ) ;
if ( fplayer . isOffline ( ) & & now - fplayer . getLastLoginTime ( ) > toleranceMillis ) {
2014-07-01 21:49:42 +02:00
if ( Conf . logFactionLeave | | Conf . logFactionKick ) {
2014-04-04 20:55:21 +02:00
P . p . log ( " Player " + fplayer . getName ( ) + " was auto-removed due to inactivity. " ) ;
2014-07-01 21:49:42 +02:00
}
2014-04-04 20:55:21 +02:00
// if player is faction admin, sort out the faction since he's going away
if ( fplayer . getRole ( ) = = Role . ADMIN ) {
Faction faction = fplayer . getFaction ( ) ;
2014-07-01 21:49:42 +02:00
if ( faction ! = null ) { fplayer . getFaction ( ) . promoteNewLeader ( ) ; }
2014-04-04 20:55:21 +02:00
}
2014-07-01 21:52:40 +02:00
fplayer . leave ( false ) ; iterator . remove ( ) ; // go ahead and remove this list's link to the FPlayer object
2014-04-04 20:55:21 +02:00
fplayer . detach ( ) ;
}
}
// looks like we've finished
this . stop ( ) ;
}
// we're done, shut down
public void stop ( ) {
2014-07-01 21:52:40 +02:00
readyToGo = false ; finished = true ;
2014-04-04 20:55:21 +02:00
this . cancel ( ) ;
}
public boolean isFinished ( ) {
return finished ;
}
2013-04-22 03:26:19 +02:00
}