Skip to content

Commit

Permalink
Merge branch 'development' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
froehlichA committed Dec 8, 2022
2 parents 1ccdc23 + 11f847b commit f9a1b34
Show file tree
Hide file tree
Showing 12 changed files with 194 additions and 12 deletions.
10 changes: 10 additions & 0 deletions src/api/cfcore.nim
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,16 @@ proc isFabricCompatible*(file: CfAddonFile): bool =
return true
return false

proc isQuiltCompatible*(file: CfAddonFile): bool =
## returns true if `file` is compatible with the quilt loader.
if "Quilt".Version in file.gameVersions:
return true
if file.name.toLower.match(re".*\Wquilt\W.*"):
return true
if isFabricCompatible(file):
return true
return false

proc isForgeCompatible*(file: CfAddonFile): bool =
## returns true if `file` is compatible with the forge loader.
if file.name.toLower.match(re".*\Wquilt\W.*") or file.name.toLower.match(re".*\Wfabric\W.*"):
Expand Down
2 changes: 2 additions & 0 deletions src/api/metadata.nim
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,13 @@ proc toModloaderId(loaderVersion: string, loader: Loader): string =
## get the modloader id fitting for the given loader version and loader
return case loader:
of Loader.Forge: "forge-" & loaderVersion.split("-")[1]
of Loader.Quilt: "forge-" & loaderVersion.split("-")[1]
of Loader.Fabric: "fabric-" & loaderVersion

proc getModloaderId*(mcVersion: Version, loader: Loader, latest: bool = false): Future[string] {.async.} =
## get the modloader id fitting for the given minecraft version and loader
let loaderVersion = case loader:
of Loader.Forge: await mcVersion.getForgeLoaderVersion(latest)
of Loader.Fabric: mcVersion.getFabricLoaderVersion().await.toModloaderId(loader)
of Loader.Quilt: await mcVersion.getForgeLoaderVersion(latest)
return loaderVersion
23 changes: 20 additions & 3 deletions src/cmd/init.nim
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import std/[asyncdispatch, os, osproc]
import ../api/metadata
import ../modpack/[manifest, loader, version]
import ../api/[cfclient, cfcore, metadata]
import ../modpack/[manifest, install, loader, version]
import ../term/[log, prompt]
import ../util/flow

Expand All @@ -13,9 +13,26 @@ proc paxInitManifest(): void =
manifest.version = prompt(indentPrefix & "Modpack version", default = "1.0.0")
manifest.mcVersion = Version(prompt(indentPrefix & "Minecraft version", default = "1.16.5"))

let loader = prompt(indentPrefix & "Loader", choices = @["forge", "fabric"], default = "forge").toLoader
let loader = prompt(indentPrefix & "Loader", choices = @["forge", "fabric", "quilt"], default = "forge").toLoader
manifest.mcModloaderId = waitFor(manifest.mcVersion.getModloaderId(loader))
echoDebug "Installed ", $loader, " version ", manifest.mcModloaderId.fgGreen
if loader == Loader.Quilt:
let mcJumploaderMod = waitFor(fetchAddon(640265))
let mcJumploaderModFiles = waitFor(fetchAddonFiles(mcJumploaderMod.projectId))
let mcJumploaderModFile = mcJumploaderModFiles.selectAddonFile(loader, manifest.mcVersion, InstallStrategy.Recommended)
let jumploaderMod = initManifestFile(
projectId = mcJumploaderMod.projectId,
fileId = mcJumploaderModFile.fileId,
metadata = initManifestMetadata(
name = mcJumploaderMod.name,
explicit = true,
pinned = true,
dependencies = mcJumploaderModFile.dependencies
)
)
manifest.installAddon(jumploaderMod)
echoDebug "Installed Jumploader."
echoWarn "Quilt support is experimental. Report all issues to https://github.com/froehlichA/pax/issues."

echoInfo "Creating manifest.."
removeDir(packFolder)
Expand Down
2 changes: 1 addition & 1 deletion src/cmd/version.nim
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import ../modpack/[manifest, loader, version]
import ../term/log

proc paxVersion*(version: string, loader: string, latest: bool): void =
## change the minecraft version (and set the recommended fabric/forge version for it)
## change the minecraft version (and set the recommended fabric/forge/quilt version for it)
requirePaxProject()

