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

Commit 6d7e7e0

Browse files
authored
Merge pull request #109 from DeathsGun/bugs/101_use_checksums
Use checksums when using SemVer fallback
2 parents f32da99 + a58eb50 commit 6d7e7e0

File tree

4 files changed

+51
-38
lines changed

4 files changed

+51
-38
lines changed

src/main/kotlin/xyz/deathsgun/modmanager/gui/ModUpdateInfoScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ import xyz.deathsgun.modmanager.gui.widget.DescriptionWidget
3030
import xyz.deathsgun.modmanager.update.Update
3131

3232

33-
class ModUpdateInfoScreen(private val previousScreen: Screen, private val update: Update) :
34-
Screen(TranslatableText("modmanager.screen.update")), IListScreen {
33+
class ModUpdateInfoScreen(private val previousScreen: Screen, private val update: Update) : Screen(LiteralText.EMPTY),
34+
IListScreen {
3535

3636
private lateinit var descriptionWidget: DescriptionWidget
3737
private lateinit var updateButtonWidget: ButtonWidget

src/main/kotlin/xyz/deathsgun/modmanager/gui/ModsOverviewScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import net.minecraft.client.gui.widget.ButtonWidget
2727
import net.minecraft.client.gui.widget.CyclingButtonWidget
2828
import net.minecraft.client.gui.widget.TextFieldWidget
2929
import net.minecraft.client.util.math.MatrixStack
30+
import net.minecraft.text.LiteralText
3031
import net.minecraft.text.TranslatableText
3132
import org.lwjgl.glfw.GLFW
3233
import xyz.deathsgun.modmanager.ModManager
@@ -41,8 +42,7 @@ import xyz.deathsgun.modmanager.gui.widget.ModListEntry
4142
import xyz.deathsgun.modmanager.gui.widget.ModListWidget
4243
import kotlin.math.min
4344

44-
class ModsOverviewScreen(private val previousScreen: Screen) :
45-
Screen(TranslatableText("modmanager.title.overview")), IListScreen {
45+
class ModsOverviewScreen(private val previousScreen: Screen) : Screen(LiteralText.EMPTY), IListScreen {
4646

4747
private var query: String = ""
4848
private var selectedMod: ModListEntry? = null

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

Lines changed: 43 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ class UpdateManager {
8888
checkForUpdates(metadata, configIds)
8989
}
9090
}.awaitAll()
91+
finishedUpdateCheck = true
92+
if (MinecraftClient.getInstance()?.currentScreen == null) {
93+
return@runBlocking
94+
}
9195
MinecraftClient.getInstance().toastManager.add(
9296
SystemToast(
9397
SystemToast.Type.TUTORIAL_HINT,
@@ -118,18 +122,7 @@ class UpdateManager {
118122
ModManager.modManager.config.updateChannel,
119123
result.versions
120124
)
121-
if (version == null) {
122-
logger.info("No update for {} found!", metadata.id)
123-
ModManager.modManager.setModState(metadata.id, metadata.id, State.INSTALLED)
124-
return
125-
}
126-
logger.info("Update for {} found [{} -> {}]", metadata.id, metadata.version.friendlyString, version.version)
127-
ModManager.modManager.setModState(metadata.id, metadata.id, State.OUTDATED)
128-
when (val modResult = provider.getMod(metadata.id)) {
129-
is ModResult.Success -> {
130-
this.updates.add(Update(modResult.mod, metadata.id, metadata.version.friendlyString, version))
131-
}
132-
}
125+
verifyUpdate(provider, version, metadata, metadata.id)
133126
return
134127
}
135128

@@ -170,18 +163,7 @@ class UpdateManager {
170163
ModManager.modManager.config.updateChannel,
171164
versions
172165
)
173-
if (version == null) {
174-
logger.info("No update for {} found!", metadata.id)
175-
ModManager.modManager.setModState(metadata.id, mod.id, State.INSTALLED)
176-
return
177-
}
178-
logger.info("Update for {} found [{} -> {}]", metadata.id, metadata.version.friendlyString, version.version)
179-
ModManager.modManager.setModState(metadata.id, mod.id, State.OUTDATED)
180-
when (val modResult = provider.getMod(mod.id)) {
181-
is ModResult.Success -> {
182-
this.updates.add(Update(modResult.mod, metadata.id, metadata.version.friendlyString, version))
183-
}
184-
}
166+
verifyUpdate(provider, version, metadata, mod.id)
185167
}
186168

187169
private fun checkForUpdates(metadata: ModMetadata, ids: Map<String, String>) {
@@ -216,17 +198,40 @@ class UpdateManager {
216198
ModManager.modManager.config.updateChannel,
217199
versions
218200
)
201+
verifyUpdate(provider, version, metadata, id)
202+
}
203+
204+
private fun verifyUpdate(provider: IModUpdateProvider, version: Version?, metadata: ModMetadata, modId: String) {
219205
if (version == null) {
220206
logger.info("No update for {} found!", metadata.id)
221-
ModManager.modManager.setModState(metadata.id, id, State.INSTALLED)
207+
ModManager.modManager.setModState(metadata.id, modId, State.INSTALLED)
222208
return
223209
}
224-
logger.info("Update for {} found [{} -> {}]", metadata.id, metadata.version.friendlyString, version.version)
225-
ModManager.modManager.setModState(metadata.id, id, State.OUTDATED)
226-
when (val modResult = ModManager.modManager.provider[provider.getName()]?.getMod(id)) {
210+
val hash = findJarByModContainer(metadata)?.sha512()
211+
if (hash != null) {
212+
for (asset in version.assets) {
213+
if (hash == asset.hashes["sha512"]) {
214+
logger.info("No update for {} found!", metadata.id)
215+
ModManager.modManager.setModState(metadata.id, modId, State.INSTALLED)
216+
return
217+
}
218+
}
219+
}
220+
when (val modResult = ModManager.modManager.provider[provider.getName().lowercase()]?.getMod(modId)) {
227221
is ModResult.Success -> {
222+
ModManager.modManager.setModState(metadata.id, modId, State.OUTDATED)
223+
logger.info(
224+
"Update for {} found [{} -> {}]",
225+
metadata.id,
226+
metadata.version.friendlyString,
227+
version.version
228+
)
228229
this.updates.add(Update(modResult.mod, metadata.id, metadata.version.friendlyString, version))
229230
}
231+
is ModResult.Error -> {
232+
logger.error("Failed to resolve mod {}: {}", modId, modResult.cause)
233+
ModManager.modManager.setModState(metadata.id, modId, State.INSTALLED)
234+
}
230235
}
231236
}
232237

@@ -242,8 +247,12 @@ class UpdateManager {
242247
fun installMod(mod: Mod): ModInstallResult {
243248
return try {
244249
val provider = ModManager.modManager.getSelectedProvider()
245-
?: return ModInstallResult.Error(TranslatableText("modmanager.error.noProviderSelected"))
246-
logger.info("Installing {}", mod.name)
250+
?: return ModInstallResult.Error(
251+
TranslatableText(
252+
"modmanager.error.noProviderSelected",
253+
ModManager.modManager.config.defaultProvider
254+
)
255+
)
247256
val versions = when (val result = provider.getVersionsForMod(mod.id)) {
248257
is VersionResult.Error -> return ModInstallResult.Error(result.text, result.cause)
249258
is VersionResult.Success -> result.versions
@@ -253,16 +262,16 @@ class UpdateManager {
253262
ModManager.getMinecraftVersion(),
254263
ModManager.modManager.config.updateChannel,
255264
versions
256-
)
257-
?: return ModInstallResult.Error(TranslatableText("modmanager.error.noCompatibleModVersionFound"))
265+
) ?: return ModInstallResult.Error(TranslatableText("modmanager.error.noCompatibleModVersionFound"))
258266

267+
logger.info("Installing {} v{}", mod.name, version.version)
259268
val dir = FabricLoader.getInstance().gameDir.resolve("mods")
260269
when (val result = installVersion(mod, version, dir)) {
261270
is ModUpdateResult.Success -> ModInstallResult.Success
262271
is ModUpdateResult.Error -> ModInstallResult.Error(result.text, result.cause)
263272
}
264273
} catch (e: Exception) {
265-
ModInstallResult.Error(TranslatableText(""))
274+
ModInstallResult.Error(TranslatableText("modmanager.error.unknown.update", e))
266275
}
267276
}
268277

@@ -286,7 +295,7 @@ class UpdateManager {
286295
?: return ModUpdateResult.Error(TranslatableText("modmanager.error.update.noFabricJar"))
287296
}
288297
val jar = dir.resolve(asset.filename) // Download into same directory where the old jar was
289-
HttpClient.download(asset.url, jar, listener)
298+
HttpClient.download(encodeURI(asset.url), jar, listener)
290299
val expected = asset.hashes["sha512"]
291300
val calculated = jar.sha512()
292301
if (calculated != expected) {

src/main/resources/assets/modmanager/lang/en_us.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,18 @@
3636
"modmanager.details.author": "By %s",
3737
"modmanager.details.versioning": "From %s to %s",
3838
"modmanager.error.title": "§b§4Error:§r",
39+
"modmanager.error.container.notFound": "The mod you trying to update has been unloaded in the mean time\nThis shouldn't be possible",
3940
"modmanager.error.unknown": "Unknown error while retrieving data:\n %s",
4041
"modmanager.error.unknown.install": "Unknown error while during installation:\n %s",
4142
"modmanager.error.unknown.update": "Unknown error while during update:\n %s",
4243
"modmanager.error.invalidStatus": "Received invalid status code:\n %d",
4344
"modmanager.error.network": "Network error while retrieving data:\n %s",
4445
"modmanager.error.failedToParse": "Failed to parse response:\n %s",
4546
"modmanager.error.noCompatibleModVersionFound": "No compatible version found for your current channel!\nTry changing the channel in the Mod Manager settings!",
47+
"modmanager.error.noProviderSelected": "The selected provider %s is not available!",
48+
"modmanager.error.update.noFabricJar": "The mod author has marked a version compatible\nto fabric but does not provide a for it!",
4649
"modmanager.error.jar.notFound": "Error jar file not found. Is it part of another mod?",
50+
"modmanager.error.jar.failedDelete": "Failed to delete mod:\n %s",
4751
"modmanager.error.invalidHash": "Error the downloaded file is probably broken as the %s hashes don't match\nTry checking your network or contact the mod author",
4852
"modmanager.status.installing": "Installing %s...",
4953
"modmanager.status.install.success": "Successfully installed %s!\nDo you want to go back?",

0 commit comments

Comments
 (0)