Skip to content

Commit f1354d5

Browse files
committed
Update relauncher & the forge notification system
Signed-off-by: KiriCattus <19393068+KiriCattus@users.noreply.github.com>
1 parent 4b4fdd5 commit f1354d5

9 files changed

Lines changed: 205 additions & 367 deletions

File tree

relauncher

Submodule relauncher updated 46 files

src/commander/java/com/mcmoddev/mmdbot/commander/updatenotifiers/forge/ForgeUpdateNotifier.java

Lines changed: 79 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -24,132 +24,139 @@
2424
import com.mcmoddev.mmdbot.commander.updatenotifiers.SharedVersionHelpers;
2525
import com.mcmoddev.mmdbot.commander.updatenotifiers.UpdateNotifier;
2626
import com.mcmoddev.mmdbot.commander.util.StringSerializer;
27+
import com.mcmoddev.mmdbot.core.util.Utils;
2728
import net.dv8tion.jda.api.EmbedBuilder;
28-
import net.dv8tion.jda.api.utils.MarkdownUtil;
29+
import net.dv8tion.jda.api.entities.MessageEmbed;
2930
import org.jetbrains.annotations.NotNull;
3031

3132
import javax.annotation.Nullable;
32-
import java.awt.Color;
3333
import java.io.IOException;
3434
import java.net.URL;
3535
import java.nio.charset.StandardCharsets;
36+
import java.util.Map;
37+
import java.util.Objects;
3638

