From 58123dddd7a6dd9a02557ea11643c0eea4b8d583 Mon Sep 17 00:00:00 2001 From: Colbster937 Date: Mon, 12 Jan 2026 16:20:41 -0600 Subject: [PATCH] eagler --- build.gradle.kts | 86 +++++++++++-------- .../originblacklist/base/OriginBlacklist.java | 84 +++++++++++------- .../originblacklist/base/util/BuildInfo.java | 19 ++++ .../base/util/UpdateChecker.java | 65 +++++++------- .../bukkit/OriginBlacklistBukkit.java | 2 +- .../bungee/OriginBlacklistBungee.java | 2 +- .../velocity/OriginBlacklistVelocity.java | 6 +- src/main/resources/bungee.yml | 10 +-- src/main/resources/plugin.yml | 12 +-- src/main/resources/velocity-plugin.json | 4 +- 10 files changed, 174 insertions(+), 116 deletions(-) create mode 100644 src/main/java/xyz/webmc/originblacklist/base/util/BuildInfo.java diff --git a/build.gradle.kts b/build.gradle.kts index 2523711..008b624 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,3 +1,5 @@ +import groovy.lang.Closure +import com.palantir.gradle.gitversion.VersionDetails import org.gradle.api.tasks.compile.JavaCompile import org.gradle.language.jvm.tasks.ProcessResources import xyz.jpenilla.runpaper.task.RunServer @@ -26,23 +28,27 @@ val PLUGIN_CTBR = emptyList() -val PLUGIN_DEPA_J = getJSONObj(PLUGIN_DEPA) -val PLUGIN_DEPB_J = getJSONObj(PLUGIN_DEPB) -val PLUGIN_DEPC_J = getJSONObjMerge(PLUGIN_DEPC, PLUGIN_SDPC) -val PLUGIN_SDPA_J = getJSONObj(PLUGIN_SDPA) -val PLUGIN_SDPB_J = getJSONObj(PLUGIN_SDPB) -val PLUGIN_PROV_J = getJSONObj(PLUGIN_PROV) -val PLUGIN_ATHR_J = getJSONObj(PLUGIN_ATHR) -val PLUGIN_CTBR_J = getJSONObj(PLUGIN_CTBR) +val PLUGIN_DEPA_J = getBukkitBungeeDeps(PLUGIN_DEPA) +val PLUGIN_DEPB_J = getBukkitBungeeDeps(PLUGIN_DEPB) +val PLUGIN_DEPC_J = getVelocityDeps(PLUGIN_DEPC, PLUGIN_SDPC) +val PLUGIN_SDPA_J = getBukkitBungeeDeps(PLUGIN_SDPA) +val PLUGIN_SDPB_J = getBukkitBungeeDeps(PLUGIN_SDPB) +val PLUGIN_PROV_J = getBukkitBungeeDeps(PLUGIN_PROV) +val PLUGIN_ATHR_J = getBukkitBungeeDeps(PLUGIN_ATHR) +val PLUGIN_CTBR_J = getBukkitBungeeDeps(PLUGIN_CTBR) plugins { id("java") id("com.gradleup.shadow") version "9.3.0" + id("com.palantir.git-version") version "4.2.0" id("xyz.jpenilla.run-paper") version "3.0.2" id("xyz.jpenilla.run-waterfall") version "3.0.2" id("xyz.jpenilla.run-velocity") version "3.0.2" } +@Suppress("UNCHECKED_CAST") +val GIT_INFO = (extra["versionDetails"] as Closure)() + repositories { mavenCentral() maven("https://repo.papermc.io/repository/maven-public/") @@ -85,6 +91,23 @@ java { toolchain.languageVersion.set(JavaLanguageVersion.of(17)) } +val BUILD_PROPS = mapOf( + "plugin_name" to PLUGIN_NAME, + "plugin_iden" to PLUGIN_IDEN, + "plugin_desc" to PLUGIN_DESC, + "plugin_vers" to PLUGIN_VERS, + "plugin_site" to PLUGIN_SITE, + "plugin_depa" to PLUGIN_DEPA_J, + "plugin_depb" to PLUGIN_DEPB_J, + "plugin_depc" to PLUGIN_DEPC_J, + "plugin_sdpa" to PLUGIN_SDPA_J, + "plugin_sdpb" to PLUGIN_SDPB_J, + "plugin_prov" to PLUGIN_PROV_J, + "plugin_athr" to PLUGIN_ATHR_J, + "plugin_ctbr" to PLUGIN_CTBR_J, + "git_cm_hash" to GIT_INFO.gitHashFull, +) + tasks.withType().configureEach { options.encoding = "UTF-8" options.release.set(17) @@ -93,26 +116,24 @@ tasks.withType().configureEach { tasks.withType() { duplicatesStrategy = DuplicatesStrategy.EXCLUDE outputs.upToDateWhen { false } + doFirst { filesMatching(listOf("plugin.yml", "bungee.yml", "velocity-plugin.json")) { - expand(mapOf( - "plugin_name" to PLUGIN_NAME, - "plugin_iden" to PLUGIN_IDEN, - "plugin_desc" to PLUGIN_DESC, - "plugin_vers" to PLUGIN_VERS, - "plugin_site" to PLUGIN_SITE, - "plugin_depa" to PLUGIN_DEPA_J, - "plugin_depb" to PLUGIN_DEPB_J, - "plugin_depc" to PLUGIN_DEPC_J, - "plugin_sdpa" to PLUGIN_SDPA_J, - "plugin_sdpb" to PLUGIN_SDPB_J, - "plugin_prov" to PLUGIN_PROV_J, - "plugin_athr" to PLUGIN_ATHR_J, - "plugin_ctbr" to PLUGIN_CTBR_J, - )) + expand(BUILD_PROPS) } } + doLast { + val file = destinationDir.resolve("build.properties") + file.parentFile.mkdirs() + + file.writeText( + BUILD_PROPS.entries.joinToString("\n") { (k, v) -> + "$k = $v" + } + ) + } + inputs.files(tasks.named("compileJava").map { it.outputs.files }) } @@ -162,20 +183,15 @@ tasks.register("printVars") { } } -fun getJSONObj(list: List): String { - return if (list.isNotEmpty()) { - list.joinToString( - separator = "\", \"", - prefix = "\"", - postfix = "\"" - ) - } else { - "" - } +fun getBukkitBungeeDeps(list: List): String { + return list.joinToString( + prefix = "[", + postfix = "]" + ) { "\"$it\"" } } -fun getJSONObjMerge(a: List, b: List): String { +fun getVelocityDeps(a: List, b: List): String { val c = a.joinToString(", ") { "{\"id\":\"$it\",\"optional\":false}" } val d = b.joinToString(", ") { "{\"id\":\"$it\",\"optional\":true}" } - return listOf(c, d).filter { it.isNotEmpty() }.joinToString(",") + return "[" + listOf(c, d).filter { it.isNotEmpty() }.joinToString(",") + "]" } diff --git a/src/main/java/xyz/webmc/originblacklist/base/OriginBlacklist.java b/src/main/java/xyz/webmc/originblacklist/base/OriginBlacklist.java index 24f4f2c..d0aa84b 100644 --- a/src/main/java/xyz/webmc/originblacklist/base/OriginBlacklist.java +++ b/src/main/java/xyz/webmc/originblacklist/base/OriginBlacklist.java @@ -6,6 +6,7 @@ import xyz.webmc.originblacklist.base.enums.EnumConnectionType; import xyz.webmc.originblacklist.base.enums.EnumLogLevel; import xyz.webmc.originblacklist.base.events.OriginBlacklistLoginEvent; import xyz.webmc.originblacklist.base.events.OriginBlacklistMOTDEvent; +import xyz.webmc.originblacklist.base.util.BuildInfo; import xyz.webmc.originblacklist.base.util.IOriginBlacklistPlugin; import xyz.webmc.originblacklist.base.util.OPlayer; import xyz.webmc.originblacklist.base.util.UpdateChecker; @@ -14,8 +15,11 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.Base64; @@ -54,6 +58,11 @@ public final class OriginBlacklist { }, 60, TimeUnit.MINUTES); } + public final void init() { + this.plugin.log(EnumLogLevel.INFO, "Initialized Plugin"); + this.plugin.log(EnumLogLevel.DEBUG, "Commit " + BuildInfo.get("git_cm_hash")); + } + public final void handleLogin(final OriginBlacklistLoginEvent event) { final OPlayer player = event.getPlayer(); final EnumBlacklistType blacklisted = this.testBlacklist(player); @@ -165,7 +174,7 @@ public final class OriginBlacklist { return EnumBlacklistType.ADDR; } } catch (final AddressStringException exception) { - exception.printStackTrace(); + // exception.printStackTrace(); } } } @@ -275,7 +284,7 @@ public final class OriginBlacklist { } conn.disconnect(); - } catch (Throwable t) { + } catch (final Throwable t) { t.printStackTrace(); } }); @@ -293,42 +302,49 @@ public final class OriginBlacklist { if (!this.config.get("update_checker.auto_update").getAsBoolean()) { this.plugin.log(EnumLogLevel.INFO, "An update is available! Download it at " + this.updateURL); } else { - final Path jar = this.plugin.getPluginJarPath(); - final Path bak = jar.resolveSibling(jar.getFileName().toString() + ".bak"); - final Path tmp = jar.resolveSibling(jar.getFileName().toString() + ".tmp"); - try { - Files.copy(jar, bak, StandardCopyOption.REPLACE_EXISTING); - } catch (final Throwable t) { - t.printStackTrace(); - } - try { - final URL url = new URL(this.updateURL); - final HttpURLConnection conn = (HttpURLConnection) url.openConnection(); - conn.setRequestMethod("GET"); - conn.setConnectTimeout(15000); - conn.setReadTimeout(15000); - conn.connect(); - try (final InputStream in = conn.getInputStream()) { - Files.copy(in, tmp, StandardCopyOption.REPLACE_EXISTING); - } finally { - conn.disconnect(); - } - Files.move(tmp, jar, StandardCopyOption.REPLACE_EXISTING); - Files.delete(bak); - } catch (final Throwable t) { - t.printStackTrace(); - try { - Files.move(bak, jar, StandardCopyOption.REPLACE_EXISTING); - } catch (final Throwable _t) { - _t.printStackTrace(); - } - } + this.updatePlugin(); } } }); } } + private final void updatePlugin() { + try { + final URL url = new URL(this.updateURL); + final Path jar = this.plugin.getPluginJarPath(); + final Path bak = jar.resolveSibling(jar.getFileName().toString() + ".bak"); + final Path upd = jar.resolveSibling(Paths.get(URLDecoder.decode(url.getPath(), StandardCharsets.UTF_8)).getFileName()); + + try { + Files.copy(jar, bak, StandardCopyOption.REPLACE_EXISTING); + } catch (final Throwable t) { + t.printStackTrace(); + } + + try { + final HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("GET"); + conn.setConnectTimeout(15000); + conn.setReadTimeout(15000); + conn.setRequestProperty("User-Agent", OriginBlacklist.getUserAgent()); + conn.connect(); + try (final InputStream in = conn.getInputStream()) { + Files.copy(in, upd, StandardCopyOption.REPLACE_EXISTING); + } finally { + conn.disconnect(); + } + Files.delete(jar); + Files.delete(bak); + } catch (final Throwable t) { + t.printStackTrace(); + Files.move(bak, jar, StandardCopyOption.REPLACE_EXISTING); + } + } catch (final Throwable t) { + t.printStackTrace(); + } + } + public static final String getComponentString(final Component comp) { return LegacyComponentSerializer.legacySection().serialize(comp); } @@ -341,6 +357,10 @@ public final class OriginBlacklist { return "data:image/png;base64," + Base64.getEncoder().encodeToString(bytes); } + public static final String getUserAgent() { + return BuildInfo.get("plugin_name") + "/" + BuildInfo.get("plugin_vers") + "+" + BuildInfo.get("git_cm_hash"); + } + public static final boolean isNonNull(final String str) { return str != null && !str.isEmpty() && !str.isBlank() && !str.equals("null"); } diff --git a/src/main/java/xyz/webmc/originblacklist/base/util/BuildInfo.java b/src/main/java/xyz/webmc/originblacklist/base/util/BuildInfo.java new file mode 100644 index 0000000..656fa64 --- /dev/null +++ b/src/main/java/xyz/webmc/originblacklist/base/util/BuildInfo.java @@ -0,0 +1,19 @@ +package xyz.webmc.originblacklist.base.util; + +import java.io.InputStream; +import java.util.Properties; + +public class BuildInfo { + private static final Properties properties; + + public static final String get(final String key) { + return properties.getProperty(key).trim(); + } + + static { + properties = new Properties(); + try (final InputStream in = BuildInfo.class.getClassLoader().getResourceAsStream("build.properties")) { + properties.load(in); + } catch (final Throwable t) {} + } +} diff --git a/src/main/java/xyz/webmc/originblacklist/base/util/UpdateChecker.java b/src/main/java/xyz/webmc/originblacklist/base/util/UpdateChecker.java index d19e52e..bbbfa27 100644 --- a/src/main/java/xyz/webmc/originblacklist/base/util/UpdateChecker.java +++ b/src/main/java/xyz/webmc/originblacklist/base/util/UpdateChecker.java @@ -17,54 +17,57 @@ import org.semver4j.Semver.VersionDiff; public class UpdateChecker { private static final Json5 json5 = Json5.builder(builder -> builder.build()); - public static final String checkForUpdate(final String repo, final Semver currentVersion, final boolean allowPreRelease) { + public static final String checkForUpdate(final String repo, final Semver currentVersion, final boolean allowSnapshots) { try { - URL url = new URL("https://api.github.com/repos/" + repo + "/releases"); - HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + final URL url = new URL("https://api.github.com/repos/" + repo + "/releases"); + final HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); + conn.setRequestProperty("User-Agent", OriginBlacklist.getUserAgent()); + conn.setRequestProperty("Accept", "application/vnd.github+json"); conn.connect(); - BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); + final BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); String ret = null; Json5Element element = json5.parse(reader); + reader.close(); if (element instanceof Json5Array) { final Json5Array arr = element.getAsJson5Array(); if (arr.size() > 0) { - element = arr.get(0); - if (element instanceof Json5Object) { - final Json5Object obj = element.getAsJson5Object(); - final String tag = obj.get("tag_name").getAsString(); - final Semver ver = new Semver(tag.substring(1)); - if (ver.isGreaterThan(currentVersion) && (allowPreRelease || currentVersion.diff(ver) != VersionDiff.BUILD)) { - element = obj.get("assets"); - if (element instanceof Json5Array) { - final Json5Array aArr = element.getAsJson5Array(); - element = aArr.get(0); - if (element instanceof Json5Object) { - final Json5Object vObj = element.getAsJson5Object(); - ret = vObj.get("url").getAsString(); + for (int i = 0; i < Math.min(2, arr.size()); i++) { + element = arr.get(i); + if (element instanceof Json5Object) { + final Json5Object obj = element.getAsJson5Object(); + if (allowSnapshots || !obj.get("prerelease").getAsBoolean()) { + final String tag = obj.get("tag_name").getAsString(); + final Semver ver = new Semver(tag.startsWith("v") ? tag.substring(1) : tag); + String comm; + try { + comm = ver.getBuild().get(0).trim(); + } catch (Throwable t) { + comm = ""; + } + if (ver.isGreaterThan(currentVersion) || (allowSnapshots && currentVersion.diff(ver) == VersionDiff.BUILD && OriginBlacklist.isNonNull(comm) && !BuildInfo.get("git_cm_hash").startsWith(comm))) { + element = obj.get("assets"); + if (element instanceof Json5Array) { + final Json5Array aArr = element.getAsJson5Array(); + if (aArr.size() > 0) { + element = aArr.get(0); + if (element instanceof Json5Object) { + final Json5Object vObj = element.getAsJson5Object(); + ret = vObj.get("browser_download_url").getAsString(); + break; + } + } + } } } } + continue; } } } conn.disconnect(); - if (OriginBlacklist.isNonNull(ret)) { - url = new URL(ret); - conn = (HttpURLConnection) url.openConnection(); - conn.setRequestMethod("GET"); - conn.setConnectTimeout(5000); - conn.setReadTimeout(5000); - conn.connect(); - reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); - element = json5.parse(reader); - if (element instanceof Json5Object) { - final Json5Object obj = element.getAsJson5Object(); - ret = obj.get("browser_download_url").getAsString(); - } - } return ret; } catch (final Throwable t) { t.printStackTrace(); diff --git a/src/main/java/xyz/webmc/originblacklist/bukkit/OriginBlacklistBukkit.java b/src/main/java/xyz/webmc/originblacklist/bukkit/OriginBlacklistBukkit.java index 1f0706a..064f6e7 100644 --- a/src/main/java/xyz/webmc/originblacklist/bukkit/OriginBlacklistBukkit.java +++ b/src/main/java/xyz/webmc/originblacklist/bukkit/OriginBlacklistBukkit.java @@ -76,7 +76,7 @@ public final class OriginBlacklistBukkit extends JavaPlugin implements Listener, this.eaglerAPI = EaglerXServerAPI.instance(); this.getCommand("originblacklist").setExecutor(new OriginBlacklistCommandBukkit(this.blacklist)); this.getServer().getPluginManager().registerEvents(this, this); - this.log(EnumLogLevel.INFO, "Initialized Plugin"); + this.blacklist.init(); if (this.blacklist.isMetricsEnabled()) { this.metrics = new Metrics(this, OriginBlacklist.BSTATS_ID); this.metrics.addCustomChart(new AdvancedPie("player_types", () -> { diff --git a/src/main/java/xyz/webmc/originblacklist/bungee/OriginBlacklistBungee.java b/src/main/java/xyz/webmc/originblacklist/bungee/OriginBlacklistBungee.java index 8c4daa8..c10db49 100644 --- a/src/main/java/xyz/webmc/originblacklist/bungee/OriginBlacklistBungee.java +++ b/src/main/java/xyz/webmc/originblacklist/bungee/OriginBlacklistBungee.java @@ -72,7 +72,7 @@ public final class OriginBlacklistBungee extends Plugin implements Listener, IOr this.eaglerAPI = EaglerXServerAPI.instance(); this.getProxy().getPluginManager().registerCommand(this, new OriginBlacklistCommandBungee(this, this.blacklist, "originblacklist")); this.getProxy().getPluginManager().registerListener(this, this); - this.log(EnumLogLevel.INFO, "Initialized Plugin"); + this.blacklist.init(); if (this.blacklist.isMetricsEnabled()) { this.metrics = new Metrics(this, OriginBlacklist.BSTATS_ID); this.metrics.addCustomChart(new AdvancedPie("player_types", () -> { diff --git a/src/main/java/xyz/webmc/originblacklist/velocity/OriginBlacklistVelocity.java b/src/main/java/xyz/webmc/originblacklist/velocity/OriginBlacklistVelocity.java index 61e25e4..0225fa6 100644 --- a/src/main/java/xyz/webmc/originblacklist/velocity/OriginBlacklistVelocity.java +++ b/src/main/java/xyz/webmc/originblacklist/velocity/OriginBlacklistVelocity.java @@ -88,7 +88,7 @@ public final class OriginBlacklistVelocity implements IOriginBlacklistPlugin { this.blacklist = new OriginBlacklist(this); this.eaglerAPI = EaglerXServerAPI.instance(); this.proxy.getCommandManager().register("originblacklist", new OriginBlacklistCommandVelocity(this.blacklist)); - this.log(EnumLogLevel.INFO, "Initialized Plugin"); + this.blacklist.init(); if (this.blacklist.isMetricsEnabled()) { this.metrics = this.metricsFactory.make(this, OriginBlacklist.BSTATS_ID); this.metrics.addCustomChart(new AdvancedPie("player_types", () -> { @@ -153,7 +153,7 @@ public final class OriginBlacklistVelocity implements IOriginBlacklistPlugin { public final Path getPluginJarPath() { try { return Paths.get(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()).toAbsolutePath(); - } catch (Throwable t) { + } catch (final Throwable t) { throw new RuntimeException("Unable to determine plugin JAR path"); } } @@ -166,7 +166,7 @@ public final class OriginBlacklistVelocity implements IOriginBlacklistPlugin { this.logger.error(txt); } else if (level == EnumLogLevel.DEBUG) { if (this.blacklist.isDebugEnabled()) { - this.logger.debug(txt); + this.logger.info(txt); } } else { this.logger.info(txt); diff --git a/src/main/resources/bungee.yml b/src/main/resources/bungee.yml index bb401b5..9c007d2 100644 --- a/src/main/resources/bungee.yml +++ b/src/main/resources/bungee.yml @@ -3,8 +3,8 @@ version: ${plugin_vers} main: xyz.webmc.${plugin_iden}.bungee.${plugin_name}Bungee description: ${plugin_desc} website: ${plugin_site} -author: [${plugin_athr}] -contributors: [${plugin_ctbr}] -depends: [${plugin_depb}] -provides: [${plugin_prov}] -softdepend: [${plugin_sdpb}] \ No newline at end of file +author: ${plugin_athr} +contributors: ${plugin_ctbr} +depends: ${plugin_depb} +provides: ${plugin_prov} +softdepend: ${plugin_sdpb} \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index dfdc264..659e87c 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -3,10 +3,10 @@ version: ${plugin_vers} main: xyz.webmc.${plugin_iden}.bukkit.${plugin_name}Bukkit description: ${plugin_desc} website: ${plugin_site} -authors: [${plugin_athr}] -contributors: [${plugin_ctbr}] -depend: [${plugin_depa}] -provides: [${plugin_prov}] -softdepend: [${plugin_sdpa}] +authors: ${plugin_athr} +contributors: ${plugin_ctbr} +depend: ${plugin_depa} +provides: ${plugin_prov} +softdepend: ${plugin_sdpa} commands: - originblacklist: \ No newline at end of file + ${plugin_iden}: \ No newline at end of file diff --git a/src/main/resources/velocity-plugin.json b/src/main/resources/velocity-plugin.json index 8dda797..364eeb1 100644 --- a/src/main/resources/velocity-plugin.json +++ b/src/main/resources/velocity-plugin.json @@ -5,6 +5,6 @@ "description": "${plugin_desc}", "website": "${plugin_site}", "main": "xyz.webmc.${plugin_iden}.velocity.${plugin_name}Velocity", - "authors": [${plugin_athr}], - "dependencies": [${plugin_depc}] + "authors": ${plugin_athr}, + "dependencies": ${plugin_depc} } \ No newline at end of file