echoDebug "Loading data from manifest.."
Expand Down
3 changes: 2 additions & 1 deletion src/modpack/install.nim
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,11 @@ proc selectAddonFile*(files: seq[CfAddonFile], mpLoader: Loader, mpMcVersion: Ve
if result.isNil or result.fileId < file.fileId:
let onFabric = mpLoader == Loader.Fabric and file.isFabricCompatible
let onForge = mpLoader == Loader.Forge and file.isForgeCompatible
let onQuilt = mpLoader == Loader.Quilt and file.isQuiltCompatible
let onStable = strategy == InstallStrategy.Stable and file.isStable(mpMcVersion)
let onRecommended = strategy == InstallStrategy.Recommended and file.isRecommended(mpMcVersion)
let onNewest = strategy == InstallStrategy.Newest and file.isNewest(mpMcVersion)
if onFabric or onForge:
if onFabric or onForge or onQuilt:
if onStable or onRecommended or onNewest:
result = file

Expand Down
6 changes: 4 additions & 2 deletions src/modpack/loader.nim
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,19 @@ import std/[strformat, strutils]

type
Loader* = enum
Fabric, Forge
Fabric, Forge, Quilt

converter toLoader*(str: string): Loader =
## cast a string to a Loader.
let str = str.toLower
return
if str.contains("forge"): Loader.Forge
elif str.contains("fabric"): Loader.Fabric
elif str.contains("quilt"): Loader.Quilt
else: raise newException(ValueError, fmt"'{str}' is not a loader")

proc `$`*(loader: Loader): string =
return case loader:
of Loader.Forge: "forge"
of Loader.Fabric: "fabric"
of Loader.Fabric: "fabric"
of Loader.Quilt: "quilt"
8 changes: 6 additions & 2 deletions src/modpack/manifest.nim
Original file line number Diff line number Diff line change
Expand Up @@ -135,8 +135,12 @@ converter toJson*(manifest: Manifest): JsonNode =
}

proc loader*(manifest: Manifest): Loader =
## returns the loader from the manifest (either Fabric or Forge)
return manifest.mcModloaderId.toLoader
## returns the loader from the manifest (either Fabric, Forge or Quilt)
let loader = manifest.mcModloaderId.toLoader
# Quilt uses the Forge loader and JumpQuilt, so handle that edge case
if loader == Loader.Forge and manifest.files.filter(f => f.projectId == 640265).len > 0:
return Loader.Quilt
return loader

proc isInstalled*(manifest: Manifest, projectId: int): bool =
## returns true if the ManifestFile with the given `projectId` is installed
Expand Down
2 changes: 1 addition & 1 deletion src/pax.nim
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ let versionCmd = (
help = "Minecraft version"
),
loader: newStringArg(@["-l", "--loader"],
choices = @["fabric", "forge"],
choices = @["fabric", "forge", "quilt"],
help = "which loader to use"
),
latest: newCountArg(@["--latest"],
Expand Down
13 changes: 13 additions & 0 deletions tests/api/tmetadata.nim
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,17 @@ asyncBlock:
doAssertRaises(MetadataClientError):
discard await getModloaderId("0.0.0".Version, Loader.Forge)

asyncBlock: # getModLoaderId on Quilt delegates to Forge
let forgeId = await getModloaderId("1.12.2".Version, Loader.Forge)
let quiltId = await getModloaderId("1.12.2".Version, Loader.Quilt)
doAssert forgeId == quiltId
asyncBlock:
let forgeId = await getModloaderId("1.16.5".Version, Loader.Forge)
let quiltId = await getModloaderId("1.16.5".Version, Loader.Quilt)
doAssert forgeId == quiltId
asyncBlock:
let forgeId = await getModloaderId("1.16.5".Version, Loader.Forge, latest = true)
let quiltId = await getModloaderId("1.16.5".Version, Loader.Quilt, latest = true)
doAssert forgeId == quiltId

runTests()
27 changes: 27 additions & 0 deletions tests/cmd/tinit/tinit_quilt.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
discard """
joinable: false
batchable: false
input: '''
y
testmodpack
testauthor
1.2.3
1.18.2
quilt
'''
"""

import std/[sequtils, strutils, sugar, os, json]
import cmd/init

block:
removeDir("./modpack")
paxInit(force = false, skipManifest = false, skipGit = true)
let manifest = readFile("./modpack/manifest.json").parseJson

doAssert manifest["minecraft"]["version"].getStr == "1.18.2"
doAssert manifest["minecraft"]["modLoaders"][0]["id"].getStr.startsWith("forge")
doAssert manifest["version"].getStr == "1.2.3"
doAssert manifest["author"].getStr == "testauthor"
doAssert manifest["name"].getStr == "testmodpack"
doAssert manifest["files"].getElems.filter(f => f["projectID"].getInt == 640265).len > 0
108 changes: 107 additions & 1 deletion tests/modpack/tinstall.nim
Original file line number Diff line number Diff line change
Expand Up @@ -145,14 +145,78 @@ block: # select out of implied fabric mods
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[0]
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]

block: # select out of specified quilt mods
let loader = Loader.Quilt
var mcVersion: Version
let mods = @[
initCfAddonFile(301, "rei-1.0.2.jar", @["1.14.1", "1.14.4", "Quilt"], CfAddonFileReleaseType.Release),
initCfAddonFile(201, "rei-1.0.1.jar", @["1.14", "1.14.1", "Quilt"], CfAddonFileReleaseType.Release),
initCfAddonFile(101, "rei-1.0.0.jar", @["1.14", "Quilt"], CfAddonFileReleaseType.Beta)
]

