MarwFeatures/Auth/src/cz/marwland/mc/features/auth/SessionManager.java

111 lines
2.8 KiB
Java

package cz.marwland.mc.features.auth;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import org.bukkit.entity.Player;
import cz.marwland.mc.core.MarwCore;
import cz.marwland.mc.core.storage.SQLStorage;
import cz.marwland.mc.core.util.FileUtil;
public class SessionManager {
private String sessionQuery;
private final SQLStorage database = MarwCore.getInstance().getStorage();
public HashMap<Player, PlayerSession> sessions = new HashMap<>();
private final long WRITE_PERIOD = 15;
private ScheduledFuture<?> recordTask;
public SessionManager() {
}
public void start() {
loadSQLQueries();
recordTask = MarwCore.getInstance().getStorageExecutor().scheduleAtFixedRate(() -> this.recordSessions(), WRITE_PERIOD, WRITE_PERIOD, TimeUnit.SECONDS);
for (Player p : MarwCore.getInstance().getServer().getOnlinePlayers()) {
this.startPlayer(p);
}
recordSessions();
}
public void shutdown() {
recordTask.cancel(false);
for (Player p : MarwCore.getInstance().getServer().getOnlinePlayers()) {
this.endPlayer(p);
}
}
public void loadSQLQueries() {
try {
sessionQuery = FileUtil.readFileFromJAR(PlayerSession.class, "/resources/session.sql");
sessionQuery = this.database.getStatementProcessor().apply(sessionQuery);
} catch (IOException e) {
e.printStackTrace();
}
}
public void startPlayer(Player p) {
PlayerSession ps = new PlayerSession(p);
this.sessions.put(p, ps);
}
public void endPlayer(Player p) {
PlayerSession ps = this.sessions.get(p);
// TODO: null handling - cannot happen
if (ps == null)
return;
this.recordSinglePlayer(p);
this.sessions.remove(p);
}
public PlayerSession getPlayerSession(Player p) {
return this.sessions.get(p);
}
private void recordSessions() {
try (Connection conn = this.database.getConnectionFactory().getConnection()) {
PreparedStatement prepst = conn.prepareStatement(this.sessionQuery);
int i = 0;
for (PlayerSession ps : this.sessions.values()) {
ps.update(prepst);
i++;
}
if (i > 0)
prepst.execute();
prepst.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
private void recordSinglePlayer(Player p) {
PlayerSession ps = this.getPlayerSession(p);
if (ps == null)
return;
this.recordSinglePlayer(ps);
}
private void recordSinglePlayer(PlayerSession ps) {
MarwCore.getInstance().getStorageExecutor().execute(() -> {
try (Connection conn = this.database.getConnectionFactory().getConnection();) {
PreparedStatement prepst = conn.prepareStatement(this.sessionQuery);
ps.update(prepst);
prepst.executeBatch();
conn.commit();
prepst.close();
} catch (SQLException e) {
e.printStackTrace();
}
});
}
}