Skip to content

Commit 199d8cf

Browse files
authored
Merge pull request #10 from TheNextLvl-net/drop-hangar4j
Drop hangar4j
2 parents b7beb70 + 7e717db commit 199d8cf

File tree

12 files changed

+174
-89
lines changed

12 files changed

+174
-89
lines changed

paper/build.gradle.kts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ version = "1.4.1"
1616

1717
repositories {
1818
mavenCentral()
19-
maven("https://jitpack.io")
2019
maven("https://repo.papermc.io/repository/maven-public/")
2120
maven("https://s01.oss.sonatype.org/content/repositories/snapshots/")
2221
}
@@ -27,7 +26,6 @@ dependencies {
2726
compileOnly(project(":annotations"))
2827

2928
api(project(":version-checker"))
30-
api("com.github.xmrafonso:hangar4j:1.2.2")
3129

3230
annotationProcessor("org.projectlombok:lombok:1.18.34")
3331
}

paper/src/main/java/core/paper/command/CoreArgumentTypes.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class CoreArgumentTypes {
2323
Arrays.stream(Bukkit.getOfflinePlayers())
2424
.map(OfflinePlayer::getName)
2525
.filter(Objects::nonNull)
26+
.filter(s -> s.contains(builder.getRemaining()))
2627
.forEach(builder::suggest);
2728
return builder.buildFuture();
2829
});
@@ -35,6 +36,7 @@ class CoreArgumentTypes {
3536
}, (context, builder) -> {
3637
Bukkit.getOnlinePlayers().stream()
3738
.map(Player::getName)
39+
.filter(s -> s.contains(builder.getRemaining()))
3840
.forEach(builder::suggest);
3941
return builder.buildFuture();
4042
});
@@ -47,6 +49,7 @@ class CoreArgumentTypes {
4749
}, (context, builder) -> {
4850
Bukkit.getOnlinePlayers().stream()
4951
.map(Player::getName)
52+
.filter(s -> s.contains(builder.getRemaining()))
5053
.forEach(builder::suggest);
5154
return builder.buildFuture();
5255
});

paper/src/main/java/core/paper/command/CustomArgumentTypes.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import org.bukkit.entity.Player;
66

77
public final class CustomArgumentTypes {
8-
98
public static ArgumentType<OfflinePlayer> cachedOfflinePlayer() {
109
return CoreArgumentTypes.offlinePlayer;
1110
}

paper/src/main/java/core/paper/version/PaperHangarVersionChecker.java

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@
44
import core.annotation.MethodsReturnNotNullByDefault;
55
import core.annotation.ParametersAreNotNullByDefault;
66
import core.annotation.TypesAreNotNullByDefault;
7-
import core.version.HangarVersionChecker;
87
import core.version.Version;
9-
import me.mrafonso.hangar4j.impl.Platform;
10-
import me.mrafonso.hangar4j.impl.version.HangarVersion;
8+
import core.version.hangar.HangarVersion;
9+
import core.version.hangar.HangarVersionChecker;
10+
import core.version.hangar.Platform;
11+
import lombok.Getter;
1112
import org.bukkit.Bukkit;
13+
import org.bukkit.plugin.Plugin;
14+
15+
import java.util.Objects;
1216

1317
/**
1418
* The PaperHangarVersionChecker class is an abstract class that provides methods
@@ -21,8 +25,35 @@
2125
@MethodsReturnNotNullByDefault
2226
@ParametersAreNotNullByDefault
2327
public abstract class PaperHangarVersionChecker<V extends Version> extends HangarVersionChecker<V> {
24-
public PaperHangarVersionChecker(String slug) {
28+
private final @Getter V versionRunning;
29+
private final @Getter String author;
30+
private final Plugin plugin;
31+
32+
@SuppressWarnings("UnstableApiUsage")
33+
public PaperHangarVersionChecker(Plugin plugin, String author, String slug) {
2534
super(slug);
35+
this.versionRunning = Objects.requireNonNull(
36+
parseVersion(plugin.getPluginMeta().getVersion()),
37+
"Failed to parse plugin version running"
38+
);
39+
this.author = author;
40+
this.plugin = plugin;
41+
}
42+
43+
public void checkVersion() {
44+
retrieveLatestSupportedVersion().thenAccept(version -> {
45+
var logger = plugin.getComponentLogger();
46+
if (version.equals(versionRunning)) {
47+
logger.info("You are running the latest version of {}", plugin.getName());
48+
} else if (version.compareTo(versionRunning) > 0) {
49+
logger.warn("An update for {} is available", plugin.getName());
50+
logger.warn("You are running version {}, the latest supported version is {}", versionRunning, version);
51+
logger.warn("Update at https://hangar.papermc.io/{}/{}", author, getSlug());
52+
} else logger.warn("You are running a snapshot version of {}", plugin.getName());
53+
}).exceptionally(throwable -> {
54+
plugin.getComponentLogger().error("Version check failed", throwable);
55+
return null;
56+
});
2657
}
2758

2859
@Override

version-checker/build.gradle.kts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,14 @@ version = "1.0.1"
1616

1717
repositories {
1818
mavenCentral()
19-
maven("https://jitpack.io")
2019
}
2120

2221
dependencies {
2322
compileOnly("org.projectlombok:lombok:1.18.34")
2423
compileOnly("org.jetbrains:annotations:24.1.0")
2524
compileOnly(project(":annotations"))
2625

27-
api("com.github.xmrafonso:hangar4j:1.2.2")
26+
api("com.google.code.gson:gson:2.11.0")
2827

2928
testImplementation(platform("org.junit:junit-bom:5.10.0"))
3029
testImplementation("org.junit.jupiter:junit-jupiter")

version-checker/src/main/java/core/version/HangarVersionChecker.java

Lines changed: 0 additions & 58 deletions
This file was deleted.

version-checker/src/main/java/core/version/SemanticVersion.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,13 @@ public record SemanticVersion(int major, int minor, int patch, @Nullable String
2626
* @param string the version string to parse
2727
* @return the parsed SemanticVersion object, or null if it is not a valid SemVer
2828
*/
29-
public static @Nullable SemanticVersion parse(String string) {
30-
try {
31-
if (!string.matches(PATTERN)) return null;
32-
var parts = string.split("-", 2);
33-
var split = parts[0].split("\\.", 3);
34-
var major = Integer.parseInt(split[0]);
35-
var minor = Integer.parseInt(split[1]);
36-
var patch = Integer.parseInt(split[2]);
37-
return new SemanticVersion(major, minor, patch, parts.length == 2 ? parts[1] : null);
38-
} catch (Exception ignored) {
39-
return null;
40-
}
29+
public static SemanticVersion parse(String string) {
30+
var parts = string.split("-", 2);
31+
var split = parts[0].split("\\.", 3);
32+
var major = Integer.parseInt(split[0]);
33+
var minor = Integer.parseInt(split[1]);
34+
var patch = Integer.parseInt(split[2]);
35+
return new SemanticVersion(major, minor, patch, parts.length == 2 ? parts[1] : null);
4136
}
4237

4338
/**
Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package core.version;
22

3-
import org.jetbrains.annotations.Nullable;
3+
import org.jetbrains.annotations.Unmodifiable;
44

5-
import java.util.Optional;
6-
import java.util.function.Consumer;
5+
import java.util.Set;
6+
import java.util.concurrent.CompletableFuture;
77

88
public interface VersionChecker<N, V extends Version> {
99
/**
@@ -17,18 +17,16 @@ public interface VersionChecker<N, V extends Version> {
1717
* Parses a version of type N into a version of type V.
1818
*
1919
* @param version the version to parse
20-
* @return the parsed version of type V, or null if parsing fails
20+
* @return the parsed version of type V
2121
*/
22-
@Nullable
2322
V parseVersion(N version);
2423

2524
/**
2625
* Parses a version of type String into a version of type V.
2726
*
2827
* @param version the version to parse
29-
* @return the parsed version of type V, or null if parsing fails
28+
* @return the parsed version of type V
3029
*/
31-
@Nullable
3230
V parseVersion(String version);
3331

3432
/**
@@ -40,9 +38,23 @@ public interface VersionChecker<N, V extends Version> {
4038
boolean isSupported(N version);
4139

4240
/**
43-
* Retrieves the latest supported version of the software and passes it to the provided success {@link Consumer}.
41+
* Asynchronously retrieves the latest available version.
4442
*
45-
* @param success the consumer that will receive the latest supported version wrapped in an {@link Optional}.
43+
* @return a CompletableFuture containing the latest version
4644
*/
47-
void retrieveLatestSupportedVersion(Consumer<Optional<V>> success);
45+
CompletableFuture<V> retrieveLatestVersion();
46+
47+
/**
48+
* Retrieves all available versions asynchronously.
49+
*
50+
* @return a CompletableFuture containing a Set of all versions
51+
*/
52+
CompletableFuture<@Unmodifiable Set<V>> retrieveVersions();
53+
54+
/**
55+
* Retrieves the latest supported version of the software asynchronously.
56+
*
57+
* @return a CompletableFuture containing the latest supported version
58+
*/
59+
CompletableFuture<V> retrieveLatestSupportedVersion();
4860
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package core.version.hangar;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
6+
public record HangarVersion(String name, String author, Map<Platform, List<String>> platformDependencies) {
7+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package core.version.hangar;
2+
3+
import com.google.gson.Gson;
4+
import core.annotation.FieldsAreNotNullByDefault;
5+
import core.annotation.MethodsReturnNotNullByDefault;
6+
import core.annotation.ParametersAreNotNullByDefault;
7+
import core.annotation.TypesAreNotNullByDefault;
8+
import core.version.Version;
9+
import core.version.VersionChecker;
10+
import lombok.Getter;
11+
import lombok.RequiredArgsConstructor;
12+
import org.jetbrains.annotations.Unmodifiable;
13+
14+
import java.net.URI;
15+
import java.net.http.HttpClient;
16+
import java.net.http.HttpRequest;
17+
import java.net.http.HttpResponse;
18+
import java.util.Set;
19+
import java.util.concurrent.CompletableFuture;
20+
import java.util.stream.Collectors;
21+
22+
/**
23+
* The HangarVersionChecker class is an abstract class that provides methods
24+
* for retrieving and checking the latest supported version of a specific component in a hangar project.
25+
*
26+
* @param <V> the type parameter for the version
27+
*/
28+
@Getter
29+
@RequiredArgsConstructor
30+
@TypesAreNotNullByDefault
31+
@FieldsAreNotNullByDefault
32+
@MethodsReturnNotNullByDefault
33+
@ParametersAreNotNullByDefault
34+
public abstract class HangarVersionChecker<V extends Version> implements VersionChecker<HangarVersion, V> {
35+
private static final String API_URL = "https://hangar.papermc.io/api/v1";
36+
private static final HttpClient client = HttpClient.newBuilder()
37+
.version(HttpClient.Version.HTTP_1_1)
38+
.build();
39+
private static final Gson gson = new Gson();
40+
41+
/**
42+
* The slug of the project.
43+
*/
44+
private final String slug;
45+
46+
@Override
47+
public CompletableFuture<V> retrieveLatestVersion() {
48+
return get("/projects/" + getSlug() + "/latestrelease")
49+
.thenApply(HttpResponse::body)
50+
.thenApply(this::parseVersion);
51+
}
52+
53+
@Override
54+
public CompletableFuture<@Unmodifiable Set<V>> retrieveVersions() {
55+
return retrieveHangarVersions().thenApply(versions -> versions.stream()
56+
.map(this::parseVersion)
57+
.collect(Collectors.toUnmodifiableSet()));
58+
}
59+
60+
@Override
61+
public CompletableFuture<V> retrieveLatestSupportedVersion() {
62+
return retrieveHangarVersions().thenApply(versions -> versions.stream()
63+
.filter(this::isSupported)
64+
.map(this::parseVersion)
65+
.max(Version::compareTo)
66+
.orElseThrow());
67+
}
68+
69+
@Override
70+
public V parseVersion(HangarVersion version) {
71+
return parseVersion(version.name());
72+
}
73+
74+
public final CompletableFuture<Set<HangarVersion>> retrieveHangarVersions() {
75+
return get("/projects/" + getSlug() + "/versions")
76+
.thenApply(response -> gson.fromJson(response.body(), HangarVersions.class))
77+
.thenApply(HangarVersions::result);
78+
}
79+
80+
private CompletableFuture<HttpResponse<String>> get(String path) {
81+
return client.sendAsync(HttpRequest.newBuilder()
82+
.uri(URI.create(API_URL + path))
83+
.build(),
84+
HttpResponse.BodyHandlers.ofString());
85+
}
86+
}

0 commit comments

Comments
 (0)