feat: update checker

This commit is contained in:
TheClashFruit 2023-06-15 21:02:42 +02:00
parent e7920dc313
commit 678d3135ca
Signed by: TheClashFruit
GPG key ID: CF4A319B9A73290C
14 changed files with 159 additions and 63 deletions

Binary file not shown.

View file

@ -28,6 +28,8 @@ repositories {
dependencies {
compileOnly 'io.papermc.paper:paper-api:1.19.4-R0.1-SNAPSHOT'
compileOnly 'me.clip:placeholderapi:2.11.3'
compileOnly 'com.github.zafarkhaja:java-semver:0.9.0'
}
buildConfig {

View file

@ -16,6 +16,8 @@ public final class Hubbit extends JavaPlugin {
this.getCommand("hubbit").setExecutor(new InfoCommand());
this.getCommand("servers").setExecutor(new MenuCommand());
this.getCommand("hubbit").setTabCompleter(new me.theclashfruit.hubbit.utils.TabUtil());
// Register Events
this.getServer().getPluginManager().registerEvents(new MenuListener(), this);
this.getServer().getPluginManager().registerEvents(new PlayerActionsListener(), this);

View file

@ -7,6 +7,7 @@ import me.theclashfruit.Hubbit.BuildConfig;
import me.theclashfruit.hubbit.Hubbit;
import me.theclashfruit.hubbit.utils.ConfigLoaderSingleton;
import me.theclashfruit.hubbit.utils.MessageFormatter;
import me.theclashfruit.hubbit.utils.UpdateChecker;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.minimessage.MiniMessage;
@ -30,9 +31,12 @@ import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import static me.theclashfruit.hubbit.utils.UpdateChecker.checkForUpdates;
import static me.theclashfruit.hubbit.utils.UpdateChecker.getLatestVersion;
import static org.bukkit.plugin.java.JavaPlugin.getPlugin;
public class InfoCommand implements CommandExecutor {
@ -40,27 +44,31 @@ public class InfoCommand implements CommandExecutor {
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
Configuration mainConfig = getPlugin(Hubbit.class).getConfig();
if(args.length == 0) {
return false;
}
switch (args[0]) {
case "about": {
case "about" -> {
sender.sendRichMessage(
"<dark_grey><strikethrough> </strikethrough></dark_grey> <aqua><bold>Hubbit</bold></aqua> <dark_grey><strikethrough> </strikethrough></dark_grey>" +
"<newline>" +
"<newline>" +
"<grey>Version:</grey> <red>" + BuildConfig.VERSION + "</red>" +
"<newline>" +
"<grey>Build Date:</grey> <red>" + new Date(BuildConfig.BUILD_TIME) + "</red>" +
"<newline>" +
"<grey>Author:</grey> <dark_aqua>TheClashFruit</dark_aqua>" +
"<newline>" +
"<grey>Source:</grey> <blue><click:open_url:https://git.theclashfruit.me/TheClashFruit/Hubbit>https://git.theclashfruit.me/TheClashFruit/Hubbit</click></blue>" +
"<newline>" +
"<newline>" +
"<dark_grey><strikethrough> </strikethrough></dark_grey>"
"<newline>" +
"<newline>" +
"<grey>Version:</grey> <red>" + BuildConfig.VERSION + "</red>" +
"<newline>" +
"<grey>Build Date:</grey> <red>" + new Date(BuildConfig.BUILD_TIME) + "</red>" +
"<newline>" +
"<grey>Author:</grey> <dark_aqua>TheClashFruit</dark_aqua>" +
"<newline>" +
"<grey>Source:</grey> <blue><click:open_url:https://git.theclashfruit.me/TheClashFruit/Hubbit>https://git.theclashfruit.me/TheClashFruit/Hubbit</click></blue>" +
"<newline>" +
"<newline>" +
"<dark_grey><strikethrough> </strikethrough></dark_grey>"
);
return true;
}
case "reload": {
case "reload" -> {
Component reloadMessage = Component.text()
.append(MiniMessage.miniMessage().deserialize(mainConfig.getString("messages.prefix")))
.append(Component.text(" Successfully reloaded plugin!").style(style -> style.color(NamedTextColor.DARK_GREEN)))
@ -82,7 +90,7 @@ public class InfoCommand implements CommandExecutor {
return true;
}
case "update": {
case "update" -> {
Component waitingMessage = Component.text()
.append(MiniMessage.miniMessage().deserialize(mainConfig.getString("messages.prefix")))
.append(Component.text(" Checking for updates...").style(style -> style.color(NamedTextColor.GOLD)))
@ -96,46 +104,10 @@ public class InfoCommand implements CommandExecutor {
// if the latest version is newer than the current version, send a message to the player
// if the latest version is the same as the current version, send a message to the player
try {
URL modrinthApiUrl = new URL("https://api.modrinth.com/v2/project/odbu1Ij4/version");
int updateChecker = checkForUpdates();
HttpURLConnection apiGet = (HttpURLConnection) modrinthApiUrl.openConnection();
apiGet.setRequestProperty("User-Agent", "Hubbit/" + BuildConfig.VERSION + " (https://git.theclashfruit.me/TheClashFruit/Hubbit; Update Checker)");
apiGet.connect();
int apiResponseCode = apiGet.getResponseCode();
String apiResponse = new BufferedReader(new InputStreamReader((InputStream) apiGet.getContent(), StandardCharsets.UTF_8)).lines().collect(Collectors.joining("\n"));
getPlugin(Hubbit.class).getLogger().info(apiResponse);
Object apiResponseObject = new JSONParser().parse(apiResponse);
if(apiResponseCode == 200) {
JSONArray apiResponseJson = (JSONArray) apiResponseObject;
JSONObject versionObject = (JSONObject) apiResponseJson.get(0);
if(Objects.equals(versionObject.get("version_number"), BuildConfig.VERSION)) {
Component successMessage = Component.text()
.append(MiniMessage.miniMessage().deserialize(mainConfig.getString("messages.prefix")))
.append(Component.text(" You are running the latest version!").style(style -> style.color(NamedTextColor.GREEN)))
.build();
sender.sendMessage(successMessage);
} else {
Component errorMessage = Component.text()
.append(MiniMessage.miniMessage().deserialize(mainConfig.getString("messages.prefix")))
.append(Component.text(" You are running an outdated version, the latest version is ").style(style -> style.color(NamedTextColor.RED)))
.append(Component.text(versionObject.get("version_number").toString()).style(style -> style.color(NamedTextColor.GRAY)))
.append(Component.text(". Please update!").style(style -> style.color(NamedTextColor.RED)))
.build();
sender.sendMessage(errorMessage);
}
} else {
switch (updateChecker) {
case 0 -> {
Component errorMessage = Component.text()
.append(MiniMessage.miniMessage().deserialize(mainConfig.getString("messages.prefix")))
.append(Component.text(" There was an error trying to get the latest version from Modrinth.").style(style -> style.color(NamedTextColor.RED)))
@ -143,20 +115,37 @@ public class InfoCommand implements CommandExecutor {
sender.sendMessage(errorMessage);
}
} catch (Exception e) {
Component errorMessage = Component.text()
.append(MiniMessage.miniMessage().deserialize(mainConfig.getString("messages.prefix")))
.append(Component.text(" There was an error trying to get the latest version from Modrinth.").style(style -> style.color(NamedTextColor.RED)))
.build();
case 1 -> {
Component errorMessage = Component.text()
.append(MiniMessage.miniMessage().deserialize(mainConfig.getString("messages.prefix")))
.append(Component.text(" You are running an outdated version, the latest version is ").style(style -> style.color(NamedTextColor.RED)))
.append(Component.text(getLatestVersion()).style(style -> style.color(NamedTextColor.GRAY)))
.append(Component.text(". Please update!").style(style -> style.color(NamedTextColor.RED)))
.build();
sender.sendMessage(errorMessage);
sender.sendMessage(errorMessage);
}
case 2 -> {
Component successMessage = Component.text()
.append(MiniMessage.miniMessage().deserialize(mainConfig.getString("messages.prefix")))
.append(Component.text(" You are running the latest version!").style(style -> style.color(NamedTextColor.GREEN)))
.build();
throw new RuntimeException(e);
sender.sendMessage(successMessage);
}
case 3 -> {
Component successMessage = Component.text()
.append(MiniMessage.miniMessage().deserialize(mainConfig.getString("messages.prefix")))
.append(Component.text(" Ooo! This version isn't on Modrinth! Are you perhaps developing a new version? wow!").style(style -> style.color(NamedTextColor.GOLD)))
.build();
sender.sendMessage(successMessage);
}
}
return true;
}
default: {
default -> {
return false;
}
}

View file

@ -0,0 +1,24 @@
package me.theclashfruit.hubbit.utils;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
public class TabUtil implements TabCompleter {
@Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
List<String> list = new ArrayList<>();
list.add("about");
list.add("reload");
list.add("update");
return list;
}
}

View file

@ -0,0 +1,76 @@
package me.theclashfruit.hubbit.utils;
import com.github.zafarkhaja.semver.Version;
import me.theclashfruit.Hubbit.BuildConfig;
import me.theclashfruit.hubbit.Hubbit;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class UpdateChecker {
public static int checkForUpdates() {
try {
Object apiResponseObject = new JSONParser().parse(apiRequest());
JSONArray apiResponseJson = (JSONArray) apiResponseObject;
List<Version> versions = new ArrayList<>();
apiResponseJson.forEach(versionObject -> {
versions.add(Version.valueOf(((JSONObject) versionObject).get("version_number").toString()));
});
Version pluginVersion = Version.valueOf(BuildConfig.VERSION);
if (versions.get(0).greaterThan(pluginVersion)) {
return 1;
} else if (versions.get(0).equals(pluginVersion)) {
return 2;
} else if (versions.get(0).lessThan(pluginVersion)) {
return 3;
} else {
return 0;
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static String getLatestVersion() {
try {
Object apiResponseObject = new JSONParser().parse(apiRequest());
JSONArray apiResponseJson = (JSONArray) apiResponseObject;
return ((JSONObject) apiResponseJson.get(0)).get("version_number").toString();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static String apiRequest() {
try {
URL modrinthApiUrl = new URL("https://api.modrinth.com/v2/project/odbu1Ij4/version");
HttpURLConnection apiGet = (HttpURLConnection) modrinthApiUrl.openConnection();
apiGet.setRequestProperty("User-Agent", "Hubbit/" + BuildConfig.VERSION + " (https://git.theclashfruit.me/TheClashFruit/Hubbit; Update Checker)");
apiGet.connect();
if(apiGet.getResponseCode() == 200)
return new BufferedReader(new InputStreamReader((InputStream) apiGet.getContent(), StandardCharsets.UTF_8)).lines().collect(Collectors.joining("\n"));
} catch (Exception e) {
throw new RuntimeException(e);
}
return null;
}
}

View file

@ -10,10 +10,13 @@ website: theclashfruit.me
depend: [ PlaceholderAPI ]
libraries:
- com.github.zafarkhaja:java-semver:0.9.0
commands:
hubbit:
description: Main Administration Commands
usage: /<command> <about|reload>
usage: /<command> <about|reload|update>
permission: hubbit.admin
servers:
description: Server Menu