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

Commit c6d3b86

Browse files
committed
Use checksums when using SemVer fallback
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
1 parent 3098b4d commit c6d3b86

File tree

3 files changed

+28
-33
lines changed

3 files changed

+28
-33
lines changed

src/main/kotlin/xyz/deathsgun/modmanager/api/mod/Version.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,6 @@ data class Version(
2424
val releaseDate: LocalDate,
2525
val type: VersionType,
2626
val gameVersions: List<String>,
27-
val assets: List<Asset>
27+
val assets: List<Asset>,
28+
var foundTroughFallback: Boolean = false
2829
)

src/main/kotlin/xyz/deathsgun/modmanager/update/UpdateManager.kt

Lines changed: 25 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -74,16 +74,16 @@ class UpdateManager {
7474
mods.forEach { metadata ->
7575
launch {
7676
if (findJarByModContainer(metadata) == null) {
77-
logger.info("Skipping update for {} because it has no jar in mods", metadata.id)
77+
logger.debug("Skipping update for {} because it has no jar in mods", metadata.id)
7878
return@launch
7979
}
8080
val configIds = getIdBy(metadata)
8181
if (configIds == null) {
82-
logger.info("Searching for updates for {} using fallback method", metadata.id)
82+
logger.debug("Searching for updates for {} using fallback method", metadata.id)
8383
checkForUpdatesManually(metadata)
8484
return@launch
8585
}
86-
logger.info("Searching for updates for {} using defined mod id", metadata.id)
86+
logger.debug("Searching for updates for {} using defined mod id", metadata.id)
8787
checkForUpdates(metadata, configIds)
8888
}
8989
}
@@ -110,18 +110,7 @@ class UpdateManager {
110110
ModManager.modManager.config.updateChannel,
111111
result.versions
112112
)
113-
if (version == null) {
114-
logger.info("No update for {} found!", metadata.id)
115-
ModManager.modManager.setModState(metadata.id, metadata.id, State.INSTALLED)
116-
return
117-
}
118-
logger.info("Update for {} found [{} -> {}]", metadata.id, metadata.version.friendlyString, version.version)
119-
ModManager.modManager.setModState(metadata.id, metadata.id, State.OUTDATED)
120-
when (val modResult = provider.getMod(metadata.id)) {
121-
is ModResult.Success -> {
122-
this.updates.add(Update(modResult.mod, metadata.id, metadata.version.friendlyString, version))
123-
}
124-
}
113+
verifyUpdate(provider, version, metadata, metadata.id)
125114
return
126115
}
127116

@@ -163,18 +152,7 @@ class UpdateManager {
163152
ModManager.modManager.config.updateChannel,
164153
versions
165154
)
166-
if (version == null) {
167-
logger.info("No update for {} found!", metadata.id)
168-
ModManager.modManager.setModState(metadata.id, mod.id, State.INSTALLED)
169-
return
170-
}
171-
logger.info("Update for {} found [{} -> {}]", metadata.id, metadata.version.friendlyString, version.version)
172-
ModManager.modManager.setModState(metadata.id, mod.id, State.OUTDATED)
173-
when (val modResult = provider.getMod(mod.id)) {
174-
is ModResult.Success -> {
175-
this.updates.add(Update(modResult.mod, metadata.id, metadata.version.friendlyString, version))
176-
}
177-
}
155+
verifyUpdate(provider, version, metadata, mod.id)
178156
}
179157

180158
private fun checkForUpdates(metadata: ModMetadata, ids: Map<String, String>) {
@@ -209,14 +187,29 @@ class UpdateManager {
209187
ModManager.modManager.config.updateChannel,
210188
versions
211189
)
190+
verifyUpdate(provider, version, metadata, id)
191+
}
192+
193+
private fun verifyUpdate(provider: IModUpdateProvider, version: Version?, metadata: ModMetadata, modId: String) {
212194
if (version == null) {
213195
logger.info("No update for {} found!", metadata.id)
214-
ModManager.modManager.setModState(metadata.id, id, State.INSTALLED)
196+
ModManager.modManager.setModState(metadata.id, modId, State.INSTALLED)
215197
return
216198
}
199+
if (version.foundTroughFallback) {
200+
val hash = findJarByModContainer(metadata)?.sha512()
201+
if (hash != null) {
202+
for (asset in version.assets) {
203+
if (hash == asset.hashes["sha512"]) {
204+
logger.info("No update for {} found!", metadata.id)
205+
return
206+
}
207+
}
208+
}
209+
}
217210
logger.info("Update for {} found [{} -> {}]", metadata.id, metadata.version.friendlyString, version.version)
218-
ModManager.modManager.setModState(metadata.id, id, State.OUTDATED)
219-
when (val modResult = ModManager.modManager.provider[provider.getName()]?.getMod(id)) {
211+
ModManager.modManager.setModState(metadata.id, modId, State.OUTDATED)
212+
when (val modResult = ModManager.modManager.provider[provider.getName()]?.getMod(modId)) {
220213
is ModResult.Success -> {
221214
this.updates.add(Update(modResult.mod, metadata.id, metadata.version.friendlyString, version))
222215
}
@@ -236,7 +229,6 @@ class UpdateManager {
236229
return try {
237230
val provider = ModManager.modManager.getSelectedProvider()
238231
?: return ModInstallResult.Error(TranslatableText("modmanager.error.noProviderSelected"))
239-
logger.info("Installing {}", mod.name)
240232
val versions = when (val result = provider.getVersionsForMod(mod.id)) {
241233
is VersionResult.Error -> return ModInstallResult.Error(result.text, result.cause)
242234
is VersionResult.Success -> result.versions
@@ -249,13 +241,14 @@ class UpdateManager {
249241
)
250242
?: return ModInstallResult.Error(TranslatableText("modmanager.error.noCompatibleModVersionFound"))
251243

244+
logger.info("Installing {} v{}", mod.name, version.version)
252245
val dir = FabricLoader.getInstance().gameDir.resolve("mods")
253246
when (val result = installVersion(mod, version, dir)) {
254247
is ModUpdateResult.Success -> ModInstallResult.Success
255248
is ModUpdateResult.Error -> ModInstallResult.Error(result.text, result.cause)
256249
}
257250
} catch (e: Exception) {
258-
ModInstallResult.Error(TranslatableText(""))
251+
ModInstallResult.Error(TranslatableText("modmanager.error.unknown.update", e))
259252
}
260253
}
261254

src/main/kotlin/xyz/deathsgun/modmanager/update/VersionFinder.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ object VersionFinder {
3838
if (version?.version == installedVersion) {
3939
return null
4040
}
41+
version?.foundTroughFallback = true
4142
return version
4243
}
4344

0 commit comments

Comments
 (0)