111 lines
2.8 KiB
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();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|