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,27 +44,31 @@ 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>" +
|
||||||
"<newline>" +
|
"<newline>" +
|
||||||
"<grey>Version:</grey> <red>" + BuildConfig.VERSION + "</red>" +
|
"<grey>Version:</grey> <red>" + BuildConfig.VERSION + "</red>" +
|
||||||
"<newline>" +
|
"<newline>" +
|
||||||
"<grey>Build Date:</grey> <red>" + new Date(BuildConfig.BUILD_TIME) + "</red>" +
|
"<grey>Build Date:</grey> <red>" + new Date(BuildConfig.BUILD_TIME) + "</red>" +
|
||||||
"<newline>" +
|
"<newline>" +
|
||||||
"<grey>Author:</grey> <dark_aqua>TheClashFruit</dark_aqua>" +
|
"<grey>Author:</grey> <dark_aqua>TheClashFruit</dark_aqua>" +
|
||||||
"<newline>" +
|
"<newline>" +
|
||||||
"<grey>Source:</grey> <blue><click:open_url:https://git.theclashfruit.me/TheClashFruit/Hubbit>https://git.theclashfruit.me/TheClashFruit/Hubbit</click></blue>" +
|
"<grey>Source:</grey> <blue><click:open_url:https://git.theclashfruit.me/TheClashFruit/Hubbit>https://git.theclashfruit.me/TheClashFruit/Hubbit</click></blue>" +
|
||||||
"<newline>" +
|
"<newline>" +
|
||||||
"<newline>" +
|
"<newline>" +
|
||||||
"<dark_grey><strikethrough> </strikethrough></dark_grey>"
|
"<dark_grey><strikethrough> </strikethrough></dark_grey>"
|
||||||
);
|
);
|
||||||
|
|
||||||
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,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 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 -> {
|
||||||
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 {
|
|
||||||
Component errorMessage = Component.text()
|
Component errorMessage = 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(" 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);
|
sender.sendMessage(errorMessage);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
case 1 -> {
|
||||||
Component errorMessage = Component.text()
|
Component errorMessage = 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(" You are running an outdated version, the latest version is ").style(style -> style.color(NamedTextColor.RED)))
|
||||||
.build();
|
.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;
|
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