You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
3.6 KiB
127 lines
3.6 KiB
package kcauldron.updater; |
|
|
|
import java.io.InputStreamReader; |
|
import java.lang.Thread.UncaughtExceptionHandler; |
|
|
|
import kcauldron.KCauldron; |
|
import kcauldron.KLog; |
|
import net.minecraft.server.MinecraftServer; |
|
|
|
import org.apache.http.HttpResponse; |
|
import org.apache.http.client.methods.HttpUriRequest; |
|
import org.apache.http.client.methods.RequestBuilder; |
|
import org.apache.http.impl.client.HttpClientBuilder; |
|
import org.apache.http.impl.client.LaxRedirectStrategy; |
|
import org.json.simple.JSONObject; |
|
import org.json.simple.parser.JSONParser; |
|
|
|
public class KVersionRetriever implements Runnable, UncaughtExceptionHandler { |
|
private static final boolean DEBUG; |
|
private static final KLog sLogger; |
|
private static final JSONParser sParser; |
|
private static MinecraftServer sServer; |
|
|
|
static { |
|
DEBUG = false; |
|
sLogger = KLog.get(KVersionRetriever.class.getSimpleName()); |
|
|
|
sParser = new JSONParser(); |
|
} |
|
|
|
public static void init(MinecraftServer server) { |
|
sServer = server; |
|
if (MinecraftServer.kcauldronConfig.updatecheckerEnable.getValue()) { |
|
startServer(DefaultUpdateCallback.INSTANCE, true); |
|
} |
|
} |
|
|
|
public static void startServer(IVersionCheckCallback callback, boolean loop) { |
|
new KVersionRetriever(callback, loop, true, KCauldron.getGroup(), |
|
KCauldron.getChannel()); |
|
} |
|
|
|
private final IVersionCheckCallback mCallback; |
|
private final boolean mLoop; |
|
private final Thread mThread; |
|
private final String mGroup; |
|
private final String mName; |
|
private final boolean mUpToDateSupport; |
|
|
|
public KVersionRetriever(IVersionCheckCallback callback, boolean loop, |
|
boolean upToDateSupport, String group, String name) { |
|
if (DEBUG) |
|
sLogger.info("Created new version retrivier"); |
|
mCallback = callback; |
|
mLoop = loop; |
|
mUpToDateSupport = upToDateSupport; |
|
mGroup = group; |
|
mName = name; |
|
mThread = new Thread(this); |
|
mThread.setName("KCauldron version retrievier"); |
|
mThread.setPriority(Thread.MIN_PRIORITY); |
|
mThread.setDaemon(true); |
|
mThread.setUncaughtExceptionHandler(this); |
|
mThread.start(); |
|
} |
|
|
|
@Override |
|
public void run() { |
|
while (!mThread.isInterrupted()) { |
|
check(); |
|
if (!mLoop) |
|
break; |
|
try { |
|
Thread.sleep(1000 * 60 * 10);// Sleep ten minutes |
|
} catch (InterruptedException e) { |
|
e.printStackTrace(); |
|
} |
|
} |
|
} |
|
|
|
private void check() { |
|
try { |
|
HttpUriRequest request = RequestBuilder |
|
.get() |
|
.setUri("https://api.prok.pw/repo/version/" + mGroup + "/" |
|
+ mName) |
|
.addParameter("hostname", sServer.getHostname()) |
|
.addParameter("port", "" + sServer.getPort()).build(); |
|
HttpResponse response = HttpClientBuilder.create() |
|
.setUserAgent("KCauldron Version Retriever") |
|
.setRedirectStrategy(new LaxRedirectStrategy()).build() |
|
.execute(request); |
|
if (response.getStatusLine().getStatusCode() != 200) { |
|
uncaughtException(mThread, new IllegalStateException( |
|
"Status code isn't OK")); |
|
return; |
|
} |
|
JSONObject json = (JSONObject) sParser.parse(new InputStreamReader( |
|
response.getEntity().getContent())); |
|
String version = (String) json.get("version"); |
|
if (!mUpToDateSupport || KCauldron.getCurrentVersion() == null |
|
|| !version.equals(KCauldron.getCurrentVersion())) { |
|
mCallback.newVersion(version); |
|
} else { |
|
mCallback.upToDate(); |
|
} |
|
} catch (Exception e) { |
|
uncaughtException(null, e); |
|
} |
|
} |
|
|
|
@Override |
|
public void uncaughtException(Thread t, Throwable e) { |
|
sLogger.warning(e, "Error occured during retriving version"); |
|
if (mCallback != null) { |
|
mCallback.error(e); |
|
} |
|
} |
|
|
|
public interface IVersionCheckCallback { |
|
void upToDate(); |
|
|
|
void newVersion(String newVersion); |
|
|
|
void error(Throwable t); |
|
} |
|
}
|
|
|