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 {
|
dependencies {
|
||||||
compileOnly 'io.papermc.paper:paper-api:1.19.4-R0.1-SNAPSHOT'
|
compileOnly 'io.papermc.paper:paper-api:1.19.4-R0.1-SNAPSHOT'
|
||||||
compileOnly 'me.clip:placeholderapi:2.11.3'
|
compileOnly 'me.clip:placeholderapi:2.11.3'
|
||||||
|
|
||||||
|
compileOnly 'com.github.zafarkhaja:java-semver:0.9.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
buildConfig {
|
buildConfig {
|
||||||
|
|
|
@ -16,6 +16,8 @@ public final class Hubbit extends JavaPlugin {
|
||||||
this.getCommand("hubbit").setExecutor(new InfoCommand());
|
this.getCommand("hubbit").setExecutor(new InfoCommand());
|
||||||
this.getCommand("servers").setExecutor(new MenuCommand());
|
this.getCommand("servers").setExecutor(new MenuCommand());
|
||||||
|
|
||||||
|
this.getCommand("hubbit").setTabCompleter(new me.theclashfruit.hubbit.utils.TabUtil());
|
||||||
|
|
||||||
// Register Events
|
// Register Events
|
||||||
this.getServer().getPluginManager().registerEvents(new MenuListener(), this);
|
this.getServer().getPluginManager().registerEvents(new MenuListener(), this);
|
||||||
this.getServer().getPluginManager().registerEvents(new PlayerActionsListener(), 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.Hubbit;
|
||||||
import me.theclashfruit.hubbit.utils.ConfigLoaderSingleton;
|
import me.theclashfruit.hubbit.utils.ConfigLoaderSingleton;
|
||||||
import me.theclashfruit.hubbit.utils.MessageFormatter;
|
import me.theclashfruit.hubbit.utils.MessageFormatter;
|
||||||
|
import me.theclashfruit.hubbit.utils.UpdateChecker;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.format.NamedTextColor;
|
import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
|
@ -30,9 +31,12 @@ import java.net.URL;
|
||||||
import java.net.URLConnection;
|
import java.net.URLConnection;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.stream.Collectors;
|
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;
|
import static org.bukkit.plugin.java.JavaPlugin.getPlugin;
|
||||||
|
|
||||||
public class InfoCommand implements CommandExecutor {
|
public class InfoCommand implements CommandExecutor {
|
||||||
|
@ -40,8 +44,12 @@ public class InfoCommand implements CommandExecutor {
|
||||||
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
|
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
|
||||||
Configuration mainConfig = getPlugin(Hubbit.class).getConfig();
|
Configuration mainConfig = getPlugin(Hubbit.class).getConfig();
|
||||||
|
|
||||||
|
if(args.length == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
switch (args[0]) {
|
switch (args[0]) {
|
||||||
case "about": {
|
case "about" -> {
|
||||||
sender.sendRichMessage(
|
sender.sendRichMessage(
|
||||||
"<dark_grey><strikethrough> </strikethrough></dark_grey> <aqua><bold>Hubbit</bold></aqua> <dark_grey><strikethrough> </strikethrough></dark_grey>" +
|
"<dark_grey><strikethrough> </strikethrough></dark_grey> <aqua><bold>Hubbit</bold></aqua> <dark_grey><strikethrough> </strikethrough></dark_grey>" +
|
||||||
"<newline>" +
|
"<newline>" +
|
||||||
|
@ -60,7 +68,7 @@ public class InfoCommand implements CommandExecutor {
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "reload": {
|
case "reload" -> {
|
||||||
Component reloadMessage = Component.text()
|
Component reloadMessage = Component.text()
|
||||||
.append(MiniMessage.miniMessage().deserialize(mainConfig.getString("messages.prefix")))
|
.append(MiniMessage.miniMessage().deserialize(mainConfig.getString("messages.prefix")))
|
||||||
.append(Component.text(" Successfully reloaded plugin!").style(style -> style.color(NamedTextColor.DARK_GREEN)))
|
.append(Component.text(" Successfully reloaded plugin!").style(style -> style.color(NamedTextColor.DARK_GREEN)))
|
||||||
|
@ -82,7 +90,7 @@ public class InfoCommand implements CommandExecutor {
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "update": {
|
case "update" -> {
|
||||||
Component waitingMessage = Component.text()
|
Component waitingMessage = Component.text()
|
||||||
.append(MiniMessage.miniMessage().deserialize(mainConfig.getString("messages.prefix")))
|
.append(MiniMessage.miniMessage().deserialize(mainConfig.getString("messages.prefix")))
|
||||||
.append(Component.text(" Checking for updates...").style(style -> style.color(NamedTextColor.GOLD)))
|
.append(Component.text(" Checking for updates...").style(style -> style.color(NamedTextColor.GOLD)))
|
||||||
|
@ -96,67 +104,48 @@ 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 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
|
// if the latest version is the same as the current version, send a message to the player
|
||||||
|
|
||||||
try {
|
int updateChecker = checkForUpdates();
|
||||||
URL modrinthApiUrl = new URL("https://api.modrinth.com/v2/project/odbu1Ij4/version");
|
|
||||||
|
|
||||||
HttpURLConnection apiGet = (HttpURLConnection) modrinthApiUrl.openConnection();
|
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)))
|
||||||
|
.build();
|
||||||
|
|
||||||
apiGet.setRequestProperty("User-Agent", "Hubbit/" + BuildConfig.VERSION + " (https://git.theclashfruit.me/TheClashFruit/Hubbit; Update Checker)");
|
sender.sendMessage(errorMessage);
|
||||||
|
}
|
||||||
|
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();
|
||||||
|
|
||||||
apiGet.connect();
|
sender.sendMessage(errorMessage);
|
||||||
|
}
|
||||||
int apiResponseCode = apiGet.getResponseCode();
|
case 2 -> {
|
||||||
|
|
||||||
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()
|
Component successMessage = Component.text()
|
||||||
.append(MiniMessage.miniMessage().deserialize(mainConfig.getString("messages.prefix")))
|
.append(MiniMessage.miniMessage().deserialize(mainConfig.getString("messages.prefix")))
|
||||||
.append(Component.text(" You are running the latest version!").style(style -> style.color(NamedTextColor.GREEN)))
|
.append(Component.text(" You are running the latest version!").style(style -> style.color(NamedTextColor.GREEN)))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
sender.sendMessage(successMessage);
|
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 {
|
case 3 -> {
|
||||||
Component errorMessage = Component.text()
|
Component successMessage = Component.text()
|
||||||
.append(MiniMessage.miniMessage().deserialize(mainConfig.getString("messages.prefix")))
|
.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)))
|
.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();
|
.build();
|
||||||
|
|
||||||
sender.sendMessage(errorMessage);
|
sender.sendMessage(successMessage);
|
||||||
}
|
}
|
||||||
} 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();
|
|
||||||
|
|
||||||
sender.sendMessage(errorMessage);
|
|
||||||
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
default: {
|
default -> {
|
||||||
return false;
|
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 ]
|
depend: [ PlaceholderAPI ]
|
||||||
|
|
||||||
|
libraries:
|
||||||
|
- com.github.zafarkhaja:java-semver:0.9.0
|
||||||
|
|
||||||
commands:
|
commands:
|
||||||
hubbit:
|
hubbit:
|
||||||
description: Main Administration Commands
|
description: Main Administration Commands
|
||||||
usage: /<command> <about|reload>
|
usage: /<command> <about|reload|update>
|
||||||
permission: hubbit.admin
|
permission: hubbit.admin
|
||||||
servers:
|
servers:
|
||||||
description: Server Menu
|
description: Server Menu
|
||||||
|
|
Loading…
Reference in a new issue