Skip to content

Commit

Permalink
Patching LWGJL and Jar
Browse files Browse the repository at this point in the history
  • Loading branch information
ezfe committed Sep 6, 2021
1 parent 08eee45 commit 1010315
Show file tree
Hide file tree
Showing 9 changed files with 213 additions and 92 deletions.
15 changes: 9 additions & 6 deletions Sources/Common/Downloadable.swift
Expand Up @@ -12,12 +12,12 @@ public protocol Downloadable {
var sha1: String { get }
}

public protocol URLModifiable {
public protocol DownloadableModifiable: Downloadable {
var url: String { get set }
}

public extension Downloadable {
func download() async throws -> Data {
func download(checkSha1: Bool = true) async throws -> Data {
guard let url = URL(string: self.url) else {
throw CError.unknownError("Failed to create URL from \(self.url)")
}
Expand All @@ -28,12 +28,15 @@ public extension Downloadable {
} catch let err {
throw CError.networkError(err.localizedDescription)
}
let foundSha1 = data.sha1()

if checkSha1 {
let foundSha1 = data.sha1()

if foundSha1 != sha1 {
throw CError.sha1Error(sha1, foundSha1)
if foundSha1 != sha1 {
throw CError.sha1Error(sha1, foundSha1)
}
}

return data
}
}
11 changes: 7 additions & 4 deletions Sources/InstallationManager/Assets/AssetsIndex.swift
Expand Up @@ -11,12 +11,15 @@ import Common
public struct AssetsIndex: Codable {
public var objects: [String: Metadata]

public struct Metadata: Codable, Downloadable, URLModifiable {
public let hash: String
public let size: UInt
public struct Metadata: Codable, DownloadableModifiable {
public private(set) var hash: String
public var size: UInt
public var url: String

public var sha1: String { self.hash }
public var sha1: String {
get { self.hash }
set { self.hash = newValue }
}

enum CodingKeys: CodingKey {
case hash
Expand Down
26 changes: 13 additions & 13 deletions Sources/InstallationManager/InstallationManager.swift
Expand Up @@ -78,25 +78,25 @@ extension InstallationManager {
return URL(fileURLWithPath: "versions/\(version)", relativeTo: self.baseDirectory)
}

func getManifest(url: VersionManifest.ManifestUrls) async throws -> VersionManifest {
if let manifest = self.manifests[url] {
func getManifest(_ type: VersionManifest.ManifestUrls) async throws -> VersionManifest {
if let manifest = self.manifests[type] {
return manifest
} else {
let manifest = try await VersionManifest.downloadManifest(url: url)
self.manifests[url] = manifest
let manifest = try await VersionManifest.downloadManifest(type)
self.manifests[type] = manifest
return manifest
}
}

public func availableVersions(url: VersionManifest.ManifestUrls) async throws -> [VersionManifest.VersionMetadata] {
return try await self.getManifest(url: url).versions
public func availableVersions(_ type: VersionManifest.ManifestUrls) async throws -> [VersionManifest.VersionMetadata] {
return try await self.getManifest(type).versions
}

public func use(version: VersionManifest.VersionType) {
self.versionRequested = version
}

public func downloadVersionInfo(url: VersionManifest.ManifestUrls) async throws -> VersionPackage {
public func downloadVersionInfo(_ type: VersionManifest.ManifestUrls) async throws -> VersionPackage {
let fm = FileManager.default

// Check if the file exists on the local file system, and if it does
Expand Down Expand Up @@ -133,12 +133,12 @@ extension InstallationManager {

// If we haven't aborted at this point, then no file already exists, or one
// did and has been removed in the meantime.
let manifest = try await self.getManifest(url: url)
let manifest = try await self.getManifest(type)
guard let entry = manifest.get(version: self.versionRequested) else {
throw CError.unknownVersion("\(self.versionRequested)")
}

let versionData = try await retrieveData(url: entry.url)
let versionData = try await entry.download()

let package = try VersionPackage.decode(from: versionData)

Expand Down Expand Up @@ -355,14 +355,14 @@ extension InstallationManager {
return URL(fileURLWithPath: "runtimes", relativeTo: self.baseDirectory)
}

func javaVersionInfo(url: VersionManifest.ManifestUrls) async throws -> VersionManifest.JavaVersionInfo {
func javaVersionInfo(_ type: VersionManifest.ManifestUrls) async throws -> VersionManifest.JavaVersionInfo {
guard let version = self.version else {
throw CError.stateError("\(#function) must not be called before `version` is set")
}

let javaVersion = version.javaVersion?.majorVersion ?? 8

let versions = try await self.getManifest(url: url).javaVersions ?? []
let versions = try await self.getManifest(type).javaVersions ?? []
let info = versions.first { $0.version == javaVersion }

if let info = info {
Expand All @@ -372,7 +372,7 @@ extension InstallationManager {
}
}

public func downloadJava(url: VersionManifest.ManifestUrls) async throws -> URL {
public func downloadJava(_ type: VersionManifest.ManifestUrls) async throws -> URL {
guard let version = self.version else {
throw CError.stateError("\(#function) must not be called before `version` is set")
}
Expand All @@ -385,7 +385,7 @@ extension InstallationManager {
let bundleDestinationURL = self.javaVersionDirectory()
.appendingPathComponent("java-\(javaVersion).bundle")

let javaVersionInfo = try await javaVersionInfo(url: url)
let javaVersionInfo = try await javaVersionInfo(type)

guard let remoteURL = URL(string: javaVersionInfo.url) else {
throw CError.decodingError("Failed to convert \(javaVersionInfo.url) to URL")
Expand Down
2 changes: 1 addition & 1 deletion Sources/InstallationManager/MirrorManager.swift
Expand Up @@ -43,7 +43,7 @@ public struct MirrorRequest<Element: Downloadable> {
data: data)
}

if var modified = self.source as? URLModifiable {
if var modified = self.source as? DownloadableModifiable {
print("Record is mutable, assigning new URL")
modified.url = "\(authorization.downloadUrl)/file/\(bucket.bucketName)/\(fileInfo.fileName)"
return modified as! Element
Expand Down
35 changes: 23 additions & 12 deletions Sources/InstallationManager/Versions/VersionManifest.swift
Expand Up @@ -8,29 +8,40 @@
import Foundation
import Common

public struct VersionManifest: Decodable {
public struct VersionManifest: Codable {
public let latest: Latest
public let versions: [VersionMetadata]
public var versions: [VersionMetadata]
let javaVersions: [JavaVersionInfo]?

public struct VersionMetadata: Decodable {
public struct VersionMetadata: Codable, Downloadable {
public let id: String
let type: String
public let url: URL
let time: Date
let releaseTime: Date
public let url: String
public let sha1: String

public init(id: String, type: String, time: Date, releaseTime: Date, url: String, sha1: String) {
self.id = id
self.type = type
self.time = time
self.releaseTime = releaseTime
self.url = url
self.sha1 = sha1
}

}

public struct Latest: Decodable {
public struct Latest: Codable {
let release: String
let snapshot: String
}

public struct JavaVersionInfo: Decodable {
public struct JavaVersionInfo: Codable, Downloadable, DownloadableModifiable {
let version: Int
let url: String
let size: UInt
let sha1: String
public var url: String
public var size: UInt
public var sha1: String
}
}

Expand All @@ -40,10 +51,11 @@ public extension VersionManifest {
enum ManifestUrls: String {
case mojang = "https://launchermeta.mojang.com/mc/game/version_manifest_v2.json"
case legacyCustom = "https://f001.backblazeb2.com/file/com-ezekielelin-publicFiles/lwjgl-arm/version_manifest_v2.json"
case backblaze = "https://f001.backblazeb2.com/file/minecraft-jar-command/version_manifest.json"
}

static func downloadManifest(url: ManifestUrls) async throws -> VersionManifest {
let url = URL(string: url.rawValue)!
static func downloadManifest(_ type: ManifestUrls) async throws -> VersionManifest {
let url = URL(string: type.rawValue)!
let manifestData = try await retrieveData(url: url)

let decoder = JSONDecoder()
Expand All @@ -52,7 +64,6 @@ public extension VersionManifest {
do {
let manifest = try decoder.decode(VersionManifest.self, from: manifestData)
return manifest

} catch let error {
print(error)
throw CError.decodingError("Failed to decode Version Manifest")
Expand Down
34 changes: 17 additions & 17 deletions Sources/InstallationManager/Versions/VersionPackage.swift
Expand Up @@ -21,7 +21,7 @@ public struct VersionPackage: Codable {
public let minimumLauncherVersion: UInt
public var releaseTime: Date
public var time: Date
let type: ReleaseType
public let type: ReleaseType

public let arguments: Arguments
public var assetIndex: AssetIndex
Expand Down Expand Up @@ -148,7 +148,7 @@ extension VersionPackage {
// MARK:- Asset Index

extension VersionPackage {
public struct AssetIndex: Codable, Downloadable, URLModifiable {
public struct AssetIndex: Codable, DownloadableModifiable {
let id: String
public var sha1: String
public var size: UInt
Expand All @@ -166,9 +166,9 @@ extension VersionPackage {
public var server: Download
public var serverMappings: Download

public struct Download: Codable, Downloadable, URLModifiable {
public let sha1: String
public let size: UInt
public struct Download: Codable, DownloadableModifiable {
public var sha1: String
public var size: UInt
public var url: String
}
}
Expand All @@ -178,7 +178,7 @@ extension VersionPackage {

extension VersionPackage {
public struct Library: Codable {
public let name: String
public var name: String
public var downloads: Download
public let natives: Natives?
public let rules: [Rule]?
Expand All @@ -187,18 +187,18 @@ extension VersionPackage {
public var artifact: Artifact
public var classifiers: [String: Artifact]?

public struct Artifact: Codable, Downloadable, URLModifiable {
public let path: String
public let sha1: String
public let size: UInt
public struct Artifact: Codable, Downloadable, DownloadableModifiable {
public var path: String
public var sha1: String
public var size: UInt
public var url: String
}
}

public struct Natives: Codable {
let linux: String?
let osx: String?
let windows: String?
public let linux: String?
public let osx: String?
public let windows: String?
}
}
}
Expand All @@ -214,10 +214,10 @@ extension VersionPackage {
let file: File
let type: String

struct File: Codable, Downloadable, URLModifiable {
struct File: Codable, Downloadable, DownloadableModifiable {
let id: String
let sha1: String
let size: UInt
var sha1: String
var size: UInt
var url: String
}
}
Expand All @@ -227,7 +227,7 @@ extension VersionPackage {
// MARK:- Release Type

extension VersionPackage {
enum ReleaseType: String, Codable {
public enum ReleaseType: String, Codable {
case release, snapshot
}
}
Expand Down
4 changes: 2 additions & 2 deletions Sources/minecraft-jar-command/Commands/ArmPatchCommand.swift
Expand Up @@ -33,8 +33,8 @@ struct ArmPatchCommand: ParsableCommand {
let group = DispatchGroup()
group.enter()
Task.init {
let mojangVersion = try await mojangManager.downloadVersionInfo(url: .mojang)
let armVersion = try await customManager.downloadVersionInfo(url: .legacyCustom)
let mojangVersion = try await mojangManager.downloadVersionInfo(.mojang)
let armVersion = try await customManager.downloadVersionInfo(.legacyCustom)

var newVersion = armVersion

Expand Down
8 changes: 4 additions & 4 deletions Sources/minecraft-jar-command/Commands/RunCommand.swift
Expand Up @@ -97,7 +97,7 @@ struct RunCommand: ParsableCommand {
if mojangManifest {
manifestUrl = .mojang
} else {
manifestUrl = .legacyCustom
manifestUrl = .backblaze
}


Expand Down Expand Up @@ -126,23 +126,23 @@ struct RunCommand: ParsableCommand {
// MARK: Version Info
if listVersions {
print("Finding available versions...")
let versions = try await installationManager.availableVersions(url: manifestUrl)
let versions = try await installationManager.availableVersions(manifestUrl)
print("Available versions:")
for version in versions {
print("\t\(version.id)")
}
MainCommand.exit()
}

let versionInfo = try await installationManager.downloadVersionInfo(url: manifestUrl)
let versionInfo = try await installationManager.downloadVersionInfo(manifestUrl)
guard versionInfo.minimumLauncherVersion >= 21 else {
print("Unfortunately, \(versionInfo.id) isn't available from this utility")
print("This utility is only tested with the latest version, and does not work with versions prior to 1.13")
MainCommand.exit()
}

try await installationManager.downloadJar()
async let _ = try await installationManager.downloadJava(url: manifestUrl)
async let _ = try await installationManager.downloadJava(manifestUrl)
async let _ = try await installationManager.downloadAssets()
async let _ = try await installationManager.downloadLibraries()
} catch let err {
Expand Down

0 comments on commit 1010315

Please sign in to comment.