package org.skfiy.typhon.spi.role;
import java.util.Calendar;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import org.skfiy.typhon.Typhons;
import org.skfiy.typhon.domain.Player;
import org.skfiy.typhon.domain.RoleData;
import org.skfiy.typhon.session.SessionContext;
import org.skfiy.util.CustomizableThreadCreator;
public class IntegralDatable implements RoleDatable {
private static final String SESSION_SRT_KEY = "__Integral__refresh";
protected static final ScheduledExecutorService scheduler = new ScheduledThreadPoolExecutor(1,
new ThreadFactory() {
CustomizableThreadCreator threadCreator = new CustomizableThreadCreator(
"refresh-Integral-timer-");
{
threadCreator.setThreadGroupName("Refresh-Integral-ThreadGroup");
threadCreator.setDaemon(true);
}
@Override
public Thread newThread(Runnable r) {
return threadCreator.createThread(r);
}
});
@Override
public void initialize(Player player) {
IntegralRefresh srt = new IntegralRefresh(player);
srt.run();
SessionContext.getSession().setAttribute(SESSION_SRT_KEY, srt);
}
@Override
public void serialize(Player player, RoleData roleData) {}
@Override
public void deserialize(RoleData roleData, Player player) {
initialize(player);
}
private class IntegralRefresh implements Runnable {
private final Player player;
IntegralRefresh(Player player) {
this.player = player;
}
@Override
public void run() {
if (!player.getSession().isAvailable()) {
return;
}
long CDTime = 0;
Calendar calendar = Calendar.getInstance();
clearMSMS(calendar);
Calendar nowCalendar = Calendar.getInstance();
if (calendar.getTimeInMillis() < nowCalendar.getTimeInMillis()) {
CDTime = nowCalendar.getTimeInMillis() - calendar.getTimeInMillis();
} else {
player.getNormal().setIntegral(false);
calendar.add(Calendar.DATE, 1);
CDTime = calendar.getTimeInMillis() - nowCalendar.getTimeInMillis();
}
scheduler.schedule(new IntegralRefresh(player), CDTime, TimeUnit.MILLISECONDS);
}
}
private void clearMSMS(Calendar c) {
c.set(Calendar.HOUR_OF_DAY, Typhons.getInteger("typhon.spi.IntegralRefresh"));
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
}
}