diff --git a/build.gradle.kts b/build.gradle.kts index c6d79c83..f1f9b624 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,7 +6,7 @@ plugins { } group = "org.lushplugins" -version = "4.3.2" +version = "5.0.0-alpha.1" allprojects { plugins.apply("java-library") diff --git a/common/api/build.gradle.kts b/common/api/build.gradle.kts index 292582ed..c750bdb9 100644 --- a/common/api/build.gradle.kts +++ b/common/api/build.gradle.kts @@ -17,5 +17,7 @@ sourceSets { dependencies { api("com.google.guava:guava:33.7.1-jre") api("com.google.code.gson:gson:2.14.0") + api("net.kyori:adventure-text-logger-slf4j:5.2.0") + api("org.slf4j:slf4j-api:2.0.17") compileOnlyApi("org.jetbrains:annotations:26.1.0") } \ No newline at end of file diff --git a/common/api/src/main/java/org/lushplugins/pluginupdater/api/updater/PluginData.java b/common/api/src/main/java/org/lushplugins/pluginupdater/api/updater/PluginData.java index 29a2ad8f..3f4f42ec 100644 --- a/common/api/src/main/java/org/lushplugins/pluginupdater/api/updater/PluginData.java +++ b/common/api/src/main/java/org/lushplugins/pluginupdater/api/updater/PluginData.java @@ -18,7 +18,6 @@ import java.io.IOException; import java.nio.file.Path; import java.util.*; -import java.util.logging.Level; public class PluginData { private final String pluginName; @@ -170,7 +169,7 @@ public boolean checkForUpdate() { latestVersion = fetchedVersion.version(); sourceContext = fetchedVersion.sourceContext(); } catch (InvalidVersionFormatException e) { - UpdaterConstants.LOGGER.severe("Failed to read latest version for '%s': %s".formatted(this.pluginName, e.getMessage())); + UpdaterConstants.LOGGER.error("Failed to read latest version for {}: {}", this.pluginName, e.getMessage()); return false; } @@ -179,7 +178,7 @@ public boolean checkForUpdate() { VersionComparator comparator = versionComparator().orElse(sourceContext.sourceData().defaultComparator()); versionDifference = comparator.compare(this.currentVersion, latestVersion); } catch (InvalidVersionFormatException e) { - UpdaterConstants.LOGGER.severe("Failed to compare versions for '%s': %s".formatted(this.pluginName, e.getMessage())); + UpdaterConstants.LOGGER.error("Failed to compare versions for {}: {}", this.pluginName, e.getMessage()); return false; } @@ -209,11 +208,15 @@ public boolean downloadUpdate(Path destinationDir) { prepareDownloadableRelease() .downloadTo(destinationDir); return true; - } catch (IOException | InterruptedException e) { - UpdaterConstants.LOGGER.log(Level.SEVERE, "Failed to download update for plugin '" + this.pluginName + "'.", e); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + UpdaterConstants.LOGGER.error("Failed to download update for plugin '{}'.", this.pluginName, e); + return false; + } catch (IOException e) { + UpdaterConstants.LOGGER.error("Failed to download update for plugin '{}'.", this.pluginName, e); return false; } catch (RuntimeException e) { - UpdaterConstants.LOGGER.log(Level.SEVERE, "Failed to prepare or download update for plugin '" + this.pluginName + "'.", e); + UpdaterConstants.LOGGER.error("Failed to prepare or download update for plugin '{}'.", this.pluginName, e); return false; } } @@ -228,9 +231,12 @@ private T attemptOnSources(SourceSupplier supplier) throws FailedAttempts try { return supplier.apply(new SourceContext(source, sourceData)); } catch (InvalidHttpResponse e) { - UpdaterConstants.LOGGER.severe(e.getMessage()); - } catch (Throwable e) { - UpdaterConstants.LOGGER.log(Level.SEVERE, e.getMessage(), e); + UpdaterConstants.LOGGER.error(e.getMessage()); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + UpdaterConstants.LOGGER.error("Thread interrupted while fetching data from source '{}' for plugin '{}'.", sourceData.sourceName(), this.pluginName, e); + } catch (Exception e) { + UpdaterConstants.LOGGER.error("Failed to fetch data from source '{}' for plugin '{}'.", sourceData.sourceName(), this.pluginName, e); } } diff --git a/common/api/src/main/java/org/lushplugins/pluginupdater/api/updater/PluginInfo.java b/common/api/src/main/java/org/lushplugins/pluginupdater/api/updater/PluginInfo.java index b4df5a66..4cd00af5 100644 --- a/common/api/src/main/java/org/lushplugins/pluginupdater/api/updater/PluginInfo.java +++ b/common/api/src/main/java/org/lushplugins/pluginupdater/api/updater/PluginInfo.java @@ -1,9 +1,9 @@ package org.lushplugins.pluginupdater.api.updater; +import net.kyori.adventure.text.logger.slf4j.ComponentLogger; import org.jetbrains.annotations.Nullable; import java.io.File; -import java.util.logging.Logger; public interface PluginInfo { @@ -25,5 +25,5 @@ public interface PluginInfo { /** * @return The plugin's logger instance */ - Logger getLogger(); + ComponentLogger getComponentLogger(); } diff --git a/common/api/src/main/java/org/lushplugins/pluginupdater/api/util/UpdaterConstants.java b/common/api/src/main/java/org/lushplugins/pluginupdater/api/util/UpdaterConstants.java index 2b76f453..6e742a37 100644 --- a/common/api/src/main/java/org/lushplugins/pluginupdater/api/util/UpdaterConstants.java +++ b/common/api/src/main/java/org/lushplugins/pluginupdater/api/util/UpdaterConstants.java @@ -1,38 +1,9 @@ package org.lushplugins.pluginupdater.api.util; import com.google.gson.Gson; - -import java.util.logging.*; +import net.kyori.adventure.text.logger.slf4j.ComponentLogger; public class UpdaterConstants { - public static final Logger LOGGER = Logger.getLogger("PluginUpdater"); + public static ComponentLogger LOGGER = ComponentLogger.logger("PluginUpdater"); public static final Gson GSON = new Gson(); - - static { - for (Handler handler : LOGGER.getHandlers()) { - LOGGER.removeHandler(handler); - } - - LOGGER.addHandler(new StreamHandler(System.out, new LogFormatter())); - LOGGER.setUseParentHandlers(false); - } - - private static class LogFormatter extends Formatter { - private static final String RESET = "\u001B[0m"; - private static final String YELLOW = "\u001B[33m"; - private static final String RED = "\u001B[31m"; - - @Override - public String format(LogRecord record) { - String message = "[%s] [%s] %s".formatted(record.getLevel(), LOGGER.getName(), record.getMessage()); - - if (record.getLevel() == Level.WARNING) { - message = YELLOW + message + RESET; - } else if (record.getLevel() == Level.SEVERE) { - message = RED + message + RESET; - } - - return message + System.lineSeparator(); - } - } } diff --git a/common/api/src/main/java/org/lushplugins/pluginupdater/api/version/DownloadableRelease.java b/common/api/src/main/java/org/lushplugins/pluginupdater/api/version/DownloadableRelease.java index cafc65c2..a87b28c5 100644 --- a/common/api/src/main/java/org/lushplugins/pluginupdater/api/version/DownloadableRelease.java +++ b/common/api/src/main/java/org/lushplugins/pluginupdater/api/version/DownloadableRelease.java @@ -60,7 +60,7 @@ public void downloadTo(Path destinationDir) throws IOException, InterruptedExcep // Ensures update folder exists Files.createDirectories(downloadPath.getParent()); - UpdaterConstants.LOGGER.info("Saving '" + fileName + "' to '" + downloadPath.toAbsolutePath() + "'"); + UpdaterConstants.LOGGER.info("Saving '{}' to '{}'", fileName, downloadPath.toAbsolutePath()); HttpResponse downloadResponse = client.send( request, HttpResponse.BodyHandlers.ofFile(downloadPath) diff --git a/common/impl/build.gradle.kts b/common/impl/build.gradle.kts index 4e7af67f..82f42641 100644 --- a/common/impl/build.gradle.kts +++ b/common/impl/build.gradle.kts @@ -3,4 +3,5 @@ dependencies { api("io.github.revxrsal:lamp.common:4.0.0-rc.18") api("com.electronwill.night-config:yaml:3.9.0") + implementation("io.github.4drian3d:jdwebhooks:2.0.0") } diff --git a/common/impl/src/main/java/org/lushplugins/pluginupdater/common/UpdaterImpl.java b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/UpdaterImpl.java index c91e864d..f5588ed4 100644 --- a/common/impl/src/main/java/org/lushplugins/pluginupdater/common/UpdaterImpl.java +++ b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/UpdaterImpl.java @@ -10,17 +10,15 @@ import org.lushplugins.pluginupdater.common.command.annotation.PluginName; import org.lushplugins.pluginupdater.common.command.response.StringMessageResponseHandler; import org.lushplugins.pluginupdater.common.config.ConfigManager; +import org.lushplugins.pluginupdater.common.notifier.DiscordWebHookNotifier; import org.lushplugins.pluginupdater.common.platform.CommandHandler; import org.lushplugins.pluginupdater.common.platform.UpdaterPlugin; import org.lushplugins.pluginupdater.common.updater.UpdateHandler; import revxrsal.commands.Lamp; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.CompletableFuture; -import java.util.logging.Level; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; public class UpdaterImpl { @@ -43,6 +41,14 @@ public UpdaterImpl(UpdaterPlatform platform, UpdaterPlugin updaterPlugin, Com config = new ConfigManager(this); config.reload(); + int delay = config.getScheduleFrequencyMins(); + if (delay > 0) { + updateHandler.scheduler().scheduleAtFixedRate(() -> { + updateHandler.queueUpdateChecks(config.getPlugins()); + updateHandler.queueBroadcastNotification(); + }, delay, delay, TimeUnit.MINUTES); + } + Lamp lamp = commandPlatform.prepareLamp() .permissionFactory(new CommandPermissionFactory(this)) .parameterTypes(parameterTypes -> parameterTypes @@ -84,6 +90,7 @@ public UpdaterImpl(UpdaterPlatform platform, UpdaterPlugin updaterPlugin, Com public void shutdown() { updateHandler.shutdown(); + config.shutdownNotifiers(); } public UpdaterPlatform platform() { @@ -127,8 +134,8 @@ public CompletableFuture> collectUnknownPlugins() { List foundPluginData; try { foundPluginData = collector.collect(unknownPlugins.values()); - } catch (Throwable e) { - updaterPlugin.getLogger().log(Level.WARNING, "Caught exception whilst collecting unknown plugin data: ", e); + } catch (Exception e) { + updaterPlugin.getComponentLogger().warn("Caught exception whilst collecting unknown plugin data: ", e); continue; } diff --git a/common/impl/src/main/java/org/lushplugins/pluginupdater/common/collector/ModrinthCollector.java b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/collector/ModrinthCollector.java index b806f91f..df12c64d 100644 --- a/common/impl/src/main/java/org/lushplugins/pluginupdater/common/collector/ModrinthCollector.java +++ b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/collector/ModrinthCollector.java @@ -16,7 +16,6 @@ import java.io.IOException; import java.net.http.HttpResponse; import java.util.*; -import java.util.logging.Level; public record ModrinthCollector(UpdaterImpl updater) implements PluginDataCollector { @@ -34,7 +33,7 @@ public List collect(Collection plugins) { hash = Files.asByteSource(pluginFile).hash(Hashing.sha512()); pluginHashes.put(hash.toString(), unknownPlugin); } catch (IOException e) { - updater.updaterPlugin().getLogger().log(Level.WARNING, "Caught error whilst hashing plugin file: ", e); + updater.updaterPlugin().getComponentLogger().warn("Caught error whilst hashing plugin file: ", e); } } @@ -49,13 +48,17 @@ public List collect(Collection plugins) { HttpResponse response; try { response = HttpUtil.sendRequest(String.format("%s/version_files", ModrinthSource.ENDPOINT.url()), payload); - } catch (IOException | InterruptedException e) { - updater.updaterPlugin().getLogger().log(Level.WARNING, "Caught error whilst getting project data from hashes: ", e); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + updater.updaterPlugin().getComponentLogger().warn("Caught error whilst getting project data from hashes: ", e); + return Collections.emptyList(); + } catch (IOException e) { + updater.updaterPlugin().getComponentLogger().warn("Caught error whilst getting project data from hashes: ", e); return Collections.emptyList(); } if (response.statusCode() != 200) { - updater.updaterPlugin().getLogger().log(Level.WARNING, "Received invalid response code (" + response.statusCode() + ") whilst getting project data from hashes."); + updater.updaterPlugin().getComponentLogger().warn("Received invalid response code ({}) whilst getting project data from hashes.", response.statusCode()); return Collections.emptyList(); } diff --git a/common/impl/src/main/java/org/lushplugins/pluginupdater/common/command/UpdaterCommand.java b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/command/UpdaterCommand.java index a1ca125c..90a32ecb 100644 --- a/common/impl/src/main/java/org/lushplugins/pluginupdater/common/command/UpdaterCommand.java +++ b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/command/UpdaterCommand.java @@ -2,9 +2,9 @@ import org.lushplugins.pluginupdater.api.updater.PluginData; import org.lushplugins.pluginupdater.api.updater.PluginInfo; +import org.lushplugins.pluginupdater.common.UpdaterImpl; import org.lushplugins.pluginupdater.common.command.annotation.CommandPermission; import org.lushplugins.pluginupdater.common.command.annotation.PluginName; -import org.lushplugins.pluginupdater.common.UpdaterImpl; import org.lushplugins.pluginupdater.common.updater.UpdateHandler; import revxrsal.commands.annotation.Subcommand; import revxrsal.commands.annotation.Switch; @@ -13,7 +13,6 @@ import java.util.List; import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; @SuppressWarnings("unused") public record UpdaterCommand(UpdaterImpl updater) implements OrphanCommand { @@ -23,8 +22,8 @@ public record UpdaterCommand(UpdaterImpl updater) implements OrphanCommand { public String reload(@Switch("skip-check") boolean skipCheck) { try { updater.config().reload(skipCheck); - } catch (Throwable e) { - updater.updaterPlugin().getLogger().log(Level.SEVERE, "Caught error whilst reloading: ", e); + } catch (Exception e) { + updater.updaterPlugin().getComponentLogger().error("Caught error whilst reloading: ", e); return "<#ff6969>Something went wrong whilst reloading the plugin, check the console for errors"; } diff --git a/common/impl/src/main/java/org/lushplugins/pluginupdater/common/config/ConfigManager.java b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/config/ConfigManager.java index 93d4487a..de5f596b 100644 --- a/common/impl/src/main/java/org/lushplugins/pluginupdater/common/config/ConfigManager.java +++ b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/config/ConfigManager.java @@ -6,23 +6,27 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.lushplugins.pluginupdater.api.updater.PluginData; -import org.lushplugins.pluginupdater.common.config.deserializer.PluginDataDeserializer; import org.lushplugins.pluginupdater.common.UpdaterImpl; +import org.lushplugins.pluginupdater.common.config.deserializer.PluginDataDeserializer; +import org.lushplugins.pluginupdater.common.notifier.Notifier; +import org.lushplugins.pluginupdater.common.notifier.NotifierRegistry; import org.lushplugins.pluginupdater.common.updater.UpdateHandler; import org.lushplugins.pluginupdater.common.util.ConfigUtil; import java.io.IOException; import java.nio.file.Files; import java.util.*; -import java.util.logging.Level; import java.util.stream.Collectors; public class ConfigManager { private final UpdaterImpl updater; private boolean allowDownloads; + private int scheduleFrequencyMins; private final Map plugins = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); private final Set disabledPlugins = new HashSet<>(); private Messages messages; + private String discordWebhookUrl; + private List notifiers = Collections.emptyList(); public ConfigManager(UpdaterImpl updater) { this.updater = updater; @@ -42,10 +46,23 @@ public void reload(boolean skipCheck) { boolean checkOnReload = ConfigUtil.getOrAliasOrElse( config, "check-updates-on-reload", "check-updates-on-start", true, - () -> updater.updaterPlugin().getLogger().log(Level.WARNING, "Deprecated: The config section 'check-updates-on-start' has been renamed to 'check-updates-on-reload'") + () -> updater.updaterPlugin().getComponentLogger().warn("Deprecated: The config section 'check-updates-on-start' has been renamed to 'check-updates-on-reload'") ); this.allowDownloads = config.getOrElse("allow-downloads", true); + this.scheduleFrequencyMins = config.getOrElse("schedule-frequency", -1); + + Config discordConfig = config.get("discord-webhook"); + if (discordConfig != null) { + boolean discordWebhookEnabled = discordConfig.getOrElse("enabled", false); + if (!discordWebhookEnabled) { + discordWebhookUrl = ""; + } else { + this.discordWebhookUrl = discordConfig.getOrElse("webhook-url", ""); + } + } else { + this.discordWebhookUrl = ""; + } Config messagesConfig = config.get("messages"); if (messagesConfig != null) { @@ -86,11 +103,18 @@ public void reload(boolean skipCheck) { if (checkOnReload && !skipCheck) { UpdateHandler updateHandler = updater.updateHandler(); - getPlugins().forEach(updateHandler::queueUpdateCheck); + updateHandler.queueUpdateChecks(getPlugins()); updateHandler.queueBroadcastNotification(); } }); + this.notifiers.forEach(Notifier::shutdown); + if (config.contains("notifications")) { + this.notifiers = NotifierRegistry.deserializeNotifiers(updater, config.get("notifications")); + } else { + this.notifiers = Collections.emptyList(); + } + config.close(); } @@ -102,6 +126,10 @@ public boolean shouldAllowDownloads() { return allowDownloads; } + public int getScheduleFrequencyMins() { + return scheduleFrequencyMins; + } + public boolean canRegisterPluginData(String pluginName) { return !plugins.containsKey(pluginName) && !disabledPlugins.contains(pluginName); } @@ -142,6 +170,19 @@ public String getMessage(String name, String def) { return messages.get(name, def); } + public String getDiscordWebHookUrl() { + return discordWebhookUrl; + } + + public List getNotifiers() { + return notifiers; + } + + public void shutdownNotifiers() { + notifiers.forEach(Notifier::shutdown); + notifiers = Collections.emptyList(); + } + public record Messages(Map messages) { diff --git a/common/impl/src/main/java/org/lushplugins/pluginupdater/common/config/deserializer/NotifierDeserializer.java b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/config/deserializer/NotifierDeserializer.java new file mode 100644 index 00000000..2c83e4b8 --- /dev/null +++ b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/config/deserializer/NotifierDeserializer.java @@ -0,0 +1,15 @@ +package org.lushplugins.pluginupdater.common.config.deserializer; + +import com.electronwill.nightconfig.core.Config; +import org.jetbrains.annotations.Nullable; +import org.lushplugins.pluginupdater.common.UpdaterImpl; +import org.lushplugins.pluginupdater.common.notifier.DiscordWebHookNotifier; +import org.lushplugins.pluginupdater.common.notifier.Notifier; + +public class NotifierDeserializer { + + public static @Nullable Notifier discordWebHookNotifier(UpdaterImpl updater, Config config) { + String webHookUrl = config.get("webhook-url"); + return !webHookUrl.isBlank() ? new DiscordWebHookNotifier(updater.updaterPlugin().getComponentLogger(), webHookUrl) : null; + } +} diff --git a/common/impl/src/main/java/org/lushplugins/pluginupdater/common/config/deserializer/PluginDataDeserializer.java b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/config/deserializer/PluginDataDeserializer.java index ee193618..e6487fcb 100644 --- a/common/impl/src/main/java/org/lushplugins/pluginupdater/common/config/deserializer/PluginDataDeserializer.java +++ b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/config/deserializer/PluginDataDeserializer.java @@ -13,7 +13,6 @@ import java.util.Collections; import java.util.List; -import java.util.logging.Level; public class PluginDataDeserializer { @@ -51,8 +50,8 @@ public static PluginData deserialize(PluginInfo pluginInfo, Config config) { .build(); } } catch (Exception e) { - UpdaterConstants.LOGGER.log(Level.SEVERE, "Caught error whilst reading data for '%s'" - .formatted(pluginInfo.getName()), e); + UpdaterConstants.LOGGER.error("Caught error whilst reading data for '{}'", + pluginInfo.getName(), e); } return null; diff --git a/common/impl/src/main/java/org/lushplugins/pluginupdater/common/config/deserializer/SourceDataDeserializer.java b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/config/deserializer/SourceDataDeserializer.java index db3de0cb..0f2d8aa2 100644 --- a/common/impl/src/main/java/org/lushplugins/pluginupdater/common/config/deserializer/SourceDataDeserializer.java +++ b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/config/deserializer/SourceDataDeserializer.java @@ -8,13 +8,12 @@ import java.util.Collections; import java.util.List; -import java.util.logging.Level; public class SourceDataDeserializer { public static SourceData deserialize(Config config) { String source = ConfigUtil.getOrAlias(config, "source", "platform", - () -> UpdaterConstants.LOGGER.log(Level.WARNING, "Deprecated: The config option 'updater' has been renamed to 'source'")); + () -> UpdaterConstants.LOGGER.warn("Deprecated: The config option 'updater' has been renamed to 'source'")); return switch (source) { case GeyserSource.NAME -> geyserSourceData(config); @@ -78,7 +77,7 @@ public static ModrinthSource.Data modrinthSourceData(Config config) { .map(String::toLowerCase) .toList(); } else { - releaseChannels = ModrinthSource.ReleaseChannel.ALL; + releaseChannels = Collections.singletonList(ModrinthSource.ReleaseChannel.RELEASE); } return ModrinthSource.Data.builder() diff --git a/common/impl/src/main/java/org/lushplugins/pluginupdater/common/notifier/DiscordWebHookNotifier.java b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/notifier/DiscordWebHookNotifier.java new file mode 100644 index 00000000..20665688 --- /dev/null +++ b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/notifier/DiscordWebHookNotifier.java @@ -0,0 +1,84 @@ +package org.lushplugins.pluginupdater.common.notifier; + +import io.github._4drian3d.jdwebhooks.component.Component; +import io.github._4drian3d.jdwebhooks.component.ContainerableComponent; +import io.github._4drian3d.jdwebhooks.webhook.WebHookClient; +import io.github._4drian3d.jdwebhooks.webhook.WebHookExecution; +import net.kyori.adventure.text.logger.slf4j.ComponentLogger; +import org.jetbrains.annotations.NotNull; +import org.lushplugins.pluginupdater.api.updater.PluginData; +import org.lushplugins.pluginupdater.api.version.Version; +import org.lushplugins.pluginupdater.api.version.VersionDifference; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class DiscordWebHookNotifier implements Notifier { + private final ComponentLogger logger; + private final WebHookClient webHookClient; + + public DiscordWebHookNotifier(ComponentLogger logger, @NotNull String webhookUrl) { + this.logger = logger; + + try { + this.webHookClient = WebHookClient.fromURL(webhookUrl); + } catch (Exception e) { + logger.warn("Failed to create Discord webhook client. Webhook notifications will be disabled. Possible wrong url.", e); + throw e; + } + } + + @Override + public void notifyDownload(PluginData pluginData) { + try { + Version currentVersion = pluginData.currentVersion(); + Optional latestVersionOptional = pluginData.latestVersion(); + if (latestVersionOptional.isEmpty()) { + return; + } + + String pluginName = pluginData.pluginName(); + + String versionString = "%s → %s".formatted( + currentVersion.rawVersionString(), + latestVersionOptional.get().rawVersionString()); + + List components = new ArrayList<>(); + components.add(Component.textDisplay("**" + pluginName + " Updated**")); + components.add(Component.textDisplay("**Version:** " + versionString)); + + VersionDifference versionDiff = pluginData.versionDifference(); + if (versionDiff != VersionDifference.UNKNOWN) { + components.add(Component.textDisplay("**Update Type:** " + versionDiff.name())); + } + + pluginData.getChangelogUrl().ifPresent(s -> components.add(Component.textDisplay("**Changelog:** [View Changelog](" + s + ")"))); + + WebHookExecution webHook = WebHookExecution.builder() + .username("PluginUpdater") + .avatarURL("https://cdn.modrinth.com/data/IBSpJfbm/172c14d2cdb854064160fa627f9dd0043c1b79ee_96.webp") + .component( + Component.container() + .components(components) + .accentColor(0x66b04f) + .build() + ) + .build(); + + webHookClient.executeWebHook(webHook) + .whenComplete((response, throwable) -> { + int statusCode = response.statusCode(); + + if (throwable != null) { + logger.warn("Failed to send Discord webhook notification", throwable); + } else if (statusCode < 200 || statusCode >= 300) { + logger.warn("Discord webhook returned unsuccessful response. Status code: {}, response: {}", statusCode, response); + } + }); + + } catch (Exception e) { + logger.warn("Failed to send Discord webhook notification", e); + } + } +} diff --git a/common/impl/src/main/java/org/lushplugins/pluginupdater/common/notifier/Notifier.java b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/notifier/Notifier.java new file mode 100644 index 00000000..5bf405c0 --- /dev/null +++ b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/notifier/Notifier.java @@ -0,0 +1,10 @@ +package org.lushplugins.pluginupdater.common.notifier; + +import org.lushplugins.pluginupdater.api.updater.PluginData; + +public interface Notifier { + + void notifyDownload(PluginData pluginData); + + default void shutdown() {} +} diff --git a/common/impl/src/main/java/org/lushplugins/pluginupdater/common/notifier/NotifierRegistry.java b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/notifier/NotifierRegistry.java new file mode 100644 index 00000000..859669e6 --- /dev/null +++ b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/notifier/NotifierRegistry.java @@ -0,0 +1,65 @@ +package org.lushplugins.pluginupdater.common.notifier; + +import com.electronwill.nightconfig.core.Config; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.lushplugins.pluginupdater.common.UpdaterImpl; +import org.lushplugins.pluginupdater.common.config.deserializer.NotifierDeserializer; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.BiFunction; + +public class NotifierRegistry { + private static final Map, Config, Notifier>> notifiers = new HashMap<>(); + + static { + register("discord-webhook", NotifierDeserializer::discordWebHookNotifier); + } + + public static @Nullable Notifier deserializeNotifier(UpdaterImpl updater, String id, Config config) { + if (config.get("enabled") == Boolean.FALSE) { + return null; + } + + try { + return notifiers.containsKey(id) ? notifiers.get(id).apply(updater, config) : null; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public static List deserializeNotifiers(UpdaterImpl updater, Config config) { + return config.entrySet().stream() + .map(section -> { + if (section.getValue() instanceof Config sectionConfig) { + String key = section.getKey(); + if (notifiers.containsKey(key)) { + return deserializeNotifier(updater, key, sectionConfig); + } else { + String type = sectionConfig.get("type"); + return deserializeNotifier(updater, type, sectionConfig); + } + } + + return null; + }) + .filter(Objects::nonNull) + .toList(); + } + + public static void register(@NotNull String id, BiFunction, Config, Notifier> constructor) { + if (notifiers.containsKey(id)) { + throw new IllegalStateException("This notifier is already registered"); + } + + notifiers.put(id, constructor); + } + + public static void unregister(String id) { + notifiers.remove(id); + } +} diff --git a/common/impl/src/main/java/org/lushplugins/pluginupdater/common/platform/UpdaterPlugin.java b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/platform/UpdaterPlugin.java index 8febc4eb..3ab9db9b 100644 --- a/common/impl/src/main/java/org/lushplugins/pluginupdater/common/platform/UpdaterPlugin.java +++ b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/platform/UpdaterPlugin.java @@ -1,10 +1,10 @@ package org.lushplugins.pluginupdater.common.platform; +import net.kyori.adventure.text.logger.slf4j.ComponentLogger; import org.lushplugins.pluginupdater.api.updater.PluginInfo; import java.io.InputStream; import java.nio.file.Path; -import java.util.logging.Logger; public interface UpdaterPlugin { @@ -16,5 +16,5 @@ public interface UpdaterPlugin { InputStream getResourceStream(PluginInfo pluginInfo, String path); - Logger getLogger(); + ComponentLogger getComponentLogger(); } diff --git a/common/impl/src/main/java/org/lushplugins/pluginupdater/common/updater/UpdateHandler.java b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/updater/UpdateHandler.java index 78db3afb..67548a7e 100644 --- a/common/impl/src/main/java/org/lushplugins/pluginupdater/common/updater/UpdateHandler.java +++ b/common/impl/src/main/java/org/lushplugins/pluginupdater/common/updater/UpdateHandler.java @@ -7,8 +7,10 @@ import java.io.IOException; import java.util.*; -import java.util.concurrent.*; -import java.util.logging.Level; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; public class UpdateHandler { private final UpdaterImpl updater; @@ -20,7 +22,7 @@ public UpdateHandler(UpdaterImpl updater) { this.updater = updater; } - public ScheduledExecutorService getThreads() { + public ScheduledExecutorService scheduler() { return threads; } @@ -35,7 +37,8 @@ public boolean shutdown() { this.threads.shutdown(); return this.threads.awaitTermination(5, TimeUnit.SECONDS); } catch (InterruptedException e) { - e.printStackTrace(); + Thread.currentThread().interrupt(); + updater.updaterPlugin().getComponentLogger().error("Failed to shutdown update thread.", e); return false; } } @@ -56,6 +59,10 @@ public ProcessingData queueUpdateCheck(String pluginName) { return processingData; } + public void queueUpdateChecks(Collection pluginNames) { + pluginNames.forEach(this::queueUpdateCheck); + } + public ProcessingData queueDownload(String pluginName) { ProcessingData processingData = new ProcessingData(updater, pluginName, ProcessingData.State.DOWNLOAD); queue(processingData); @@ -96,7 +103,7 @@ private void processQueue() { pluginData.setCheckRan(true); break; } catch (Exception e) { - updater.updaterPlugin().getLogger().log(Level.SEVERE, e.getMessage(), e); + updater.updaterPlugin().getComponentLogger().error("Failed update checking.", e); } String sourceNames = String.join(", ", pluginData.sourceData().stream().map(SourceData::sourceName).toList()); @@ -118,6 +125,9 @@ private void processQueue() { if (pluginData.downloadUpdate(updater.updaterPlugin().getDownloadDir())) { pluginData.versionDifference(VersionDifference.UNKNOWN); pluginData.setAlreadyDownloaded(true); + + updater.config().getNotifiers().forEach(notifier -> notifier.notifyDownload(pluginData)); + processingData.getFuture().complete(true); break; } else { diff --git a/common/impl/src/main/resources/config.yml b/common/impl/src/main/resources/config.yml index 17571d3f..cd4315de 100644 --- a/common/impl/src/main/resources/config.yml +++ b/common/impl/src/main/resources/config.yml @@ -2,6 +2,8 @@ check-updates-on-reload: true # Set to 'false' to disable all download features of PluginUpdater (May require restart) allow-downloads: true +# Time in minutes that update checks should be scheduled (Set to '-1' to disable. Requires restart to change) +schedule-frequency: 60 # To learn how to configure plugins that require different sources check out the wiki: https://github.com/OakLoaf/PluginUpdater/wiki/PluginUpdater-Plugin plugins: @@ -12,6 +14,12 @@ plugins: ExamplePlugin: enabled: false +# Notifications for downloads +notifications: + discord-webhook: + enabled: false + webhook-url: "" + messages: unchecked-color: "" update-available-color: "<#ffda54>" diff --git a/platform/cli/build.gradle.kts b/platform/cli/build.gradle.kts index 2f4e5c21..d49a06d5 100644 --- a/platform/cli/build.gradle.kts +++ b/platform/cli/build.gradle.kts @@ -9,6 +9,7 @@ dependencies { implementation("net.kyori:adventure-text-serializer-ansi:5.2.0") api("com.electronwill.night-config:json:3.9.0") implementation("org.jline:jline:4.4.3") + implementation("org.slf4j:slf4j-simple:2.0.18") } tasks { diff --git a/platform/cli/src/main/java/org/lushplugins/pluginupdater/cli/PluginUpdaterCLI.java b/platform/cli/src/main/java/org/lushplugins/pluginupdater/cli/PluginUpdaterCLI.java index 74b08a53..d5003b69 100644 --- a/platform/cli/src/main/java/org/lushplugins/pluginupdater/cli/PluginUpdaterCLI.java +++ b/platform/cli/src/main/java/org/lushplugins/pluginupdater/cli/PluginUpdaterCLI.java @@ -1,5 +1,7 @@ package org.lushplugins.pluginupdater.cli; +import net.kyori.adventure.text.logger.slf4j.ComponentLogger; +import org.jspecify.annotations.NonNull; import org.lushplugins.pluginupdater.api.source.SourceRegistry; import org.lushplugins.pluginupdater.api.source.type.GeyserSource; import org.lushplugins.pluginupdater.api.source.type.HangarSource; @@ -23,8 +25,6 @@ import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; -import java.util.logging.Level; -import java.util.logging.Logger; public class PluginUpdaterCLI implements UpdaterPlugin { private final Platform platform; @@ -74,7 +74,7 @@ public InputStream getResourceStream(PluginInfo pluginInfo, String path) { } @Override - public Logger getLogger() { + public @NonNull ComponentLogger getComponentLogger() { return UpdaterConstants.LOGGER; } @@ -118,7 +118,7 @@ public static void main(String[] args) { ) ); } catch (Exception e) { - UpdaterConstants.LOGGER.log(Level.WARNING, "An error occurred while running the PluginUpdater CLI", e); + UpdaterConstants.LOGGER.warn("An error occurred while running the PluginUpdater CLI", e); } } diff --git a/platform/cli/src/main/java/org/lushplugins/pluginupdater/cli/platform/CLIPlatform.java b/platform/cli/src/main/java/org/lushplugins/pluginupdater/cli/platform/CLIPlatform.java index 469ba1d8..16a1f191 100644 --- a/platform/cli/src/main/java/org/lushplugins/pluginupdater/cli/platform/CLIPlatform.java +++ b/platform/cli/src/main/java/org/lushplugins/pluginupdater/cli/platform/CLIPlatform.java @@ -17,7 +17,6 @@ import java.util.function.UnaryOperator; import java.util.jar.JarEntry; import java.util.jar.JarFile; -import java.util.logging.Level; import java.util.stream.Collectors; public class CLIPlatform implements UpdaterPlatform { @@ -50,7 +49,7 @@ public CLIPlatform(PluginUpdaterCLI cli) { fallbackInfoParser = fallbackInfoParser.getFallbackInfoParser(); } } catch (IOException e) { - cli.getLogger().log(Level.SEVERE, "Failed to interpret jar file for " + path, e); + cli.getComponentLogger().error("Failed to interpret jar file for {}", path, e); } return null; @@ -93,7 +92,7 @@ public void sendActionBar(Object user, String message) {} @Override public void broadcastMessage(Collection users, String message) { - UpdaterConstants.LOGGER.log(Level.INFO, MiniMessage.miniMessage().stripTags(message)); + UpdaterConstants.LOGGER.info(MiniMessage.miniMessage().deserialize(message)); } @Override diff --git a/platform/cli/src/main/java/org/lushplugins/pluginupdater/cli/plugin/CLIPluginInfo.java b/platform/cli/src/main/java/org/lushplugins/pluginupdater/cli/plugin/CLIPluginInfo.java index e81b7e3d..54c91557 100644 --- a/platform/cli/src/main/java/org/lushplugins/pluginupdater/cli/plugin/CLIPluginInfo.java +++ b/platform/cli/src/main/java/org/lushplugins/pluginupdater/cli/plugin/CLIPluginInfo.java @@ -1,11 +1,11 @@ package org.lushplugins.pluginupdater.cli.plugin; +import net.kyori.adventure.text.logger.slf4j.ComponentLogger; import org.jetbrains.annotations.Nullable; import org.lushplugins.pluginupdater.api.updater.PluginInfo; import org.lushplugins.pluginupdater.api.util.UpdaterConstants; import java.io.File; -import java.util.logging.Logger; public record CLIPluginInfo(String name, String version, @Nullable File file) implements PluginInfo { @@ -25,7 +25,7 @@ public String getVersion() { } @Override - public Logger getLogger() { + public ComponentLogger getComponentLogger() { return UpdaterConstants.LOGGER; } } diff --git a/platform/paper-api/src/main/java/org/lushplugins/pluginupdater/paper/api/plugin/PaperPluginInfo.java b/platform/paper-api/src/main/java/org/lushplugins/pluginupdater/paper/api/plugin/PaperPluginInfo.java index fc344191..883bb14a 100644 --- a/platform/paper-api/src/main/java/org/lushplugins/pluginupdater/paper/api/plugin/PaperPluginInfo.java +++ b/platform/paper-api/src/main/java/org/lushplugins/pluginupdater/paper/api/plugin/PaperPluginInfo.java @@ -1,5 +1,6 @@ package org.lushplugins.pluginupdater.paper.api.plugin; +import net.kyori.adventure.text.logger.slf4j.ComponentLogger; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; @@ -10,8 +11,6 @@ import java.io.File; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.logging.Level; -import java.util.logging.Logger; public record PaperPluginInfo(Plugin plugin) implements PluginInfo { @@ -33,13 +32,13 @@ public String getName() { return (File) method.invoke(plugin); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - UpdaterConstants.LOGGER.log(Level.WARNING, "Caught error whilst getting plugin file: ", e); + UpdaterConstants.LOGGER.warn("Caught error whilst getting plugin file: ", e); return null; } } @Override - public Logger getLogger() { - return plugin.getLogger(); + public ComponentLogger getComponentLogger() { + return plugin.getComponentLogger(); } } diff --git a/platform/paper-plugin/build.gradle.kts b/platform/paper-plugin/build.gradle.kts index 650dbfda..e2081627 100644 --- a/platform/paper-plugin/build.gradle.kts +++ b/platform/paper-plugin/build.gradle.kts @@ -39,8 +39,8 @@ tasks { minecraftVersion("1.21.4") downloadPlugins { - modrinth("viaversion", "5.7.1") // ViaVersion - modrinth("viabackwards", "5.7.1") // ViaBackwards + modrinth("viaversion", "5.11.0") // ViaVersion + modrinth("viabackwards", "5.11.0") // ViaBackwards // The following plugins are intentionally outdated for testing purposes modrinth("djC8I9ui", "3.2.0") // LushRewards modrinth("discordsrv", "1.27.0") // DiscordSRV diff --git a/platform/paper-plugin/src/main/java/org/lushplugins/pluginupdater/paper/PaperUpdaterPlugin.java b/platform/paper-plugin/src/main/java/org/lushplugins/pluginupdater/paper/PaperUpdaterPlugin.java index ba4d42de..8c72554e 100644 --- a/platform/paper-plugin/src/main/java/org/lushplugins/pluginupdater/paper/PaperUpdaterPlugin.java +++ b/platform/paper-plugin/src/main/java/org/lushplugins/pluginupdater/paper/PaperUpdaterPlugin.java @@ -1,10 +1,13 @@ package org.lushplugins.pluginupdater.paper; +import net.kyori.adventure.text.logger.slf4j.ComponentLogger; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; import org.jspecify.annotations.NonNull; import org.lushplugins.pluginupdater.api.updater.PluginInfo; import org.lushplugins.pluginupdater.api.util.DownloadLogger; +import org.lushplugins.pluginupdater.api.util.UpdaterConstants; import org.lushplugins.pluginupdater.common.UpdaterImpl; import org.lushplugins.pluginupdater.common.collector.CommonPluginCollector; import org.lushplugins.pluginupdater.common.collector.ModrinthCollector; @@ -17,7 +20,6 @@ import org.lushplugins.pluginupdater.paper.collector.SpigotCollector; import org.lushplugins.pluginupdater.paper.command.PaperCommandHandler; import org.lushplugins.pluginupdater.paper.listener.PlayerListener; -import org.bukkit.plugin.java.JavaPlugin; import java.io.File; import java.io.InputStream; @@ -34,6 +36,7 @@ public final class PaperUpdaterPlugin extends JavaPlugin implements UpdaterPlugi public void onLoad() { PaperUpdater.populateRegistries(); plugin = this; + UpdaterConstants.LOGGER = getComponentLogger(); } @Override @@ -95,4 +98,9 @@ public InputStream getResourceStream(PluginInfo pluginInfo, String path) { public static PaperUpdaterPlugin getInstance() { return plugin; } + + @Override + public @NonNull ComponentLogger getComponentLogger() { + return super.getComponentLogger(); + } } diff --git a/platform/paper-plugin/src/main/java/org/lushplugins/pluginupdater/paper/collector/SpigotCollector.java b/platform/paper-plugin/src/main/java/org/lushplugins/pluginupdater/paper/collector/SpigotCollector.java index 0c532ac8..9bd032cb 100644 --- a/platform/paper-plugin/src/main/java/org/lushplugins/pluginupdater/paper/collector/SpigotCollector.java +++ b/platform/paper-plugin/src/main/java/org/lushplugins/pluginupdater/paper/collector/SpigotCollector.java @@ -5,19 +5,17 @@ import com.google.gson.JsonParser; import org.jetbrains.annotations.Nullable; import org.lushplugins.pluginupdater.api.source.type.SpigotSource; +import org.lushplugins.pluginupdater.api.updater.PluginData; import org.lushplugins.pluginupdater.api.updater.PluginInfo; +import org.lushplugins.pluginupdater.api.util.HttpUtil; import org.lushplugins.pluginupdater.common.UpdaterImpl; import org.lushplugins.pluginupdater.common.collector.PluginDataCollector; -import org.lushplugins.pluginupdater.api.updater.PluginData; -import org.lushplugins.pluginupdater.api.util.HttpUtil; -import org.lushplugins.pluginupdater.api.util.UpdaterConstants; import java.io.IOException; import java.net.http.HttpResponse; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.logging.Level; public record SpigotCollector(UpdaterImpl updater) implements PluginDataCollector { @@ -38,8 +36,12 @@ public List collect(Collection plugins) { HttpResponse response; try { response = HttpUtil.sendRequest(String.format("%s/search/resources/%s", SpigotSource.ENDPOINT.url(), unknownPlugin.getName())); - } catch (IOException | InterruptedException e) { - updater.updaterPlugin().getLogger().log(Level.WARNING, "Caught error whilst searching for project on spiget: ", e); + } catch (IOException e) { + updater.updaterPlugin().getComponentLogger().warn("Caught error whilst searching for project on spiget: ", e); + return null; + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + updater.updaterPlugin().getComponentLogger().warn("Caught error whilst searching for project on spiget: ", e); return null; } @@ -48,7 +50,7 @@ public List collect(Collection plugins) { } if (response.statusCode() != 200) { - updater.updaterPlugin().getLogger().log(Level.WARNING, "Received invalid response code (%s) whilst searching for project on spiget (%s)".formatted(response.statusCode(), response.uri())); + updater.updaterPlugin().getComponentLogger().warn("Received invalid response code ({}) whilst searching for project on spiget ({})", response.statusCode(), response.uri()); return null; } diff --git a/platform/paper-plugin/src/main/resources/common-plugins.yml b/platform/paper-plugin/src/main/resources/common-plugins.yml index 97d991d7..b38f981f 100644 --- a/platform/paper-plugin/src/main/resources/common-plugins.yml +++ b/platform/paper-plugin/src/main/resources/common-plugins.yml @@ -4,6 +4,7 @@ BannerMaker: BlueMap: source: modrinth modrinth-project-id: swbUV1cr + loaders: paper CarbonChat: source: modrinth modrinth-project-id: QzooIsZI diff --git a/platform/velocity-api/src/main/java/org/lushplugins/pluginupdater/velocity/api/VelocityUpdater.java b/platform/velocity-api/src/main/java/org/lushplugins/pluginupdater/velocity/api/VelocityUpdater.java index c865e2ea..c3ff178c 100644 --- a/platform/velocity-api/src/main/java/org/lushplugins/pluginupdater/velocity/api/VelocityUpdater.java +++ b/platform/velocity-api/src/main/java/org/lushplugins/pluginupdater/velocity/api/VelocityUpdater.java @@ -3,6 +3,7 @@ import com.velocitypowered.api.plugin.PluginContainer; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; +import net.kyori.adventure.text.logger.slf4j.ComponentLogger; import org.lushplugins.pluginupdater.api.source.SourceRegistry; import org.lushplugins.pluginupdater.api.source.type.GeyserSource; import org.lushplugins.pluginupdater.api.source.type.HangarSource; @@ -15,7 +16,6 @@ import org.lushplugins.pluginupdater.velocity.api.util.VelocityUtil; import java.util.List; -import java.util.logging.Logger; public class VelocityUpdater { private static boolean registriesPopulated = false; @@ -32,7 +32,7 @@ public static void populateRegistries(ProxyServer server) { SourceRegistry.register(new SpigotSource(null)); } - public static Updater.Builder builder(ProxyServer server, PluginContainer plugin, Logger logger) { + public static Updater.Builder builder(ProxyServer server, PluginContainer plugin, ComponentLogger logger) { populateRegistries(server); return Updater.builder(new VelocityUpdaterPlatform(server, logger), new VelocityPluginInfo(plugin, logger)) diff --git a/platform/velocity-api/src/main/java/org/lushplugins/pluginupdater/velocity/api/platform/VelocityUpdaterPlatform.java b/platform/velocity-api/src/main/java/org/lushplugins/pluginupdater/velocity/api/platform/VelocityUpdaterPlatform.java index a2cadf73..404882fd 100644 --- a/platform/velocity-api/src/main/java/org/lushplugins/pluginupdater/velocity/api/platform/VelocityUpdaterPlatform.java +++ b/platform/velocity-api/src/main/java/org/lushplugins/pluginupdater/velocity/api/platform/VelocityUpdaterPlatform.java @@ -4,6 +4,7 @@ import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.logger.slf4j.ComponentLogger; import net.kyori.adventure.text.minimessage.MiniMessage; import org.jetbrains.annotations.Nullable; import org.lushplugins.pluginupdater.api.platform.UpdaterPlatform; @@ -13,13 +14,12 @@ import java.util.Collection; import java.util.List; import java.util.Optional; -import java.util.logging.Logger; public class VelocityUpdaterPlatform implements UpdaterPlatform { private final ProxyServer server; - private final Logger logger; + private final ComponentLogger logger; - public VelocityUpdaterPlatform(ProxyServer server, Logger logger) { + public VelocityUpdaterPlatform(ProxyServer server, ComponentLogger logger) { this.server = server; this.logger = logger; } diff --git a/platform/velocity-api/src/main/java/org/lushplugins/pluginupdater/velocity/api/plugin/VelocityPluginInfo.java b/platform/velocity-api/src/main/java/org/lushplugins/pluginupdater/velocity/api/plugin/VelocityPluginInfo.java index 2c227ad5..f22cd035 100644 --- a/platform/velocity-api/src/main/java/org/lushplugins/pluginupdater/velocity/api/plugin/VelocityPluginInfo.java +++ b/platform/velocity-api/src/main/java/org/lushplugins/pluginupdater/velocity/api/plugin/VelocityPluginInfo.java @@ -1,15 +1,15 @@ package org.lushplugins.pluginupdater.velocity.api.plugin; import com.velocitypowered.api.plugin.PluginContainer; +import net.kyori.adventure.text.logger.slf4j.ComponentLogger; import org.jetbrains.annotations.Nullable; import org.lushplugins.pluginupdater.api.updater.PluginInfo; import org.lushplugins.pluginupdater.api.util.UpdaterConstants; import java.io.File; import java.nio.file.Path; -import java.util.logging.Logger; -public record VelocityPluginInfo(PluginContainer container, @Nullable Logger logger) implements PluginInfo { +public record VelocityPluginInfo(PluginContainer container, @Nullable ComponentLogger logger) implements PluginInfo { @Override public String getName() { @@ -28,7 +28,7 @@ public String getVersion() { } @Override - public Logger getLogger() { + public ComponentLogger getComponentLogger() { return logger != null ? logger : UpdaterConstants.LOGGER; } } diff --git a/platform/velocity-plugin/src/main/java/org/lushplugins/pluginupdater/velocity/VelocityUpdaterPlugin.java b/platform/velocity-plugin/src/main/java/org/lushplugins/pluginupdater/velocity/VelocityUpdaterPlugin.java index 16de2119..8d9bfb5f 100644 --- a/platform/velocity-plugin/src/main/java/org/lushplugins/pluginupdater/velocity/VelocityUpdaterPlugin.java +++ b/platform/velocity-plugin/src/main/java/org/lushplugins/pluginupdater/velocity/VelocityUpdaterPlugin.java @@ -9,8 +9,10 @@ import com.velocitypowered.api.plugin.annotation.DataDirectory; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; +import net.kyori.adventure.text.logger.slf4j.ComponentLogger; import org.lushplugins.pluginupdater.api.updater.PluginInfo; import org.lushplugins.pluginupdater.api.util.DownloadLogger; +import org.lushplugins.pluginupdater.api.util.UpdaterConstants; import org.lushplugins.pluginupdater.common.UpdaterImpl; import org.lushplugins.pluginupdater.common.collector.CommonPluginCollector; import org.lushplugins.pluginupdater.common.collector.ModrinthCollector; @@ -27,7 +29,6 @@ import java.io.InputStream; import java.nio.file.Path; import java.util.List; -import java.util.logging.Logger; @Plugin( id = "pluginupdater", @@ -38,13 +39,14 @@ public class VelocityUpdaterPlugin implements UpdaterPlugin { private static VelocityUpdaterPlugin instance; private final ProxyServer server; - private final Logger logger; + private final ComponentLogger logger; private final Path dataFolder; private UpdaterImpl updater; private VelocityUpdaterAPI api; @Inject - public VelocityUpdaterPlugin(ProxyServer server, Logger logger, @DataDirectory Path dataFolder) { + public VelocityUpdaterPlugin(ProxyServer server, ComponentLogger logger, @DataDirectory Path dataFolder) { + UpdaterConstants.LOGGER = logger; VelocityUpdater.populateRegistries(server); instance = this; @@ -113,7 +115,7 @@ public InputStream getResourceStream(PluginInfo pluginInfo, String path) { } @Override - public Logger getLogger() { + public ComponentLogger getComponentLogger() { return logger; } diff --git a/platform/velocity-plugin/src/test/java/org/lushplugins/pluginupdater/paper/test/VelocityUpdaterTests.java b/platform/velocity-plugin/src/test/java/org/lushplugins/pluginupdater/velocity/test/VelocityUpdaterTests.java similarity index 87% rename from platform/velocity-plugin/src/test/java/org/lushplugins/pluginupdater/paper/test/VelocityUpdaterTests.java rename to platform/velocity-plugin/src/test/java/org/lushplugins/pluginupdater/velocity/test/VelocityUpdaterTests.java index 0da1751a..7280f053 100644 --- a/platform/velocity-plugin/src/test/java/org/lushplugins/pluginupdater/paper/test/VelocityUpdaterTests.java +++ b/platform/velocity-plugin/src/test/java/org/lushplugins/pluginupdater/velocity/test/VelocityUpdaterTests.java @@ -1,4 +1,4 @@ -package org.lushplugins.pluginupdater.paper.test; +package org.lushplugins.pluginupdater.velocity.test; import org.junit.jupiter.api.Test; import org.lushplugins.pluginupdater.tests.commonplugins.CommonPluginsTest; diff --git a/tests/common-plugins-test/src/main/java/org/lushplugins/pluginupdater/tests/commonplugins/CommonPluginsTest.java b/tests/common-plugins-test/src/main/java/org/lushplugins/pluginupdater/tests/commonplugins/CommonPluginsTest.java index c29bd583..69becdbe 100644 --- a/tests/common-plugins-test/src/main/java/org/lushplugins/pluginupdater/tests/commonplugins/CommonPluginsTest.java +++ b/tests/common-plugins-test/src/main/java/org/lushplugins/pluginupdater/tests/commonplugins/CommonPluginsTest.java @@ -17,7 +17,6 @@ import java.util.Comparator; import java.util.List; import java.util.Objects; -import java.util.logging.Level; public class CommonPluginsTest { @@ -25,7 +24,7 @@ public class CommonPluginsTest { Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { StringWriter sw = new StringWriter(); throwable.printStackTrace(new PrintWriter(sw)); - UpdaterConstants.LOGGER.severe(sw.toString()); + UpdaterConstants.LOGGER.error(sw.toString()); }); } @@ -56,12 +55,11 @@ public static void runTest(String pluginsResource) { // We fetch all latest versions and then download all jars // This is to ensure that each process is handled in batches for (PluginData pluginData : undownloadedPluginData) { - cli.getLogger().info("Fetching %s's latest version" - .formatted(pluginData.pluginName())); + cli.getComponentLogger().info("Fetching {}'s latest version", pluginData.pluginName()); try { pluginData.latestVersion(pluginData.fetchLatestVersion().version()); } catch (RuntimeException e) { - cli.getLogger().severe(e.getMessage()); + cli.getComponentLogger().error(e.getMessage()); passing = false; } } @@ -70,8 +68,8 @@ public static void runTest(String pluginsResource) { for (PluginData pluginData : undownloadedPluginData) { try { pluginData.downloadUpdate(downloadDir); - } catch (Throwable e) { - cli.getLogger().log(Level.SEVERE, "Failed to download latest version of " + pluginData.pluginName(), e); + } catch (Exception e) { + cli.getComponentLogger().error("Failed to download latest version of {}", pluginData.pluginName(), e); passing = false; } } @@ -83,8 +81,7 @@ public static void runTest(String pluginsResource) { String pluginName = entry.getKey(); PluginInfo pluginInfo = platform.getPlugin(pluginName); if (pluginInfo == null) { - cli.getLogger().log(Level.WARNING, "Failed to find plugin jar for %s" - .formatted(pluginName)); + cli.getComponentLogger().warn("Failed to find plugin jar for {}", pluginName); return null; }