Files
Brewery/src/com/dre/brewery/filedata/UpdateChecker.java
T

140 lines
4.3 KiB
Java

package com.dre.brewery.filedata;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import org.bukkit.entity.Player;
import com.dre.brewery.P;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
/**
* Update Checker modified from the Gravity Update Checker Example:
* https://github.com/gravitylow/ServerModsAPI-Example/blob/master/Update.java
*/
public class UpdateChecker implements Runnable {
// The project's unique ID
private static final int projectID = 68006;
// Used for locating version numbers in file names
private static final String DELIMETER = "^v|[\\s_-]v";
// Keys for extracting file information from JSON response
private static final String API_NAME_VALUE = "name";
/* private static final String API_LINK_VALUE = "downloadUrl";
private static final String API_RELEASE_TYPE_VALUE = "releaseType";
private static final String API_FILE_NAME_VALUE = "fileName";
private static final String API_GAME_VERSION_VALUE = "gameVersion";*/
// Static information for querying the API
private static final String API_QUERY = "/servermods/files?projectIds=";
private static final String API_HOST = "https://api.curseforge.com";
public static String update = null;
public static void notify(final Player player) {
if (update == null || !player.isOp()) {
return;
}
P.p.msg(player, update);
}
@Override
public void run() {
query();
}
/**
* Query the API to find the latest approved file's details.
*/
public void query() {
URL url;
try {
// Create the URL to query using the project's ID
url = new URL(API_HOST + API_QUERY + projectID);
} catch (MalformedURLException e) {
// There was an error creating the URL
e.printStackTrace();
return;
}
try {
// Open a connection and query the project
URLConnection conn = url.openConnection();
/*if (apiKey != null) {
// Add the API key to the request if present
conn.addRequestProperty("X-API-Key", apiKey);
}*/
// Add the user-agent to identify the program
conn.addRequestProperty("User-Agent", "Brewery UpdateChecker (by Gravity)");
// Read the response of the query
// The response will be in a JSON format, so only reading one line is necessary.
final BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String response = reader.readLine();
// Parse the array of files from the query's response
JSONArray array = (JSONArray) JSONValue.parse(response);
if (array.size() > 0) {
// Get the newest file's details
JSONObject latest = (JSONObject) array.get(array.size() - 1);
// Get the version's title
String versionName = (String) latest.get(API_NAME_VALUE);
/*// Get the version's link
String versionLink = (String) latest.get(API_LINK_VALUE);
// Get the version's release type
String versionType = (String) latest.get(API_RELEASE_TYPE_VALUE);
// Get the version's file name
String versionFileName = (String) latest.get(API_FILE_NAME_VALUE);
// Get the version's game version
String versionGameVersion = (String) latest.get(API_GAME_VERSION_VALUE);*/
String[] split = versionName.split(DELIMETER);
if (split.length < 2) {
P.p.log("Malformed Remote File Name, could not check for updates");
} else {
String version = split[1];
if (!P.p.getDescription().getVersion().equals(split[1].split(" ")[0])) {
String[] verNew = version.split("\\.");
String[] verOld = P.p.getDescription().getVersion().split("\\.");
for (int i = 0; i < verNew.length; i++) {
if (i < verOld.length && P.p.parseInt(verOld[i]) > P.p.parseInt(verNew[i])) {
break;
} else if (i >= verOld.length || P.p.parseInt(verOld[i]) < P.p.parseInt(verNew[i])) {
P.p.log("Update available for Brewery-" + P.p.getDescription().getVersion() + ": " + versionName);
update = "Update available: v" + version;
break;
}
}
}
}
} else {
P.p.log("There are no files for this project");
}
} catch (IOException e) {
// There was an error reading the query
P.p.errorLog("Could not check for Updates. This error can probably be ignored");
e.printStackTrace();
}
}
}