Skip to content
This repository has been archived by the owner on Dec 30, 2022. It is now read-only.

Commit

Permalink
Use checksums when using SemVer fallback
Browse files Browse the repository at this point in the history
When a mod now doesn't support SemVer and ModManager checks it, ModManager will try to get the latest version for the current Minecraft version, and it will compare the checksums to make sure it's note the same jar

Finally, closes #101 and closes #52
  • Loading branch information
DeathsGun committed Dec 3, 2021
1 parent 3098b4d commit c6d3b86
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 33 deletions.
3 changes: 2 additions & 1 deletion src/main/kotlin/xyz/deathsgun/modmanager/api/mod/Version.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,6 @@ data class Version(
val releaseDate: LocalDate,
val type: VersionType,
val gameVersions: List<String>,
val assets: List<Asset>
val assets: List<Asset>,
var foundTroughFallback: Boolean = false
)
57 changes: 25 additions & 32 deletions src/main/kotlin/xyz/deathsgun/modmanager/update/UpdateManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -74,16 +74,16 @@ class UpdateManager {
mods.forEach { metadata ->
launch {
if (findJarByModContainer(metadata) == null) {
logger.info("Skipping update for {} because it has no jar in mods", metadata.id)
logger.debug("Skipping update for {} because it has no jar in mods", metadata.id)
return@launch
}
val configIds = getIdBy(metadata)
if (configIds == null) {
logger.info("Searching for updates for {} using fallback method", metadata.id)
logger.debug("Searching for updates for {} using fallback method", metadata.id)
checkForUpdatesManually(metadata)
return@launch
}
logger.info("Searching for updates for {} using defined mod id", metadata.id)
logger.debug("Searching for updates for {} using defined mod id", metadata.id)
checkForUpdates(metadata, configIds)
}
}
Expand All @@ -110,18 +110,7 @@ class UpdateManager {
ModManager.modManager.config.updateChannel,
result.versions
)
if (version == null) {
logger.info("No update for {} found!", metadata.id)
ModManager.modManager.setModState(metadata.id, metadata.id, State.INSTALLED)
return
}
logger.info("Update for {} found [{} -> {}]", metadata.id, metadata.version.friendlyString, version.version)
ModManager.modManager.setModState(metadata.id, metadata.id, State.OUTDATED)
when (val modResult = provider.getMod(metadata.id)) {
is ModResult.Success -> {
this.updates.add(Update(modResult.mod, metadata.id, metadata.version.friendlyString, version))
}
}
verifyUpdate(provider, version, metadata, metadata.id)
return
}

Expand Down Expand Up @@ -163,18 +152,7 @@ class UpdateManager {
ModManager.modManager.config.updateChannel,
versions
)
if (version == null) {
logger.info("No update for {} found!", metadata.id)
ModManager.modManager.setModState(metadata.id, mod.id, State.INSTALLED)
return
}
logger.info("Update for {} found [{} -> {}]", metadata.id, metadata.version.friendlyString, version.version)
ModManager.modManager.setModState(metadata.id, mod.id, State.OUTDATED)
when (val modResult = provider.getMod(mod.id)) {
is ModResult.Success -> {
this.updates.add(Update(modResult.mod, metadata.id, metadata.version.friendlyString, version))
}
}
verifyUpdate(provider, version, metadata, mod.id)
}

private fun checkForUpdates(metadata: ModMetadata, ids: Map<String, String>) {
Expand Down Expand Up @@ -209,14 +187,29 @@ class UpdateManager {
ModManager.modManager.config.updateChannel,
versions
)
verifyUpdate(provider, version, metadata, id)
}

private fun verifyUpdate(provider: IModUpdateProvider, version: Version?, metadata: ModMetadata, modId: String) {
if (version == null) {
logger.info("No update for {} found!", metadata.id)
ModManager.modManager.setModState(metadata.id, id, State.INSTALLED)
ModManager.modManager.setModState(metadata.id, modId, State.INSTALLED)
return
}
if (version.foundTroughFallback) {
val hash = findJarByModContainer(metadata)?.sha512()
if (hash != null) {
for (asset in version.assets) {
if (hash == asset.hashes["sha512"]) {
logger.info("No update for {} found!", metadata.id)
return
}
}
}
}
logger.info("Update for {} found [{} -> {}]", metadata.id, metadata.version.friendlyString, version.version)
ModManager.modManager.setModState(metadata.id, id, State.OUTDATED)
when (val modResult = ModManager.modManager.provider[provider.getName()]?.getMod(id)) {
ModManager.modManager.setModState(metadata.id, modId, State.OUTDATED)
when (val modResult = ModManager.modManager.provider[provider.getName()]?.getMod(modId)) {
is ModResult.Success -> {
this.updates.add(Update(modResult.mod, metadata.id, metadata.version.friendlyString, version))
}
Expand All @@ -236,7 +229,6 @@ class UpdateManager {
return try {
val provider = ModManager.modManager.getSelectedProvider()
?: return ModInstallResult.Error(TranslatableText("modmanager.error.noProviderSelected"))
logger.info("Installing {}", mod.name)
val versions = when (val result = provider.getVersionsForMod(mod.id)) {
is VersionResult.Error -> return ModInstallResult.Error(result.text, result.cause)
is VersionResult.Success -> result.versions
Expand All @@ -249,13 +241,14 @@ class UpdateManager {
)
?: return ModInstallResult.Error(TranslatableText("modmanager.error.noCompatibleModVersionFound"))

logger.info("Installing {} v{}", mod.name, version.version)
val dir = FabricLoader.getInstance().gameDir.resolve("mods")
when (val result = installVersion(mod, version, dir)) {
is ModUpdateResult.Success -> ModInstallResult.Success
is ModUpdateResult.Error -> ModInstallResult.Error(result.text, result.cause)
}
} catch (e: Exception) {
ModInstallResult.Error(TranslatableText(""))
ModInstallResult.Error(TranslatableText("modmanager.error.unknown.update", e))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ object VersionFinder {
if (version?.version == installedVersion) {
return null
}
version?.foundTroughFallback = true
return version
}

Expand Down

0 comments on commit c6d3b86

Please sign in to comment.