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 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(); } }); } }