mirror of
https://github.com/ChestShop-authors/ChestShop-3.git
synced 2024-06-27 23:04:42 +02:00
Our async tasks were already pretty world-independent (update checker as well as some logging so this should work pretty well) For the rest the ORMLite library should already be able to handle access from different threads and whether economy plugins are compatible with Folia is up to them, not us...
125 lines
4.5 KiB
Java
125 lines
4.5 KiB
Java
package com.Acrobot.ChestShop.Updater;
|
|
|
|
import com.Acrobot.ChestShop.ChestShop;
|
|
import com.google.gson.JsonObject;
|
|
import com.google.gson.JsonParser;
|
|
import org.bukkit.configuration.file.FileConfiguration;
|
|
import org.bukkit.configuration.file.YamlConfiguration;
|
|
import org.bukkit.plugin.Plugin;
|
|
|
|
import java.io.BufferedReader;
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.io.InputStreamReader;
|
|
import java.net.HttpURLConnection;
|
|
import java.net.MalformedURLException;
|
|
import java.net.URL;
|
|
import java.util.logging.Level;
|
|
|
|
public class JenkinsBuildsNotifier implements Runnable {
|
|
private final Plugin plugin;
|
|
|
|
private final File configFile;
|
|
private final FileConfiguration config;
|
|
|
|
private int build;
|
|
private URL apiUrl;
|
|
|
|
public JenkinsBuildsNotifier(Plugin plugin, String jenkinsJobUrl) {
|
|
this.plugin = plugin;
|
|
|
|
configFile = new File(plugin.getDataFolder(), "jenkinsBuildsNotifier.yml");
|
|
if (configFile.exists()) {
|
|
config = YamlConfiguration.loadConfiguration(configFile);
|
|
} else {
|
|
config = new YamlConfiguration();
|
|
config.addDefault("disabled", false);
|
|
config.addDefault("jenkins-job-url-override", "");
|
|
config.options().copyDefaults(true);
|
|
saveConfig();
|
|
}
|
|
|
|
if (config.getBoolean("disabled")) {
|
|
return;
|
|
}
|
|
|
|
build = getBuildNumber();
|
|
if (build < 1) {
|
|
plugin.getLogger().log(Level.WARNING, "Unable to parse plugin build from version string! (" + plugin.getDescription().getVersion() + ")");
|
|
return;
|
|
}
|
|
|
|
String jenkinsJobUrlOverride = config.getString("jenkins-job-url-override");
|
|
if (jenkinsJobUrlOverride != null && !jenkinsJobUrlOverride.isEmpty()) {
|
|
jenkinsJobUrl = jenkinsJobUrlOverride;
|
|
}
|
|
|
|
try {
|
|
apiUrl = new URL(jenkinsJobUrl + "api/json");
|
|
ChestShop.runInAsyncThread(this);
|
|
} catch (MalformedURLException e) {
|
|
plugin.getLogger().log(Level.WARNING, "Can not check for new dev builds as " + jenkinsJobUrl + "api/json is not a valid url!", e);
|
|
}
|
|
}
|
|
|
|
private void saveConfig() {
|
|
try {
|
|
config.save(configFile);
|
|
} catch (IOException e) {
|
|
plugin.getLogger().log(Level.WARNING, "Error while saving " + configFile.getName() + "! " + e.getMessage());
|
|
}
|
|
}
|
|
|
|
private int getBuildNumber() {
|
|
String tag = "(build ";
|
|
String versionStr = plugin.getDescription().getVersion();
|
|
int start = versionStr.indexOf(tag);
|
|
int end = versionStr.indexOf(')', start);
|
|
if (start > 0 && end > start) {
|
|
try {
|
|
return Integer.parseInt(versionStr.substring(start + tag.length(), end));
|
|
} catch (NumberFormatException ignored) {}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
@Override
|
|
public void run() {
|
|
try {
|
|
JsonObject responseJson = queryJson();
|
|
if (responseJson.has("lastStableBuild") && responseJson.get("lastStableBuild").isJsonObject()) {
|
|
JsonObject lastStable = responseJson.getAsJsonObject("lastStableBuild");
|
|
int lastStableBuild = lastStable.get("number").getAsInt();
|
|
if (lastStableBuild > build && config.getInt("last-announced-build", 0) < lastStableBuild) {
|
|
String url = lastStable.get("url").getAsString();
|
|
plugin.getLogger().log(Level.INFO, "A new development build is available for testing: " + url);
|
|
|
|
config.set("last-announced-build", lastStableBuild);
|
|
saveConfig();
|
|
}
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
plugin.getLogger().log(Level.WARNING, "Error while trying to query Jenkins API", e);
|
|
}
|
|
}
|
|
|
|
private JsonObject queryJson() throws IOException {
|
|
HttpURLConnection con = (HttpURLConnection) apiUrl.openConnection();
|
|
con.setRequestProperty("User-Agent", plugin.getName() + " " + plugin.getDescription().getVersion() + " Jenkins Builds Notifier");
|
|
con.setRequestMethod("GET");
|
|
StringBuilder msg = new StringBuilder();
|
|
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
|
|
String line;
|
|
while((line = in.readLine()) != null) {
|
|
if(msg.length() != 0) {
|
|
msg.append("\n");
|
|
}
|
|
msg.append(line);
|
|
}
|
|
in.close();
|
|
|
|
return new JsonParser().parse(msg.toString()).getAsJsonObject();
|
|
}
|
|
}
|