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 { 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 {

View file

@ -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);

View file

@ -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;
} }
} }

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 ] 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