From 37326339650a28707e007998c8493f696d8e81fb Mon Sep 17 00:00:00 2001 From: BryanG <47282239+BryanGDv@users.noreply.github.com> Date: Sat, 10 Jun 2023 23:48:36 -0500 Subject: [PATCH] feat: create update check --- .../chatlab/listener/ServerLoadListener.java | 25 ++++ .../module/submodule/ListenerModule.java | 2 + .../update/UpdateAnnouncementType.java | 5 + .../bryang/chatlab/update/UpdateChecker.java | 129 ++++++++++++++++++ 4 files changed, 161 insertions(+) create mode 100644 plugin/src/main/java/me/bryang/chatlab/listener/ServerLoadListener.java create mode 100644 plugin/src/main/java/me/bryang/chatlab/update/UpdateAnnouncementType.java create mode 100644 plugin/src/main/java/me/bryang/chatlab/update/UpdateChecker.java diff --git a/plugin/src/main/java/me/bryang/chatlab/listener/ServerLoadListener.java b/plugin/src/main/java/me/bryang/chatlab/listener/ServerLoadListener.java new file mode 100644 index 0000000..8c8b78d --- /dev/null +++ b/plugin/src/main/java/me/bryang/chatlab/listener/ServerLoadListener.java @@ -0,0 +1,25 @@ +package me.bryang.chatlab.listener; + +import me.bryang.chatlab.update.UpdateChecker; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.server.ServerLoadEvent; + +import javax.inject.Inject; + +public class ServerLoadListener implements Listener { + + @Inject + private UpdateChecker updateChecker; + + @EventHandler + public void onLoad(ServerLoadEvent event){ + + if (updateChecker.enabledInAsync()){ + return; + } + + updateChecker.checkUpdate(); + } + +} diff --git a/plugin/src/main/java/me/bryang/chatlab/module/submodule/ListenerModule.java b/plugin/src/main/java/me/bryang/chatlab/module/submodule/ListenerModule.java index 90de4a8..9149c69 100644 --- a/plugin/src/main/java/me/bryang/chatlab/module/submodule/ListenerModule.java +++ b/plugin/src/main/java/me/bryang/chatlab/module/submodule/ListenerModule.java @@ -2,6 +2,7 @@ import me.bryang.chatlab.listener.PlayerChatListener; import me.bryang.chatlab.listener.PlayerRegistryListener; +import me.bryang.chatlab.listener.ServerLoadListener; import org.bukkit.event.Listener; import team.unnamed.inject.AbstractModule; @@ -13,6 +14,7 @@ public void configure() { .asSet() .to(PlayerRegistryListener.class) .to(PlayerChatListener.class) + .to(ServerLoadListener.class) .singleton(); } } diff --git a/plugin/src/main/java/me/bryang/chatlab/update/UpdateAnnouncementType.java b/plugin/src/main/java/me/bryang/chatlab/update/UpdateAnnouncementType.java new file mode 100644 index 0000000..b17810a --- /dev/null +++ b/plugin/src/main/java/me/bryang/chatlab/update/UpdateAnnouncementType.java @@ -0,0 +1,5 @@ +package me.bryang.chatlab.update; + +public enum UpdateAnnouncementType { + SERVER, CONSOLE, BOTH; +} diff --git a/plugin/src/main/java/me/bryang/chatlab/update/UpdateChecker.java b/plugin/src/main/java/me/bryang/chatlab/update/UpdateChecker.java new file mode 100644 index 0000000..6a98ac3 --- /dev/null +++ b/plugin/src/main/java/me/bryang/chatlab/update/UpdateChecker.java @@ -0,0 +1,129 @@ +package me.bryang.chatlab.update; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import me.bryang.chatlab.ChatLab; +import me.bryang.chatlab.configuration.ConfigurationContainer; +import me.bryang.chatlab.configuration.section.RootSection; +import org.slf4j.Logger; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.concurrent.atomic.AtomicReference; + +@Singleton +public class UpdateChecker { + + @Inject + private ChatLab plugin; + + @Inject + private ConfigurationContainer configContainer; + + @Inject + private Logger logger; + + private boolean isSent; + private boolean updated; + private String lastVersion; + private UpdateAnnouncementType updateAnnouncementType; + private final HttpClient httpClient = HttpClient.newHttpClient(); + + + public void init() { + + + RootSection rootSection = configContainer.get(); + AtomicReference jsonObject = new AtomicReference<>(); + + URI uri; + try { + uri = new URI("https://api.github.com/repos/DevBlook/ChatLab/releases/latest"); + + } catch (URISyntaxException exception) { + exception.fillInStackTrace(); + return; + } + + HttpRequest request = HttpRequest + .newBuilder() + .uri(uri) + .header("accept", "application/vnd.github+json") + .GET() + .build(); + + + httpClient + .sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenAccept(action -> { + + JsonElement jsonElement = JsonParser.parseString(action.body()); + + jsonObject.set(jsonElement.getAsJsonObject()); + + String selectedLatestVersion = jsonObject.get().get("tag_name").getAsString(); + + lastVersion = selectedLatestVersion; + updated = selectedLatestVersion.equalsIgnoreCase(plugin.getPluginMeta().getVersion()); + + try { + + updateAnnouncementType = UpdateAnnouncementType.valueOf( + rootSection.settings.updateAnnouncementType.toUpperCase()); + + } catch (IllegalArgumentException illegalArgumentException) { + updateAnnouncementType = UpdateAnnouncementType.CONSOLE; + + } + + if (!enabledInAsync()) { + return; + } + + checkUpdate(); + + + + }); + isSent = true; + } + + public void checkUpdate(){ + + + if (!announcementPresent(UpdateAnnouncementType.CONSOLE)){ + return; + } + + if (!isUpdated()) { + logger.info("The plugin has a new update. New version:" + lastVersion()); + logger.info("Download here: https://github.com/devblook/chatlab/releases/latest"); + + + } + + } + public String lastVersion() { + return lastVersion; + } + + public boolean isUpdated() { + return updated; + } + + public boolean announcementPresent(UpdateAnnouncementType selectedAnnouncementType) { + return (selectedAnnouncementType == updateAnnouncementType || updateAnnouncementType == UpdateAnnouncementType.BOTH); + } + public boolean enabledInAsync(){ + return isSent; + } + + + +}