37-
/**
38-
* The Forge update notifier.
39-
*
40-
* @author Antoine Gagnon
41-
* @author matyrobbrt
42-
*/
43-
public final class ForgeUpdateNotifier extends UpdateNotifier<MinecraftForgeVersion> {
39+
public final class ForgeUpdateNotifier extends UpdateNotifier<MinecraftForgeVersions> {
4440

4541
/**
4642
* The changelog URL template
4743
*/
48-
private static final String CHANGELOG_URL_TEMPLATE
49-
= "https://maven.minecraftforge.net/net/minecraftforge/forge/%1$s-%2$s/forge-%1$s-%2$s-changelog.txt";
44+
private static final String CHANGELOG_URL = "https://maven.minecraftforge.net/net/minecraftforge/forge/%1$s-%2$s/forge-%1$s-%2$s-changelog.txt";
5045

5146
public ForgeUpdateNotifier() {
52-
super(NotifierConfiguration.<MinecraftForgeVersion>builder()
47+
super(NotifierConfiguration.<MinecraftForgeVersions>builder()
5348
.name("forge")
5449
.channelGetter(Configuration.Channels.UpdateNotifiers::forge)
50+
.serializer(StringSerializer.json(StringSerializer.RECORD_GSON, MinecraftForgeVersions.class))
5551
.versionComparator(NotifierConfiguration.notEqual())
56-
.serializer(StringSerializer.json(StringSerializer.RECORD_GSON, MinecraftForgeVersion.class))
5752
.webhookInfo(new WebhookInfo("Forge Updates", "https://media.discordapp.net/attachments/957353544493719632/1006125547430096966/unknown.png"))
5853
.build());
5954
}
6055

6156
@Override
62-
protected @NotNull MinecraftForgeVersion queryLatest() throws IOException {
63-
return ForgeVersionHelper.getLatestMcVersionForgeVersions();
57+
protected @NotNull MinecraftForgeVersions queryLatest() {
58+
return new MinecraftForgeVersions(ForgeVersionHelper.getForgeVersions());
6459
}
6560

6661
@NotNull
6762
@Override
68-
protected EmbedBuilder getEmbed(@Nullable final MinecraftForgeVersion oldVersion, final @NotNull MinecraftForgeVersion newVersion) {
63+
protected EmbedBuilder getEmbed(@Nullable final MinecraftForgeVersions oldVersion, final MinecraftForgeVersions newVersion) {
64+
final String version;
65+
if (oldVersion == null) {
66+
version = newVersion.byMcVersion().entrySet().stream()
67+
.max(Map.Entry.comparingByKey())
68+
.orElseThrow()
69+
.getValue();
70+
} else {
71+
version = newVersion.byMcVersion().entrySet().stream()
72+
.filter(entry -> !Objects.equals(oldVersion.byMcVersion().get(entry.getKey()), entry.getValue()))
73+
.max(Map.Entry.comparingByKey())
74+
.orElseThrow()
75+
.getValue();
76+
}
77+
78+
final String mcVersion = version.split("-")[0];
79+
6980
final var embed = new EmbedBuilder();
70-
embed.addField("Minecraft Version", newVersion.mcVersion(), true);
81+
embed.addField("Minecraft Version", mcVersion, true);
7182
embed.setTitle("Forge version update");
72-
embed.setColor(Color.ORANGE);
83+
embed.setColor(0x0000FF);
7384

74-
final var mcVersion = newVersion.mcVersion();
75-
final var latest = newVersion.forgeVersion();
85+
final String oldForgeVersionFull = oldVersion == null ? null : oldVersion.byMcVersion().get(mcVersion);
86+
if (oldForgeVersionFull == null) {
87+
embed.addField("Version", version, true);
88+
} else {
89+
boolean isNoLongerBeta = isNoLongerBeta(oldForgeVersionFull, version);
7690

77-
if (oldVersion == null || !oldVersion.mcVersion().equals(newVersion.mcVersion())) {
78-
embed.addField("Version", latest.getLatest(), true);
79-
addChangelog(embed, mcVersion, latest.getLatest(), mcVersion, latest.getLatest());
80-
return embed;
91+
embed.addField(isNoLongerBeta ? "New stable release" : "Latest", "**%s** -> **%s**".formatted(oldForgeVersionFull, version), true);
8192
}
8293

83-
final var lastForgeVersions = oldVersion.forgeVersion();
84-
if (latest.getLatest() != null && !lastForgeVersions.getLatest().equals(latest.getLatest())) {
85-
final var start = lastForgeVersions.getLatest();
86-
final var end = latest.getLatest();
87-
embed.addField("Latest", String.format("**%s** -> **%s**%n", start, end), true);
88-
addChangelog(embed, mcVersion, start, mcVersion, end);
89-
}
94+
addChangelog(embed, oldForgeVersionFull, version);
95+
96+
return embed;
97+
}
9098

91-
if (latest.getRecommended() != null) {
92-
if (lastForgeVersions.getRecommended() == null) {
93-
final var version = latest.getRecommended();
94-
embed.addField("Recommended", String.format("*none* -> **%s**%n", version),
95-
true);
96-
embed.setDescription(MarkdownUtil.maskedLink("Changelog", String.format(CHANGELOG_URL_TEMPLATE,
97-
mcVersion, latest.getRecommended())));
98-
} else if (!latest.getRecommended().equals(lastForgeVersions.getRecommended())) {
99-
final var start = lastForgeVersions.getRecommended();
100-
final var end = latest.getRecommended();
101-
embed.addField("Recommended", String.format("**%s** -> **%s**%n", start, end), true);
102-
addChangelog(embed, mcVersion, start, mcVersion, end);
99+
private static boolean isNoLongerBeta(String oldForgeVersionFull, String newForgeVersionFull) {
100+
try {
101+
final String oldForgeVersion = oldForgeVersionFull.substring(oldForgeVersionFull.indexOf('-') + 1);
102+
final String newForgeVersion = newForgeVersionFull.substring(newForgeVersionFull.indexOf('-') + 1);
103+
104+
final String[] oldVersionParts = oldForgeVersion.split("\\.");
105+
final String[] newVersionParts = newForgeVersion.split("\\.");
106+
107+
if (oldVersionParts.length > 1 && newVersionParts.length > 1) {
108+
// The second part of the version number indicates beta status. '0' is beta.
109+
boolean wasBeta = oldVersionParts[1].equals("0");
110+
boolean isNowStable = !newVersionParts[1].equals("0");
111+
return wasBeta && isNowStable;
103112
}
113+
} catch (Exception e) {
114+
// If any parsing error occurs (e.g., unexpected version format),
115+
// safely assume it's not a beta-to-stable transition.
116+
return false;
104117
}
105-
return embed;
118+
return false;
106119
}
107120

108-
private static void addChangelog(EmbedBuilder embedBuilder, String mcStart, String forgeStart, String mcEnd, String forgeEnd) {
121+
private static void addChangelog(EmbedBuilder embedBuilder, @Nullable String forgeStart, String forgeEnd) {
109122
try {
110123
String changelog = getChangelogBetweenVersions(
111-
mcStart, forgeStart, mcEnd, forgeEnd
124+
forgeStart, forgeEnd
112125
);
113126
if (changelog.isBlank()) return;
114127

115-
changelog = SharedVersionHelpers.replaceGitHubReferences(changelog, "MinecraftForge/MinecraftForge");
128+
changelog = SharedVersionHelpers.replaceGitHubReferences(changelog, "MinecraftForge/Forge");
116129

117-
embedBuilder.setDescription("""
130+
embedBuilder.setDescription(Utils.truncate("""
118131
[Changelog](%s):
119132
%s
120133
""".formatted(
121-
CHANGELOG_URL_TEMPLATE.formatted(mcEnd, forgeEnd), changelog
122-
));
134+
CHANGELOG_URL.formatted(forgeEnd), changelog
135+
), MessageEmbed.DESCRIPTION_MAX_LENGTH));
123136
} catch (IOException ignored) {
124137
}
125138
}
126139

127-
public static String getChangelogBetweenVersions(final String startMc, final String startForge, final String endMc, final String endForge) throws IOException {
128-
final var startUrl = new URL(CHANGELOG_URL_TEMPLATE.formatted(startMc, startForge));
129-
final var endUrl = new URL(CHANGELOG_URL_TEMPLATE.formatted(endMc, endForge));
140+
public static String getChangelogBetweenVersions(@Nullable final String forgeStart, final String forgeEnd) throws IOException {
141+
if (forgeStart == null || forgeStart.equals(forgeEnd)) {
142+
final String[] split = getUrlAsString(new URL(CHANGELOG_URL.formatted(forgeEnd))).split("\n");
143+
final StringBuilder changelog = new StringBuilder(split[0])
144+
.append('\n');
145+
for (int i = 1; i < split.length; i++) {
146+
// new version detected
147+
if (split[i].startsWith(" - ")) break;
148+
changelog.append(split[i]).append('\n');
149+
}
150+
return changelog.toString();
151+
}
130152

131-
final var startMcVersionSplit = startMc.split("\\.");
132-
final var startForgeVersionSplit = startForge.split("\\.");
133-
final var startChangelog = getUrlAsString(startUrl).replace("""
134-
%s.%s.x Changelog
135-
%s.%s
136-
====""".formatted(startMcVersionSplit[0], startMcVersionSplit[1], startForgeVersionSplit[0], startForgeVersionSplit[1]), "");
153+
final var startUrl = new URL(CHANGELOG_URL.formatted(forgeStart));
154+
final var endUrl = new URL(CHANGELOG_URL.formatted(forgeEnd));
155+
final var startChangelog = getUrlAsString(startUrl);
137156

138157
final var endChangelog = getUrlAsString(endUrl);
139-
var changelog = endChangelog.replace(startChangelog, "");
140-
141-
final var endMcVersionSplit = endMc.split("\\.");
142-
final var endForgeVersionSplit = endForge.split("\\.");
143-
changelog = changelog.replace("""
144-
%s.%s.x Changelog
145-
%s.%s
146-
====""".formatted(endMcVersionSplit[0], endMcVersionSplit[1], endForgeVersionSplit[0], endForgeVersionSplit[1]), "");
147-
148-
if (changelog.startsWith("\n")) {
149-
changelog = changelog.substring(1);
150-
}
151158

152-
return changelog;
159+
return endChangelog.replace(startChangelog, "");
153160
}
154161

155162
public static String getUrlAsString(URL u) throws IOException {

src/commander/java/com/mcmoddev/mmdbot/commander/updatenotifiers/forge/ForgeVersion.java

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

0 commit comments

Comments
 (0)