From b546141d34a5eb0f1b0be33c7df4f91484120f4c Mon Sep 17 00:00:00 2001 From: comp500 Date: Fri, 15 Nov 2019 23:31:27 +0000 Subject: [PATCH] Correctly handle import/export of .disabled (optional disabled) mods --- curseforge/export.go | 6 +++++- curseforge/packinterop/manifest.go | 5 +++-- curseforge/packinterop/minecraftinstance.go | 7 +++++-- curseforge/packinterop/translation.go | 6 ++++-- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/curseforge/export.go b/curseforge/export.go index 12f9fde..50fb795 100644 --- a/curseforge/export.go +++ b/curseforge/export.go @@ -54,7 +54,11 @@ var exportCmd = &cobra.Command{ // TODO: how to handle files with CF metadata, but with different download path? if ok { p := projectRaw.(cfUpdateData) - cfFileRefs = append(cfFileRefs, packinterop.AddonFileReference{ProjectID: p.ProjectID, FileID: p.FileID}) + cfFileRefs = append(cfFileRefs, packinterop.AddonFileReference{ + ProjectID: p.ProjectID, + FileID: p.FileID, + OptionalDisabled: mod.Option != nil && mod.Option.Optional && !mod.Option.Default, + }) } else { // If the mod doesn't have the metadata, save it into the zip path, err := filepath.Rel(filepath.Dir(indexPath), mod.GetDestFilePath()) diff --git a/curseforge/packinterop/manifest.go b/curseforge/packinterop/manifest.go index a2f4f0d..5ca05b1 100644 --- a/curseforge/packinterop/manifest.go +++ b/curseforge/packinterop/manifest.go @@ -52,8 +52,9 @@ func (c cursePackMeta) Mods() []AddonFileReference { list := make([]AddonFileReference, len(c.Files)) for i, v := range c.Files { list[i] = AddonFileReference{ - ProjectID: v.ProjectID, - FileID: v.FileID, + ProjectID: v.ProjectID, + FileID: v.FileID, + OptionalDisabled: !v.Required, } } return list diff --git a/curseforge/packinterop/minecraftinstance.go b/curseforge/packinterop/minecraftinstance.go index f859f35..1bd6c8f 100644 --- a/curseforge/packinterop/minecraftinstance.go +++ b/curseforge/packinterop/minecraftinstance.go @@ -21,6 +21,8 @@ type twitchInstalledPackMeta struct { File struct { // I've given up on using this cached data, just going to re-request it ID int `json:"id"` + // Used to determine if the mod is optional-disabled + FileNameOnDisk string } `json:"installedFile"` } `json:"installedAddons"` // Used to determine if modpackOverrides should be used or not @@ -51,8 +53,9 @@ func (m twitchInstalledPackMeta) Mods() []AddonFileReference { list := make([]AddonFileReference, len(m.ModsInternal)) for i, v := range m.ModsInternal { list[i] = AddonFileReference{ - ProjectID: v.ID, - FileID: v.File.ID, + ProjectID: v.ID, + FileID: v.File.ID, + OptionalDisabled: strings.HasSuffix(v.File.FileNameOnDisk, ".disabled"), } } return list diff --git a/curseforge/packinterop/translation.go b/curseforge/packinterop/translation.go index c7f454a..111c257 100644 --- a/curseforge/packinterop/translation.go +++ b/curseforge/packinterop/translation.go @@ -61,10 +61,12 @@ func ReadMetadata(s ImportPackSource) ImportPackMetadata { return packImport } -// AddonFileReference is a pair of Project ID and File ID to reference a single file on CurseForge +// AddonFileReference is a struct to reference a single file on CurseForge type AddonFileReference struct { ProjectID int FileID int + // OptionalDisabled is true if the file is optional and disabled (turned off in Twitch launcher) + OptionalDisabled bool } func WriteManifestFromPack(pack core.Pack, fileRefs []AddonFileReference, out io.Writer) error { @@ -79,7 +81,7 @@ func WriteManifestFromPack(pack core.Pack, fileRefs []AddonFileReference, out io ProjectID int `json:"projectID"` FileID int `json:"fileID"` Required bool `json:"required"` - }{ProjectID: fr.ProjectID, FileID: fr.FileID, Required: true} + }{ProjectID: fr.ProjectID, FileID: fr.FileID, Required: !fr.OptionalDisabled} } modLoaders := make([]modLoaderDef, 0, 1)