package tc.oc.commons.bungee.sessions;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.logging.Logger;
import javax.inject.Inject;
import javax.inject.Singleton;
import net.md_5.bungee.api.ChatColor;
import java.time.Duration;
import tc.oc.commons.core.logging.Loggers;
import tc.oc.commons.core.plugin.PluginFacet;
import tc.oc.minecraft.api.scheduler.Tickable;
@Singleton
public class MojangSessionServiceMonitor implements PluginFacet, Tickable {
private static final String URL = "https://sessionserver.mojang.com";
private static final Duration TIMEOUT = Duration.ofSeconds(5);
private static final java.time.Duration POLLING_INTERVAL = java.time.Duration.ofSeconds(10);
private final Logger logger;
private SessionState forceState = SessionState.ABSENT;
private SessionState state = SessionState.ONLINE; // assume online
@Inject MojangSessionServiceMonitor(Loggers loggers) {
this.logger = loggers.get(getClass());
}
@Override
public java.time.Duration tickPeriod() {
return POLLING_INTERVAL;
}
/**
* Gets the session state. State can either be forced or discovered by
* periodically pinging the Mojang session server.
*/
public SessionState getState() {
if (forceState != SessionState.ABSENT) {
return forceState;
} else {
return state;
}
}
/**
* Get the forced session state.
*/
public SessionState getForceState() {
return forceState;
}
/**
* Set the forced session state. This will override whatever state has been
* discovered.
*/
public void setForceState(SessionState state) {
forceState = state;
}
/**
* Gets the session state discovered by pinking Mojang's session server.
*/
public SessionState getDiscoveredState() {
return state;
}
@Override
public void tick() {
int response = getResponseCode(URL);
SessionState newState = response == 200 ? SessionState.ONLINE : SessionState.OFFLINE;
if(state != newState) {
logger.warning("Status (" + response + ") changed from " + state + ChatColor.RESET + " to " + newState);
state = newState;
}
}
private int getResponseCode(String urlString) {
try {
URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout((int) TIMEOUT.toMillis());
connection.setReadTimeout((int) TIMEOUT.toMillis());
connection.setRequestMethod("GET");
connection.connect();
return connection.getResponseCode();
} catch (IOException e) {
return -1;
}
}
}