feat: update checker
This commit is contained in:
parent
e7920dc313
commit
678d3135ca
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
24
src/main/java/me/theclashfruit/hubbit/utils/TabUtil.java
Normal file
24
src/main/java/me/theclashfruit/hubbit/utils/TabUtil.java
Normal 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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue