From bb92805fa5584265ca5c71529464fa11c3bd898a Mon Sep 17 00:00:00 2001 From: Telesphoreo Date: Fri, 1 Apr 2022 15:00:55 -0500 Subject: [PATCH] Add caching to the updater --- src/main/java/dev/plex/admin/AdminList.java | 1 - .../java/dev/plex/cache/MongoPlayerData.java | 1 - .../java/dev/plex/cache/SQLPlayerData.java | 1 - .../java/dev/plex/command/impl/PlexCMD.java | 2 +- .../java/dev/plex/module/ModuleManager.java | 1 - src/main/java/dev/plex/module/PlexModule.java | 2 - .../java/dev/plex/module/PlexModuleFile.java | 3 +- .../dev/plex/module/loader/LibraryLoader.java | 26 +++++++------ .../services/impl/UpdateCheckerService.java | 2 +- .../java/dev/plex/util/UpdateChecker.java | 38 +++++++++++++++++-- 10 files changed, 51 insertions(+), 26 deletions(-) diff --git a/src/main/java/dev/plex/admin/AdminList.java b/src/main/java/dev/plex/admin/AdminList.java index 806e5e8..a359b7c 100644 --- a/src/main/java/dev/plex/admin/AdminList.java +++ b/src/main/java/dev/plex/admin/AdminList.java @@ -10,7 +10,6 @@ import dev.plex.PlexBase; import dev.plex.player.PlexPlayer; import dev.plex.rank.enums.Rank; import dev.plex.storage.StorageType; - import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; diff --git a/src/main/java/dev/plex/cache/MongoPlayerData.java b/src/main/java/dev/plex/cache/MongoPlayerData.java index 51116ef..5d30898 100644 --- a/src/main/java/dev/plex/cache/MongoPlayerData.java +++ b/src/main/java/dev/plex/cache/MongoPlayerData.java @@ -7,7 +7,6 @@ import dev.morphia.query.experimental.filters.Filters; import dev.morphia.query.experimental.updates.UpdateOperators; import dev.plex.Plex; import dev.plex.player.PlexPlayer; - import java.util.Collections; import java.util.UUID; diff --git a/src/main/java/dev/plex/cache/SQLPlayerData.java b/src/main/java/dev/plex/cache/SQLPlayerData.java index 5a8a784..fbe9ff6 100644 --- a/src/main/java/dev/plex/cache/SQLPlayerData.java +++ b/src/main/java/dev/plex/cache/SQLPlayerData.java @@ -10,7 +10,6 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import java.util.UUID; -import java.util.concurrent.CompletableFuture; /** * SQL fetching utilities for players diff --git a/src/main/java/dev/plex/command/impl/PlexCMD.java b/src/main/java/dev/plex/command/impl/PlexCMD.java index 37c663a..258d629 100644 --- a/src/main/java/dev/plex/command/impl/PlexCMD.java +++ b/src/main/java/dev/plex/command/impl/PlexCMD.java @@ -35,7 +35,7 @@ public class PlexCMD extends PlexCommand send(sender, mmString("Authors: Telesphoreo, Taahh")); send(sender, mmString("Built by: " + Plex.build.author + " on " + Plex.build.date)); send(sender, mmString("Run /plex modules to see a list of modules.")); - plugin.getUpdateChecker().getUpdateStatusMessage(sender); + plugin.getUpdateChecker().getUpdateStatusMessage(sender, true); return null; } if (args[0].equalsIgnoreCase("reload")) diff --git a/src/main/java/dev/plex/module/ModuleManager.java b/src/main/java/dev/plex/module/ModuleManager.java index 133439d..8bffce2 100644 --- a/src/main/java/dev/plex/module/ModuleManager.java +++ b/src/main/java/dev/plex/module/ModuleManager.java @@ -3,7 +3,6 @@ package dev.plex.module; import com.google.common.collect.Lists; import dev.plex.Plex; import dev.plex.module.exception.ModuleLoadException; -//import dev.plex.module.loader.CustomClassLoader; import dev.plex.module.loader.LibraryLoader; import dev.plex.util.PlexLog; import java.io.File; diff --git a/src/main/java/dev/plex/module/PlexModule.java b/src/main/java/dev/plex/module/PlexModule.java index 95f2a2b..61c4d78 100644 --- a/src/main/java/dev/plex/module/PlexModule.java +++ b/src/main/java/dev/plex/module/PlexModule.java @@ -7,8 +7,6 @@ import dev.plex.listener.PlexListener; import java.io.File; import java.util.List; import java.util.Locale; - -//import dev.plex.module.loader.CustomClassLoader; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/dev/plex/module/PlexModuleFile.java b/src/main/java/dev/plex/module/PlexModuleFile.java index 699d696..96aae39 100644 --- a/src/main/java/dev/plex/module/PlexModuleFile.java +++ b/src/main/java/dev/plex/module/PlexModuleFile.java @@ -1,9 +1,8 @@ package dev.plex.module; import com.google.common.collect.ImmutableList; -import lombok.Data; - import java.util.List; +import lombok.Data; @Data public class PlexModuleFile diff --git a/src/main/java/dev/plex/module/loader/LibraryLoader.java b/src/main/java/dev/plex/module/loader/LibraryLoader.java index 3b78f61..eb4e878 100644 --- a/src/main/java/dev/plex/module/loader/LibraryLoader.java +++ b/src/main/java/dev/plex/module/loader/LibraryLoader.java @@ -4,6 +4,20 @@ import com.google.common.collect.Lists; import dev.plex.Plex; import dev.plex.module.PlexModule; import dev.plex.module.PlexModuleFile; +import java.io.File; +import java.io.IOException; +import java.net.JarURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Enumeration; +import java.util.List; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.logging.Level; +import java.util.logging.Logger; import org.apache.maven.repository.internal.MavenRepositorySystemUtils; import org.eclipse.aether.DefaultRepositorySystemSession; import org.eclipse.aether.RepositorySystem; @@ -29,18 +43,6 @@ import org.eclipse.aether.transport.http.HttpTransporterFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.File; -import java.io.IOException; -import java.net.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Enumeration; -import java.util.List; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; -import java.util.logging.Level; -import java.util.logging.Logger; - //TODO: doesn't work public class LibraryLoader { diff --git a/src/main/java/dev/plex/services/impl/UpdateCheckerService.java b/src/main/java/dev/plex/services/impl/UpdateCheckerService.java index 80815b6..89662bd 100644 --- a/src/main/java/dev/plex/services/impl/UpdateCheckerService.java +++ b/src/main/java/dev/plex/services/impl/UpdateCheckerService.java @@ -17,7 +17,7 @@ public class UpdateCheckerService extends AbstractService { if (!newVersion) { - if (plugin.getUpdateChecker().getUpdateStatusMessage(Bukkit.getConsoleSender())) + if (plugin.getUpdateChecker().getUpdateStatusMessage(Bukkit.getConsoleSender(), false)) { newVersion = true; } diff --git a/src/main/java/dev/plex/util/UpdateChecker.java b/src/main/java/dev/plex/util/UpdateChecker.java index c77f247..cc558e0 100644 --- a/src/main/java/dev/plex/util/UpdateChecker.java +++ b/src/main/java/dev/plex/util/UpdateChecker.java @@ -18,7 +18,16 @@ import org.bukkit.command.CommandSender; public class UpdateChecker extends PlexBase { - private static final String DOWNLOAD_PAGE = "https://ci.plex.us.org/job/Plex/"; + /* + * -4 = Never checked for updates + * -3 = Likely rate limited + * -2 = Unknown commit + * -1 = Error occurred + * 0 = Up to date + * > 0 = Number of commits behind + */ + private final String DOWNLOAD_PAGE = "https://ci.plex.us.org/job/Plex/"; + private int distance = -4; // Adapted from Paper private int fetchDistanceFromGitHub(@Nonnull String repo, @Nonnull String branch, @Nonnull String hash) @@ -31,6 +40,10 @@ public class UpdateChecker extends PlexBase { return -2; // Unknown commit } + if (connection.getResponseCode() == HttpURLConnection.HTTP_FORBIDDEN) + { + return -3; // Rate limited likely + } try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charsets.UTF_8))) { JsonObject obj = new Gson().fromJson(reader, JsonObject.class); @@ -55,10 +68,27 @@ public class UpdateChecker extends PlexBase } } - public boolean getUpdateStatusMessage(CommandSender sender) + public boolean getUpdateStatusMessage(CommandSender sender, boolean cached) { - int distance; - distance = fetchDistanceFromGitHub("plexusorg/Plex", "master", Plex.build.head); + // If it's -4, it hasn't checked for updates yet + if (distance == -4) + { + distance = fetchDistanceFromGitHub("plexusorg/Plex", "master", Plex.build.head); + PlexLog.debug("Never checked for updates, checking now..."); + } + else + { + // If the request isn't asked to be cached, fetch it + if (!cached) + { + distance = fetchDistanceFromGitHub("plexusorg/Plex", "master", Plex.build.head); + PlexLog.debug("We have checked for updates before, but this request was not asked to be cached."); + } + else + { + PlexLog.debug("We have checked for updates before, using cache."); + } + } switch (distance) {