feat: 完成 gitlab 更新检测功能

This commit is contained in:
2024-03-18 15:48:52 +08:00
parent bcfbaab30c
commit d5077537ba

View File

@@ -2,6 +2,7 @@ package cn.hamster3.mc.plugin.core.common.util;
import cn.hamster3.mc.plugin.core.common.config.ConfigSection; import cn.hamster3.mc.plugin.core.common.config.ConfigSection;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.google.gson.JsonParser; import com.google.gson.JsonParser;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -26,29 +27,52 @@ public final class UpdateCheckUtils {
return; return;
} }
String checkType = config.getString("CHECK_TYPE", ""); String checkType = config.getString("CHECK_TYPE", "");
String baseUrl = config.getString("GIT_BASE_URL");
String gitRepo = config.getString("GIT_REPO");
String downloadUrl = config.getString("DOWNLOAD_URL");
if (baseUrl == null || gitRepo == null || downloadUrl == null) {
return;
}
try { try {
switch (checkType) { switch (checkType) {
case "GITEA_RELEASES": { case "GITEA_RELEASES": {
String baseUrl = config.getString("GIT_BASE_URL");
String gitRepo = config.getString("GIT_REPO");
String downloadUrl = config.getString("DOWNLOAD_URL");
if (baseUrl == null || gitRepo == null || downloadUrl == null) {
return;
}
String gitToken = config.getString("GIT_TOKEN"); String gitToken = config.getString("GIT_TOKEN");
String lastRelease = getGiteaLastRelease(baseUrl, gitRepo, gitToken); String lastRelease = getGiteaLastRelease(baseUrl, gitRepo, gitToken);
if (lastRelease == null) { if (lastRelease == null) {
break; break;
} }
if (lastRelease.compareToIgnoreCase(version) <= 0) {
break;
}
sender.sendMessage(String.format("§a插件 §l%s§a 发布了新版本 %s", pluginName, lastRelease)); sender.sendMessage(String.format("§a插件 §l%s§a 发布了新版本 %s", pluginName, lastRelease));
sender.sendMessage(String.format("§b下载链接: §n%s", downloadUrl)); sender.sendMessage(String.format("§b下载链接: §n%s", downloadUrl));
break; break;
} }
case "": { case "GITLAB_RELEASES": {
String baseUrl = config.getString("GIT_BASE_URL");
String gitRepo = config.getString("GIT_REPO");
String downloadUrl = config.getString("DOWNLOAD_URL");
if (baseUrl == null || gitRepo == null || downloadUrl == null) {
return;
}
String gitToken = config.getString("GIT_TOKEN");
int projectID = getGitlabProjectID(baseUrl, gitRepo, gitToken);
if (projectID < 0) {
break;
}
String lastRelease = getGitlabLastRelease(baseUrl, projectID, gitToken);
if (lastRelease == null) {
break;
}
if (lastRelease.compareToIgnoreCase(version) <= 0) {
break;
}
sender.sendMessage(String.format("§a插件 §l%s§a 发布了新版本 %s", pluginName, lastRelease));
sender.sendMessage(String.format("§b下载链接: §n%s", downloadUrl));
break; break;
} }
} }
} catch (IOException ignored) { } catch (Exception ignored) {
} }
} }
@@ -65,8 +89,12 @@ public final class UpdateCheckUtils {
try (InputStream stream = connection.getInputStream()) { try (InputStream stream = connection.getInputStream()) {
try (InputStreamReader reader = new InputStreamReader(stream, StandardCharsets.UTF_8)) { try (InputStreamReader reader = new InputStreamReader(stream, StandardCharsets.UTF_8)) {
JsonArray array = JSON_PARSER.parse(reader).getAsJsonArray(); JsonArray array = JSON_PARSER.parse(reader).getAsJsonArray();
if (array.size() >= 1) { for (JsonElement element : array) {
JsonObject object = array.get(0).getAsJsonObject(); JsonObject object = element.getAsJsonObject();
//noinspection SpellCheckingInspection
if (object.get("prerelease").getAsBoolean()) {
continue;
}
return object.get("name").getAsString(); return object.get("name").getAsString();
} }
} }
@@ -74,6 +102,45 @@ public final class UpdateCheckUtils {
return null; return null;
} }
public static int getGitlabProjectID(@NotNull String baseUrl, @NotNull String repo, @Nullable String token) throws IOException {
URL url = new URL("https://" + baseUrl + "/api/v4/projects?search=" + repo);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setRequestMethod("GET");
if (token != null) {
connection.setRequestProperty("PRIVATE-TOKEN", "token " + token);
}
connection.connect();
try (InputStream stream = connection.getInputStream()) {
try (InputStreamReader reader = new InputStreamReader(stream, StandardCharsets.UTF_8)) {
JsonArray array = JSON_PARSER.parse(reader).getAsJsonArray();
for (JsonElement element : array) {
JsonObject object = element.getAsJsonObject();
return object.get("id").getAsInt();
}
}
}
return -1;
}
@Nullable
public static String getGitlabLastRelease(@NotNull String baseUrl, int repo, @Nullable String token) throws IOException {
URL url = new URL(baseUrl + "/api/v4/projects/" + repo + "/releases/permalink/latest");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setRequestMethod("GET");
if (token != null) {
connection.setRequestProperty("Authorization", "token " + token);
}
connection.connect();
try (InputStream stream = connection.getInputStream()) {
try (InputStreamReader reader = new InputStreamReader(stream, StandardCharsets.UTF_8)) {
JsonObject object = JSON_PARSER.parse(reader).getAsJsonObject();
return object.get("name").getAsString();
}
}
}
public interface UpdateReceiver { public interface UpdateReceiver {
void sendMessage(@NotNull String message); void sendMessage(@NotNull String message);
} }