mcVersion = "1.12".Version
doAssertRaises(PaxInstallError):
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable)
doAssertRaises(PaxInstallError):
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended)
doAssertRaises(PaxInstallError):
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest)

mcVersion = "1.14".Version
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable) == mods[1]
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[1]
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]

mcVersion = "1.14.1".Version
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable) == mods[0]
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[0]
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]

mcVersion = "1.14.4".Version
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable) == mods[0]
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[0]
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]

block: # select out of implied quilt mods
let loader = Loader.Quilt
var mcVersion: Version
let mods = @[
initCfAddonFile(301, "rei-1.0.2-quilt.jar", @["1.14.1", "1.14.4"], CfAddonFileReleaseType.Alpha),
initCfAddonFile(201, "rei-1.0.1-fabric.jar", @["1.14", "1.14.1"], CfAddonFileReleaseType.Beta),
initCfAddonFile(101, "rei-1.0.0-fabric.jar", @["1.14", "Fabric", "Quilt"], CfAddonFileReleaseType.Release)
]

mcVersion = "1.12".Version
doAssertRaises(PaxInstallError):
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable)
doAssertRaises(PaxInstallError):
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended)
doAssertRaises(PaxInstallError):
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest)

mcVersion = "1.14".Version
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable) == mods[2]
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[1]
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]

mcVersion = "1.14.1".Version
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable) == mods[0]
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[0]
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]

mcVersion = "1.14.4".Version
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable) == mods[0]
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[0]
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]

block: # select out of mixed mods
var loader: Loader
var mcVersion: Version
let mods = @[
initCfAddonFile(801, "abc-1.3.2-fabric.jar", @["1.16.1", "1.16.2"], CfAddonFileReleaseType.Release),
initCfAddonFile(701, "abc-1.3.2-FORGE.jar", @["1.16.1", "1.16.2"], CfAddonFileReleaseType.Release),
initCfAddonFile(601, "abc-1.2.2.jar", @["1.16", "1.16.1", "Forge"], CfAddonFileReleaseType.Alpha),
initCfAddonFile(501, "abc-1.2.1.jar", @["1.16.1", "Fabric"], CfAddonFileReleaseType.Alpha),
initCfAddonFile(501, "abc-1.2.1.jar", @["1.16.1", "Fabric", "Quilt"], CfAddonFileReleaseType.Alpha),
initCfAddonFile(401, "abc-1.2.1.jar", @["1.16", "1.16.1", "Forge"], CfAddonFileReleaseType.Release),
initCfAddonFile(301, "abc-1.2.0-FABRIC.jar", @["1.16"], CfAddonFileReleaseType.Release),
initCfAddonFile(201, "abc-1.0.1.jar", @["1.14.4"], CfAddonFileReleaseType.Beta),
Expand Down Expand Up @@ -237,6 +301,48 @@ block: # select out of mixed mods
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[0]
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]

# Set loader to quilt
loader = Loader.Quilt

mcVersion = "1.12".Version
doAssertRaises(PaxInstallError):
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable)
doAssertRaises(PaxInstallError):
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended)
doAssertRaises(PaxInstallError):
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest)

mcVersion = "1.14".Version
doAssertRaises(PaxInstallError):
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable)
doAssertRaises(PaxInstallError):
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended)
doAssertRaises(PaxInstallError):
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest)

mcVersion = "1.14.1".Version
doAssertRaises(PaxInstallError):
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable)
doAssertRaises(PaxInstallError):
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended)
doAssertRaises(PaxInstallError):
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest)

mcVersion = "1.16".Version
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable) == mods[5]
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[5]
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]

mcVersion = "1.16.1".Version
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable) == mods[0]
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[0]
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]

mcVersion = "1.16.2".Version
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable) == mods[0]
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[0]
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]

block: # prevent quilt mods from being selected for forge
let loader = Loader.Forge
let mcVersion = "1.16.1".Version
Expand Down
2 changes: 1 addition & 1 deletion tests/modpack/tversion.nim
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,6 @@ block: # `minor` function
doAssert "1.13-Snapshot".Version.minor == "1.13".Version

block: # `proper` function
doAssert @["1.16.4".Version, "Fabric".Version, "Forge".Version].proper == @["1.16.4".Version]
doAssert @["1.16.4".Version, "Fabric".Version, "Forge".Version, "Quilt".Version].proper == @["1.16.4".Version]
doAssert @["Forge".Version, "1.12-Snapshot".Version].proper == @["1.12-Snapshot".Version]

0 comments on commit f9a1b34

Please sign in to comment.