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

Commit c3b7134

Browse files
committed
Port correctly to Java 8
1 parent 0431a38 commit c3b7134

File tree

9 files changed

+83
-70
lines changed

9 files changed

+83
-70
lines changed

build.gradle

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
//file:noinspection GroovyAssignabilityCheck
1818
//file:noinspection GroovyAccessibility
1919
plugins {
20-
id "fabric-loom" version "0.8-SNAPSHOT"
20+
id "fabric-loom" version "0.7-SNAPSHOT"
2121
id "com.modrinth.minotaur" version "1.2.1"
2222
id "org.jetbrains.kotlin.jvm" version "1.5.30"
2323
id "org.jetbrains.kotlin.plugin.serialization" version "1.5.30"
@@ -64,17 +64,15 @@ test {
6464

6565
tasks.withType(JavaCompile).configureEach {
6666
it.options.encoding = "UTF-8"
67-
// Minecraft 1.17 (21w19a) upwards uses Java 16.
68-
it.options.release = 8
6967
}
7068

7169
compileKotlin {
72-
kotlinOptions.jvmTarget = "8"
70+
kotlinOptions.jvmTarget = "1.8"
7371
kotlinOptions.freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn"
7472
}
7573

7674
compileTestKotlin {
77-
kotlinOptions.jvmTarget = "8"
75+
kotlinOptions.jvmTarget = "1.8"
7876
kotlinOptions.freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn"
7977
}
8078

src/main/kotlin/xyz/deathsgun/modmanager/PreLaunchHook.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class PreLaunchHook : PreLaunchEntrypoint {
5252
if (Files.notExists(configFile)) {
5353
return ArrayList()
5454
}
55-
val data = Files.readString(configFile, Charsets.UTF_8)
55+
val data = Files.readAllBytes(configFile).decodeToString();
5656
configFile.deleteIfExists()
5757
return Json.decodeFromString(data)
5858
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package xyz.deathsgun.modmanager.api.http
2+
3+
import java.io.ByteArrayInputStream
4+
import java.io.InputStream
5+
import java.net.HttpURLConnection
6+
import java.net.URI
7+
8+
object HttpClient {
9+
10+
fun get(url: String): ByteArray {
11+
return get(URI.create(url))
12+
}
13+
14+
fun get(uri: URI): ByteArray {
15+
val connection = uri.toURL().openConnection() as HttpURLConnection
16+
connection.readTimeout = 10000
17+
connection.requestMethod = "GET"
18+
connection.connect()
19+
if (connection.responseCode != 200) {
20+
connection.disconnect()
21+
throw InvalidStatusCodeException(connection.responseCode)
22+
}
23+
val content = connection.inputStream.readBytes()
24+
connection.disconnect()
25+
return content
26+
}
27+
28+
fun getInputStream(url: String): InputStream {
29+
return getInputStream(URI.create(url))
30+
}
31+
32+
private fun getInputStream(uri: URI): InputStream {
33+
return ByteArrayInputStream(get(uri))
34+
}
35+
36+
class InvalidStatusCodeException(val statusCode: Int) : Exception("Received invalid status code: $statusCode")
37+
}

src/main/kotlin/xyz/deathsgun/modmanager/config/Config.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ data class Config(
4747
return try {
4848
val file = FabricLoader.getInstance().configDir.resolve("modmanager.json")
4949
Files.createDirectories(file.parent)
50-
val data = Files.readString(file, Charset.forName("UTF-8"))
50+
val data = Files.readAllBytes(file).decodeToString()
5151
json.decodeFromString(data)
5252
} catch (e: Exception) {
5353
if (e !is NoSuchFileException) {
@@ -62,7 +62,7 @@ data class Config(
6262
try {
6363
val file = FabricLoader.getInstance().configDir.resolve("modmanager.json")
6464
val data = json.encodeToString(config)
65-
Files.writeString(file, data, Charset.forName("UTF-8"))
65+
Files.write(file, data.encodeToByteArray())
6666
} catch (ignored: Exception) {
6767
}
6868
return config

src/main/kotlin/xyz/deathsgun/modmanager/icon/IconCache.kt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,14 @@ import net.minecraft.client.texture.NativeImage
2525
import net.minecraft.client.texture.NativeImageBackedTexture
2626
import net.minecraft.util.Identifier
2727
import org.apache.commons.io.FileUtils
28+
import org.apache.http.client.methods.HttpGet
29+
import org.apache.http.impl.client.CloseableHttpClient
30+
import org.apache.http.impl.client.HttpClients
2831
import org.apache.logging.log4j.LogManager
2932
import xyz.deathsgun.modmanager.ModManager
33+
import xyz.deathsgun.modmanager.api.http.HttpClient
3034
import xyz.deathsgun.modmanager.api.mod.Mod
3135
import java.net.URI
32-
import java.net.http.HttpClient
33-
import java.net.http.HttpRequest
34-
import java.net.http.HttpResponse
3536
import java.nio.file.Files
3637
import java.util.stream.Collectors
3738

@@ -42,7 +43,6 @@ class IconCache {
4243
private val loadingIcon = Identifier("modmanager", "textures/gui/loading.png")
4344
private val iconsDir = FabricLoader.getInstance().gameDir.resolve(".icons")
4445
private val state = HashMap<String, IconState>()
45-
private val http = HttpClient.newHttpClient()
4646

4747
init {
4848
Files.createDirectories(iconsDir)
@@ -94,16 +94,16 @@ class IconCache {
9494
}
9595
state[mod.id] = IconState.DOWNLOADING
9696
try {
97-
val request = HttpRequest.newBuilder(URI.create(mod.iconUrl)).GET()
98-
.setHeader("User-Agent", "ModMenu " + ModManager.getVersion()).build()
99-
val response = http.send(request, HttpResponse.BodyHandlers.ofByteArray())
100-
if (response.statusCode() != 200) {
97+
val request = HttpGet(mod.iconUrl)
98+
request.setHeader("User-Agent", "ModManager ${ModManager.getVersion()}")
99+
Files.copy(HttpClient.getInputStream(mod.iconUrl), iconsDir.resolve(mod.id))
100+
state[mod.id] = IconState.DOWNLOADED
101+
} catch (e: Exception) {
102+
if (e is HttpClient.InvalidStatusCodeException) {
103+
logger.error("Received invalid status code")
101104
state[mod.id] = IconState.ERRORED
102105
return
103106
}
104-
Files.write(iconsDir.resolve(mod.id), response.body())
105-
state[mod.id] = IconState.DOWNLOADED
106-
} catch (e: Exception) {
107107
state[mod.id] = IconState.ERRORED
108108
logger.error("Error while downloading icon for {}: {}", mod.slug, e.message)
109109
}

src/main/kotlin/xyz/deathsgun/modmanager/providers/modrinth/Modrinth.kt

Lines changed: 18 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,7 @@ import net.minecraft.text.TranslatableText
2323
import org.apache.http.client.utils.URIBuilder
2424
import org.apache.logging.log4j.LogManager
2525
import xyz.deathsgun.modmanager.ModManager
26-
import xyz.deathsgun.modmanager.api.http.CategoriesResult
27-
import xyz.deathsgun.modmanager.api.http.ModResult
28-
import xyz.deathsgun.modmanager.api.http.ModsResult
29-
import xyz.deathsgun.modmanager.api.http.VersionResult
26+
import xyz.deathsgun.modmanager.api.http.*
3027
import xyz.deathsgun.modmanager.api.mod.*
3128
import xyz.deathsgun.modmanager.api.provider.IModProvider
3229
import xyz.deathsgun.modmanager.api.provider.IModUpdateProvider
@@ -35,9 +32,6 @@ import xyz.deathsgun.modmanager.providers.modrinth.models.DetailedMod
3532
import xyz.deathsgun.modmanager.providers.modrinth.models.ModrinthVersion
3633
import xyz.deathsgun.modmanager.providers.modrinth.models.SearchResult
3734
import java.net.URI
38-
import java.net.http.HttpClient
39-
import java.net.http.HttpRequest
40-
import java.net.http.HttpResponse
4135
import java.time.Duration
4236
import java.time.Instant
4337
import java.time.ZoneOffset
@@ -48,7 +42,6 @@ class Modrinth : IModProvider, IModUpdateProvider {
4842
private val logger = LogManager.getLogger("Modrinth")
4943
private val categories: ArrayList<Category> = ArrayList()
5044
private val baseUri = "https://api.modrinth.com"
51-
private val http = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(5)).build()
5245

5346

5447
override fun getName(): String {
@@ -59,11 +52,9 @@ class Modrinth : IModProvider, IModUpdateProvider {
5952
if (this.categories.isNotEmpty()) {
6053
return CategoriesResult.Success(this.categories)
6154
}
62-
val request = HttpRequest.newBuilder().GET().setHeader("User-Agent", "ModManager " + ModManager.getVersion())
63-
.uri(URI.create("${baseUri}/api/v1/tag/category")).build()
6455
return try {
65-
val response = this.http.send(request, HttpResponse.BodyHandlers.ofString())
66-
val categories = json.decodeFromString<List<String>>(response.body())
56+
val response = HttpClient.get("${baseUri}/api/v1/tag/category")
57+
val categories = json.decodeFromString<List<String>>(response.decodeToString())
6758
for (category in categories) {
6859
if (category == "fabric") { // Fabric is not really a category
6960
continue
@@ -142,17 +133,15 @@ class Modrinth : IModProvider, IModUpdateProvider {
142133
builder.addParameter("index", sorting.name.lowercase())
143134
builder.addParameter("offset", (page * limit).toString())
144135
builder.addParameter("limit", limit.toString())
145-
val request = HttpRequest.newBuilder().GET().setHeader("User-Agent", "ModManager " + ModManager.getVersion())
146-
.uri(builder.build()).build()
147-
val response = this.http.send(request, HttpResponse.BodyHandlers.ofString())
148-
if (response.statusCode() != 200) {
149-
return ModsResult.Error(TranslatableText("modmanager.error.invalidStatus", response.statusCode()))
150-
}
136+
val response = HttpClient.get(builder.build())
151137
return try {
152-
val result = json.decodeFromString<SearchResult>(response.body())
138+
val result = json.decodeFromString<SearchResult>(response.decodeToString())
153139
ModsResult.Success(result.toList())
154140
} catch (e: Exception) {
155141
logger.error("Error while requesting mods {}", e.message)
142+
if (e is HttpClient.InvalidStatusCodeException) {
143+
ModsResult.Error(TranslatableText("modmanager.error.invalidStatus", e.message))
144+
}
156145
ModsResult.Error(TranslatableText("modmanager.error.failedToParse", e.message))
157146
}
158147
}
@@ -163,20 +152,17 @@ class Modrinth : IModProvider, IModUpdateProvider {
163152

164153
override fun getMod(id: String): ModResult {
165154
id.replaceFirst("local-", "")
166-
val request = HttpRequest.newBuilder().GET()
167-
.setHeader("User-Agent", "ModManager " + ModManager.getVersion())
168-
.uri(URI.create("${baseUri}/api/v1/mod/${id}")).build()
169155
val response = try {
170-
this.http.send(request, HttpResponse.BodyHandlers.ofString())
156+
HttpClient.get("${baseUri}/api/v1/mod/${id}")
171157
} catch (e: Exception) {
172158
logger.error("Error while getting mod {}", e.message)
159+
if (e is HttpClient.InvalidStatusCodeException) {
160+
return ModResult.Error(TranslatableText("modmanager.error.invalidStatus", e.statusCode))
161+
}
173162
return ModResult.Error(TranslatableText("modmanager.error.network", e.message), e)
174163
}
175-
if (response.statusCode() != 200) {
176-
return ModResult.Error(TranslatableText("modmanager.error.invalidStatus", response.statusCode()))
177-
}
178164
return try {
179-
val result = json.decodeFromString<DetailedMod>(response.body())
165+
val result = json.decodeFromString<DetailedMod>(response.decodeToString())
180166
val categoriesList = ArrayList<Category>()
181167
result.categories.forEach { categoryId ->
182168
categoriesList.add(
@@ -205,20 +191,17 @@ class Modrinth : IModProvider, IModUpdateProvider {
205191
}
206192

207193
override fun getVersionsForMod(id: String): VersionResult {
208-
val request = HttpRequest.newBuilder().GET()
209-
.setHeader("User-Agent", "ModManager " + ModManager.getVersion())
210-
.uri(URI.create("${baseUri}/api/v1/mod/${id}/version")).build()
211194
val response = try {
212-
this.http.send(request, HttpResponse.BodyHandlers.ofString())
195+
HttpClient.get("${baseUri}/api/v1/mod/${id}/version")
213196
} catch (e: Exception) {
197+
if (e is HttpClient.InvalidStatusCodeException) {
198+
return VersionResult.Error(TranslatableText("modmanager.error.invalidStatus", e.statusCode))
199+
}
214200
logger.error("Error while getting mod {}", e.message)
215201
return VersionResult.Error(TranslatableText("modmanager.error.network", e.message), e)
216202
}
217-
if (response.statusCode() != 200) {
218-
return VersionResult.Error(TranslatableText("modmanager.error.invalidStatus", response.statusCode()))
219-
}
220203
return try {
221-
val modrinthVersions = json.decodeFromString<List<ModrinthVersion>>(response.body())
204+
val modrinthVersions = json.decodeFromString<List<ModrinthVersion>>(response.decodeToString())
222205
val versions = ArrayList<Version>()
223206
for (modVersion in modrinthVersions) {
224207
if (!modVersion.loaders.contains("fabric")) {

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

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import xyz.deathsgun.modmanager.ModManager
3232
import xyz.deathsgun.modmanager.api.ModInstallResult
3333
import xyz.deathsgun.modmanager.api.ModRemoveResult
3434
import xyz.deathsgun.modmanager.api.ModUpdateResult
35+
import xyz.deathsgun.modmanager.api.http.HttpClient
3536
import xyz.deathsgun.modmanager.api.http.ModResult
3637
import xyz.deathsgun.modmanager.api.http.ModsResult
3738
import xyz.deathsgun.modmanager.api.http.VersionResult
@@ -44,13 +45,9 @@ import xyz.deathsgun.modmanager.models.FabricMetadata
4445
import java.io.File
4546
import java.math.BigInteger
4647
import java.net.URI
47-
import java.net.http.HttpClient
48-
import java.net.http.HttpRequest
49-
import java.net.http.HttpResponse
5048
import java.nio.file.Files
5149
import java.nio.file.Path
5250
import java.security.MessageDigest
53-
import java.time.Duration
5451
import java.util.zip.ZipFile
5552
import kotlin.io.path.absolutePathString
5653

@@ -59,7 +56,6 @@ class UpdateManager {
5956

6057
private val logger = LogManager.getLogger("UpdateCheck")
6158
private val blockedIds = arrayOf("java", "minecraft", "fabricloader")
62-
private val http: HttpClient = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(15)).build()
6359
private val deletableMods = ArrayList<String>()
6460
val updates = ArrayList<Update>()
6561

@@ -273,12 +269,8 @@ class UpdateManager {
273269
?: return ModUpdateResult.Error(TranslatableText("modmanager.error.update.noFabricJar"))
274270
}
275271
val jar = dir.resolve(asset.filename) // Download into same directory where the old jar was
276-
val request = HttpRequest.newBuilder(URI.create(encodeURI(asset.url))).GET()
277-
.setHeader("User-Agent", "ModManager ${ModManager.getVersion()}").build()
278-
val response = this.http.send(request, HttpResponse.BodyHandlers.ofFile(jar))
279-
if (response.statusCode() != 200) {
280-
ModUpdateResult.Error(TranslatableText("modmanager.error.invalidStatus", response.statusCode()))
281-
}
272+
val response = HttpClient.getInputStream(encodeURI(asset.url))
273+
Files.copy(response, jar)
282274
val expected = asset.hashes["sha512"]
283275
val calculated = jar.sha512()
284276
if (calculated != expected) {
@@ -297,7 +289,10 @@ class UpdateManager {
297289
ModManager.modManager.changed = true
298290
ModUpdateResult.Success
299291
} catch (e: Exception) {
300-
e.printStackTrace()
292+
logger.error("Error while updating: ", e)
293+
if (e is HttpClient.InvalidStatusCodeException) {
294+
ModUpdateResult.Error(TranslatableText("modmanager.error.invalidStatus", e.statusCode))
295+
}
301296
ModUpdateResult.Error(TranslatableText("modmanager.error.unknown.update", e))
302297
}
303298
}
@@ -387,8 +382,8 @@ class UpdateManager {
387382
}
388383
logger.info("Deleting {} mods on the next start", deletableMods.size)
389384
val configFile = FabricLoader.getInstance().configDir.resolve(".modmanager.delete.json")
390-
val data = json.encodeToString(deletableMods)
391-
Files.writeString(configFile, data, Charsets.UTF_8)
385+
val data = json.encodeToString(deletableMods).encodeToByteArray()
386+
Files.write(configFile, data)
392387
}
393388

394389

src/main/resources/fabric.mod.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,6 @@
4545
"modmenu": "~${modmenu_version}",
4646
"fabric-language-kotlin": ">=${fabric_kotlin_version}",
4747
"minecraft": "1.16.5",
48-
"java": ">=16"
48+
"java": ">=8"
4949
}
5050
}

src/main/resources/modmanager.mixins.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"required": true,
33
"minVersion": "0.8",
44
"package": "xyz.deathsgun.modmanager.mixin",
5-
"compatibilityLevel": "JAVA_16",
5+
"compatibilityLevel": "JAVA_8",
66
"mixins": [
77
],
88
"client": [

0 commit comments

Comments
 (0)