Skip to content

Commit ed063a1

Browse files
committed
Fix version and channel fallback issues
1 parent 740fea4 commit ed063a1

2 files changed

Lines changed: 95 additions & 30 deletions

File tree

src/main/kotlin/com/lambda/lambdaLoader/VersionController.kt

Lines changed: 44 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -87,31 +87,6 @@ class VersionController(
8787
logger.warning("No Lambda versions found for Minecraft $minecraftVersion")
8888
logger.warning("Available versions: ${versions.joinToString(", ")}")
8989
}
90-
91-
// Try to find closest version by matching major.minor version (e.g., 1.21.x)
92-
val minecraftMajorMinor = minecraftVersion.split(".").take(2).joinToString(".")
93-
val closeMatchVersions = versions.filter { version ->
94-
version.contains("+$minecraftMajorMinor.")
95-
}
96-
97-
if (closeMatchVersions.isNotEmpty()) {
98-
val fallbackVersion = closeMatchVersions.last()
99-
if (ConfigManager.config.debug) {
100-
logger.warning("Falling back to closest version: $fallbackVersion")
101-
}
102-
return fallbackVersion
103-
}
104-
105-
// Last resort: use the latest available version
106-
if (versions.isNotEmpty()) {
107-
val lastResortVersion = versions.last()
108-
if (ConfigManager.config.debug) {
109-
logger.warning("No close match found. Using latest available version: $lastResortVersion")
110-
logger.warning("This may cause compatibility issues!")
111-
}
112-
return lastResortVersion
113-
}
114-
11590
return null
11691
}
11792

@@ -192,23 +167,46 @@ class VersionController(
192167

193168
private fun getJarUrl(): String? {
194169
return when (ConfigManager.config.releaseMode) {
195-
ReleaseMode.STABLE -> getReleaseJarUrl()
170+
ReleaseMode.STABLE -> {
171+
val releaseUrl = getReleaseJarUrl()
172+
if (releaseUrl == null) {
173+
logger.warning("No stable version found for Minecraft $minecraftVersion, falling back to snapshot")
174+
getSnapshotJarUrl()
175+
} else {
176+
releaseUrl
177+
}
178+
}
196179
ReleaseMode.SNAPSHOT -> getSnapshotJarUrl()
197180
}
198181
}
199182

200183
private fun getChecksumUrl(): String? {
201184
return when (ConfigManager.config.releaseMode) {
202-
ReleaseMode.STABLE -> getReleaseChecksumUrl()
185+
ReleaseMode.STABLE -> {
186+
val releaseChecksumUrl = getReleaseChecksumUrl()
187+
if (releaseChecksumUrl == null) {
188+
logger.warning("No stable version checksum found for Minecraft $minecraftVersion, falling back to snapshot")
189+
getSnapshotChecksumUrl()
190+
} else {
191+
releaseChecksumUrl
192+
}
193+
}
203194
ReleaseMode.SNAPSHOT -> getSnapshotChecksumUrl()
204195
}
205196
}
206197

207198
private fun getCacheFileName(): String? {
208199
return when (ConfigManager.config.releaseMode) {
209200
ReleaseMode.STABLE -> {
210-
val version = checkReleasesVersion() ?: return null
211-
"lambda-$version.jar"
201+
val version = checkReleasesVersion()
202+
if (version == null) {
203+
logger.warning("No stable cache filename found for Minecraft $minecraftVersion, falling back to snapshot")
204+
val snapshotInfo = getLatestSnapshotInfo() ?: return null
205+
val baseVersion = snapshotInfo.version.replace("-SNAPSHOT", "")
206+
"lambda-$baseVersion-${snapshotInfo.timestamp}-${snapshotInfo.buildNumber}.jar"
207+
} else {
208+
"lambda-$version.jar"
209+
}
212210
}
213211

214212
ReleaseMode.SNAPSHOT -> {
@@ -318,7 +316,23 @@ class VersionController(
318316
return try {
319317
// Ensure the latest version is cached
320318
if (!ensureLatestVersionCached()) {
321-
logger.severe("Failed to ensure latest version is cached")
319+
// Check if both stable and snapshot versions are unavailable
320+
val stableVersion = checkReleasesVersion()
321+
val snapshotVersion = checkSnapshotVersion()
322+
323+
if (stableVersion == null && snapshotVersion == null) {
324+
logger.severe("═══════════════════════════════════════════════════════════")
325+
logger.severe("FATAL ERROR: No Lambda Client version found!")
326+
logger.severe("Minecraft version: $minecraftVersion")
327+
logger.severe("Neither STABLE nor SNAPSHOT versions are available for this Minecraft version.")
328+
logger.severe("Please check:")
329+
logger.severe(" 1. Your internet connection")
330+
logger.severe(" 2. Maven repository availability at: $mavenUrl")
331+
logger.severe(" 3. If Lambda Client supports Minecraft $minecraftVersion")
332+
logger.severe("═══════════════════════════════════════════════════════════")
333+
} else {
334+
logger.severe("Failed to ensure latest version is cached")
335+
}
322336
return null
323337
}
324338

src/test/kotlin/com/lambda/lambdaLoader/VersionControllerTest.kt

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,4 +312,55 @@ class VersionControllerTest {
312312
}
313313
}
314314
}
315+
316+
@Test
317+
fun testStableToSnapshotFallback() {
318+
println("Testing fallback from STABLE to SNAPSHOT when no stable version exists...")
319+
320+
// Use a Minecraft version that might only have snapshots
321+
val availableVersions = getAvailableMinecraftVersions()
322+
assertTrue(availableVersions.isNotEmpty(), "Should have at least one MC version available")
323+
324+
// Try to find a version that has both stable and snapshot, or just snapshot
325+
val mcVersion = availableVersions.sorted().last() // Latest version more likely to have snapshots
326+
327+
println("Testing with Minecraft version: $mcVersion")
328+
329+
val versionController = VersionController(minecraftVersionOverride = mcVersion)
330+
331+
// Set to STABLE mode - should fallback to snapshot if stable doesn't exist
332+
ConfigManager.saveConfig(ConfigManager.config.copy(releaseMode = ReleaseMode.STABLE, debug = true))
333+
334+
val jarFile = versionController.getOrDownloadLatestVersion()
335+
336+
if (jarFile != null) {
337+
println("✓ Successfully retrieved version (with potential fallback): ${jarFile.name}")
338+
assertTrue(jarFile.exists(), "JAR file should exist")
339+
assertTrue(jarFile.name.endsWith(".jar"), "Should be a JAR file")
340+
println("Fallback test passed!")
341+
} else {
342+
println("⚠ No version found even with fallback - this is expected if neither stable nor snapshot exists for MC $mcVersion")
343+
}
344+
}
345+
346+
@Test
347+
fun testNoVersionAvailableErrorMessage() {
348+
println("Testing error message when no version is available...")
349+
350+
// Use a non-existent Minecraft version to trigger the error
351+
val nonExistentVersion = "99.99.99"
352+
353+
println("Testing with non-existent Minecraft version: $nonExistentVersion")
354+
355+
val versionController = VersionController(minecraftVersionOverride = nonExistentVersion)
356+
357+
// Set to STABLE mode
358+
ConfigManager.saveConfig(ConfigManager.config.copy(releaseMode = ReleaseMode.STABLE, debug = true))
359+
360+
val jarFile = versionController.getOrDownloadLatestVersion()
361+
362+
// Should return null and log error messages
363+
assertNull(jarFile, "Should return null when no version is available")
364+
println("✓ Error handling test passed - null returned as expected")
365+
}
315366
}

0 commit comments

Comments
 (0)