mirror of
https://github.com/packwiz/packwiz.git
synced 2025-11-19 01:24:32 +01:00
Implement pack importing/exporting for downloaded Curseforge packs
Abstract out hash implementations Implement file saving/downloading
This commit is contained in:
104
curseforge/packinterop/manifest.go
Normal file
104
curseforge/packinterop/manifest.go
Normal file
@@ -0,0 +1,104 @@
|
||||
package packinterop
|
||||
|
||||
import "strings"
|
||||
|
||||
type cursePackMeta struct {
|
||||
Minecraft struct {
|
||||
Version string `json:"version"`
|
||||
ModLoaders []modLoaderDef `json:"modLoaders"`
|
||||
} `json:"minecraft"`
|
||||
ManifestType string `json:"manifestType"`
|
||||
ManifestVersion int `json:"manifestVersion"`
|
||||
NameInternal string `json:"name"`
|
||||
Version string `json:"version"`
|
||||
Author string `json:"author"`
|
||||
ProjectID int `json:"projectID"`
|
||||
Files []struct {
|
||||
ProjectID int `json:"projectID"`
|
||||
FileID int `json:"fileID"`
|
||||
Required bool `json:"required"`
|
||||
} `json:"files"`
|
||||
Overrides string `json:"overrides"`
|
||||
importSrc ImportPackSource
|
||||
}
|
||||
|
||||
type modLoaderDef struct {
|
||||
ID string `json:"id"`
|
||||
Primary bool `json:"primary"`
|
||||
}
|
||||
|
||||
func (c cursePackMeta) Name() string {
|
||||
return c.NameInternal
|
||||
}
|
||||
|
||||
func (c cursePackMeta) Versions() map[string]string {
|
||||
vers := make(map[string]string)
|
||||
vers["minecraft"] = c.Minecraft.Version
|
||||
for _, v := range c.Minecraft.ModLoaders {
|
||||
// Seperate dash-separated modloader/version pairs
|
||||
parts := strings.SplitN(v.ID, "-", 2)
|
||||
if len(parts) == 2 {
|
||||
vers[parts[0]] = parts[1]
|
||||
}
|
||||
}
|
||||
if val, ok := vers["forge"]; ok {
|
||||
// Remove the minecraft version prefix, if it exists
|
||||
vers["forge"] = strings.TrimPrefix(val, c.Minecraft.Version+"-")
|
||||
}
|
||||
return vers
|
||||
}
|
||||
|
||||
func (c cursePackMeta) Mods() []struct {
|
||||
ModID int
|
||||
FileID int
|
||||
} {
|
||||
list := make([]struct {
|
||||
ModID int
|
||||
FileID int
|
||||
}, len(c.Files))
|
||||
for i, v := range c.Files {
|
||||
list[i] = struct {
|
||||
ModID int
|
||||
FileID int
|
||||
}{
|
||||
ModID: v.ProjectID,
|
||||
FileID: v.FileID,
|
||||
}
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
||||
type cursePackOverrideWrapper struct {
|
||||
name string
|
||||
ImportPackFile
|
||||
}
|
||||
|
||||
func (w cursePackOverrideWrapper) Name() string {
|
||||
return w.name
|
||||
}
|
||||
|
||||
func (c cursePackMeta) GetFiles() ([]ImportPackFile, error) {
|
||||
// Only import files from overrides directory
|
||||
if len(c.Overrides) > 0 {
|
||||
fullList, err := c.importSrc.GetFileList()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
overridesList := make([]ImportPackFile, 0, len(fullList))
|
||||
overridesPath := c.Overrides
|
||||
if !strings.HasSuffix(overridesPath, "/") {
|
||||
overridesPath = c.Overrides + "/"
|
||||
}
|
||||
// Wrap files, removing overrides/ from the start
|
||||
for _, v := range fullList {
|
||||
if strings.HasPrefix(v.Name(), overridesPath) {
|
||||
overridesList = append(overridesList, cursePackOverrideWrapper{
|
||||
name: strings.TrimPrefix(v.Name(), overridesPath),
|
||||
ImportPackFile: v,
|
||||
})
|
||||
}
|
||||
}
|
||||
return overridesList, nil
|
||||
}
|
||||
return []ImportPackFile{}, nil
|
||||
}
|
||||
Reference in New Issue
Block a user