core

package
v0.0.0-...-96ce845 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 22, 2022 License: MIT Imports: 30 Imported by: 0

Documentation

Index

Constants

View Source
const (
	ServerSide    = "server"
	ClientSide    = "client"
	UniversalSide = "both"
)

The three possible values of Side (the side that the mod is on) are "server", "client", and "both". noinspection GoUnusedConst

View Source
const CurrentPackFormat = "packwiz:1.1.0"
View Source
const DownloadCacheImportFolder = "import"
View Source
const MetaExtension = ".pw.toml"

MetaExtension is the file extension of the mod metadata files Note that this is currently not required; it will only be used for new files.

View Source
const MetaExtensionOld = ".toml"

Variables

View Source
var MetaDownloaders = make(map[string]MetaDownloader)

MetaDownloaders stores all the metadata-based installers that packwiz can use. Add your own downloaders to this map, keyed by the source name.

View Source
var ModLoaders = map[string]ModLoaderComponent{
	"fabric": {

		Name:              "fabric",
		FriendlyName:      "Fabric loader",
		VersionListGetter: FetchMavenVersionList("https://maven.fabricmc.net/net/fabricmc/fabric-loader/maven-metadata.xml"),
	},
	"forge": {
		Name:              "forge",
		FriendlyName:      "Forge",
		VersionListGetter: FetchMavenVersionPrefixedListStrip("https://files.minecraftforge.net/maven/net/minecraftforge/forge/maven-metadata.xml", "Forge"),
	},
	"liteloader": {
		Name:              "liteloader",
		FriendlyName:      "LiteLoader",
		VersionListGetter: FetchMavenVersionPrefixedList("http://repo.mumfrey.com/content/repositories/snapshots/com/mumfrey/liteloader/maven-metadata.xml", "LiteLoader"),
	},
	"quilt": {
		Name:              "quilt",
		FriendlyName:      "Quilt loader",
		VersionListGetter: FetchMavenVersionList("https://maven.quiltmc.org/repository/release/org/quiltmc/quilt-loader/maven-metadata.xml"),
	},
}
View Source
var PackFormatConstraintAccepted = mustParseConstraint("~1")
View Source
var PackFormatConstraintSuggestUpgrade = mustParseConstraint("~1.1")
View Source
var Updaters = make(map[string]Updater)

Updaters stores all the updaters that packwiz can use. Add your own update systems to this map, keyed by the configuration name.

Functions

func ComponentToFriendlyName

func ComponentToFriendlyName(component string) string

func FetchMavenVersionList

func FetchMavenVersionList(url string) func(mcVersion string) ([]string, string, error)

func FetchMavenVersionPrefixedList

func FetchMavenVersionPrefixedList(url string, friendlyName string) func(mcVersion string) ([]string, string, error)

func FetchMavenVersionPrefixedListStrip

func FetchMavenVersionPrefixedListStrip(url string, friendlyName string) func(mcVersion string) ([]string, string, error)

func GetPackwizCache

func GetPackwizCache() (string, error)

func GetPackwizInstallBinFile

func GetPackwizInstallBinFile() (string, error)

func GetPackwizInstallBinPath

func GetPackwizInstallBinPath() (string, error)

func GetPackwizLocalCache

func GetPackwizLocalCache() (string, error)

func GetPackwizLocalStore

func GetPackwizLocalStore() (string, error)

func ReencodeURL

func ReencodeURL(u string) (string, error)

ReencodeURL re-encodes URLs for RFC3986 compliance; as CurseForge URLs aren't properly encoded

Types

type CacheIndex

type CacheIndex struct {
	Version uint32
	Hashes  map[string][]string
	// contains filtered or unexported fields
}

func (*CacheIndex) GetHandleFromHash

func (c *CacheIndex) GetHandleFromHash(hashFormat string, hash string) *CacheIndexHandle

func (*CacheIndex) GetHandleFromHashForce

func (c *CacheIndex) GetHandleFromHashForce(hashFormat string, hash string) (*CacheIndexHandle, error)

GetHandleFromHashForce looks up the given hash in the index; but will rehash any file without this hash format to obtain the necessary hash. Only use this for manually downloaded files, as it can rehash every file in the cache, which can be more time-consuming than just redownloading the file and noticing it is already in the index!

func (*CacheIndex) MoveImportFiles

func (c *CacheIndex) MoveImportFiles() error

func (*CacheIndex) NewHandleFromHashes

func (c *CacheIndex) NewHandleFromHashes(hashes map[string]string) (*CacheIndexHandle, bool)

type CacheIndexHandle

type CacheIndexHandle struct {
	Hashes map[string]string
	// contains filtered or unexported fields
}

func (*CacheIndexHandle) CreateFromTemp

func (h *CacheIndexHandle) CreateFromTemp(temp *os.File) (*os.File, error)

func (*CacheIndexHandle) GetRemainingHashes

func (h *CacheIndexHandle) GetRemainingHashes(hashesToObtain []string) []string

func (*CacheIndexHandle) Open

func (h *CacheIndexHandle) Open() (*os.File, error)

func (*CacheIndexHandle) Path

func (h *CacheIndexHandle) Path() string

func (*CacheIndexHandle) UpdateIndex

func (h *CacheIndexHandle) UpdateIndex() (warnings []error)

type CompletedDownload

type CompletedDownload struct {
	// File is only populated when the download is successful; points to the opened cache file
	File *os.File
	Mod  *Mod
	// Hashes is only populated when the download is successful; contains all stored hashes of the file
	Hashes map[string]string
	// Error indicates if/why downloading this file failed
	Error error
	// Warnings indicates messages to show to the user regarding this file (download was successful, but had a problem)
	Warnings []error
}

type DownloadSession

type DownloadSession interface {
	GetManualDownloads() []ManualDownload
	StartDownloads() chan CompletedDownload
	SaveIndex() error
}

func CreateDownloadSession

func CreateDownloadSession(mods []*Mod, hashesToObtain []string) (DownloadSession, error)

type HashStringer

type HashStringer interface {
	hash.Hash
	HashToString([]byte) string
}

func GetHashImpl

func GetHashImpl(hashType string) (HashStringer, error)

GetHashImpl gets an implementation of hash.Hash for the given hash type string

type Index

type Index struct {
	HashFormat string      `toml:"hash-format"`
	Files      []IndexFile `toml:"files"`
	// contains filtered or unexported fields
}

Index is a representation of the index.toml file for referencing all the files in a pack.

func LoadIndex

func LoadIndex(indexFile string) (Index, error)

LoadIndex attempts to load the index file from a path

func (Index) FindMod

func (in Index) FindMod(modName string) (string, bool)

FindMod finds a mod in the index and returns it's path and whether it has been found

func (Index) GetAllMods

func (in Index) GetAllMods() []string

GetAllMods finds paths to every metadata file (Mod) in the index

func (Index) GetFilePath

func (in Index) GetFilePath(f IndexFile) string

GetFilePath attempts to get the path of the destination index file as it is stored on disk

func (Index) GetPackRoot

func (in Index) GetPackRoot() string

func (Index) LoadAllMods

func (in Index) LoadAllMods() ([]*Mod, error)

LoadAllMods reads all metadata files into Mod structs

func (*Index) Refresh

func (in *Index) Refresh() error

Refresh updates the hashes of all the files in the index, and adds new files to the index

func (*Index) RefreshFile

func (in *Index) RefreshFile(path string) error

RefreshFile calculates the hash for a given path and updates it in the index (also sorts the index)

func (*Index) RefreshFileWithHash

func (in *Index) RefreshFileWithHash(path, format, hash string, mod bool) error

RefreshFileWithHash updates a file in the index, given a file hash and whether it is a mod or not

func (*Index) RemoveFile

func (in *Index) RemoveFile(path string) error

RemoveFile removes a file from the index.

func (Index) SaveFile

func (in Index) SaveFile(f IndexFile, dest io.Writer) error

SaveFile attempts to read the file from disk

func (Index) Write

func (in Index) Write() error

Write saves the index file

type IndexFile

type IndexFile struct {
	// Files are stored in forward-slash format relative to the index file
	File       string `toml:"file"`
	Hash       string `toml:"hash,omitempty"`
	HashFormat string `toml:"hash-format,omitempty"`
	Alias      string `toml:"alias,omitempty"`
	MetaFile   bool   `toml:"metafile,omitempty"` // True when it is a .toml metadata file
	Preserve   bool   `toml:"preserve,omitempty"` // Don't overwrite the file when updating
	// contains filtered or unexported fields
}

IndexFile is a file in the index

type LengthHasher

type LengthHasher struct {
	// contains filtered or unexported fields
}

func (*LengthHasher) BlockSize

func (h *LengthHasher) BlockSize() int

func (*LengthHasher) Reset

func (h *LengthHasher) Reset()

func (*LengthHasher) Size

func (h *LengthHasher) Size() int

func (*LengthHasher) Sum

func (h *LengthHasher) Sum(b []byte) []byte

func (*LengthHasher) Write

func (h *LengthHasher) Write(p []byte) (n int, err error)

type ManualDownload

type ManualDownload struct {
	Name     string
	FileName string
	URL      string
}

type MavenMetadata

type MavenMetadata struct {
	XMLName    xml.Name `xml:"metadata"`
	GroupID    string   `xml:"groupId"`
	ArtifactID string   `xml:"artifactId"`
	Versioning struct {
		Release  string `xml:"release"`
		Latest   string `xml:"latest"`
		Versions struct {
			Version []string `xml:"version"`
		} `xml:"versions"`
		LastUpdated string `xml:"lastUpdated"`
	} `xml:"versioning"`
}

type MetaDownloader

type MetaDownloader interface {
	GetFilesMetadata([]*Mod) ([]MetaDownloaderData, error)
}

MetaDownloader specifies a downloader for a Mod using a "metadata:source" mode The calling code should handle caching and hash validation.

type MetaDownloaderData

type MetaDownloaderData interface {
	GetManualDownload() (bool, ManualDownload)
	DownloadFile() (io.ReadCloser, error)
}

MetaDownloaderData specifies the per-Mod metadata retrieved for downloading

type Mod

type Mod struct {
	Name     string      `toml:"name"`
	FileName string      `toml:"filename"`
	Side     string      `toml:"side,omitempty"`
	Download ModDownload `toml:"download"`
	// Update is a map of map of stuff, so you can store arbitrary values on string keys to define updating
	Update map[string]map[string]interface{} `toml:"update"`

	Option *ModOption `toml:"option,omitempty"`
	// contains filtered or unexported fields
}

Mod stores metadata about a mod. This is written to a TOML file for each mod.

func LoadMod

func LoadMod(modFile string) (Mod, error)

LoadMod attempts to load a mod file from a path

func (Mod) GetDestFilePath

func (m Mod) GetDestFilePath() string

GetDestFilePath returns the path of the destination file of the mod

func (Mod) GetFilePath

func (m Mod) GetFilePath() string

GetFilePath is a clumsy hack that I made because Mod already stores it's path anyway

func (Mod) GetParsedUpdateData

func (m Mod) GetParsedUpdateData(updaterName string) (interface{}, bool)

GetParsedUpdateData can be used to retrieve updater-specific information after parsing a mod file

func (*Mod) SetMetaPath

func (m *Mod) SetMetaPath(metaFile string) string

SetMetaPath sets the file path of a metadata file

func (Mod) Write

func (m Mod) Write() (string, string, error)

Write saves the mod file, returning a hash format and the value of the hash of the saved file

type ModDownload

type ModDownload struct {
	URL        string `toml:"url,omitempty"`
	HashFormat string `toml:"hash-format"`
	Hash       string `toml:"hash"`
	// Mode defaults to modeURL (i.e. use URL)
	Mode string `toml:"mode"`
}

ModDownload specifies how to download the mod file

type ModLoaderComponent

type ModLoaderComponent struct {
	Name              string
	FriendlyName      string
	VersionListGetter func(mcVersion string) ([]string, string, error)
}

type ModOption

type ModOption struct {
	Optional    bool   `toml:"optional"`
	Description string `toml:"description,omitempty"`
	Default     bool   `toml:"default,omitempty"`
}

ModOption specifies optional metadata for this mod file

type Pack

type Pack struct {
	Name        string `toml:"name"`
	Author      string `toml:"author,omitempty"`
	Version     string `toml:"version,omitempty"`
	Description string `toml:"description,omitempty"`
	PackFormat  string `toml:"pack-format"`
	Index       struct {
		// Path is stored in forward slash format relative to pack.toml
		File       string `toml:"file"`
		HashFormat string `toml:"hash-format"`
		Hash       string `toml:"hash,omitempty"`
	} `toml:"index"`
	Versions map[string]string                 `toml:"versions"`
	Export   map[string]map[string]interface{} `toml:"export"`
	Options  map[string]interface{}            `toml:"options"`
}

Pack stores the modpack metadata, usually in pack.toml

func LoadPack

func LoadPack() (Pack, error)

LoadPack loads the modpack metadata to a Pack struct

func (Pack) GetMCVersion

func (pack Pack) GetMCVersion() (string, error)

GetMCVersion gets the version of Minecraft this pack uses, if it has been correctly specified

func (Pack) GetPackName

func (pack Pack) GetPackName() string

func (Pack) LoadIndex

func (pack Pack) LoadIndex() (Index, error)

LoadIndex attempts to load the index file of this modpack

func (*Pack) UpdateIndexHash

func (pack *Pack) UpdateIndexHash() error

UpdateIndexHash recalculates the hash of the index file of this modpack

func (Pack) Write

func (pack Pack) Write() error

Write saves the pack file

type UpdateCheck

type UpdateCheck struct {
	// UpdateAvailable is true if an update is available for this mod
	UpdateAvailable bool
	// UpdateString is a string that details the update in some way to the user. Usually this will be in the form of
	// a version change (1.0.0 -> 1.0.1), or a file name change (thanos-skin-1.0.0.jar -> thanos-skin-1.0.1.jar).
	UpdateString string
	// CachedState can be used to preserve per-mod state between CheckUpdate and DoUpdate (e.g. file metadata)
	CachedState interface{}
	// Error stores an error for this specific mod
	// Errors can also be returned from CheckUpdate directly, if the whole operation failed completely (so only 1 error is printed)
	// If an error is returned for a mod, or from CheckUpdate, DoUpdate is not called on that mod / at all
	Error error
}

UpdateCheck represents the data returned from CheckUpdate for each mod

type Updater

type Updater interface {
	// ParseUpdate takes an unparsed interface{} (as a map[string]interface{}), and returns an Updater for a mod file.
	// This can be done using the mapstructure library or your own parsing methods.
	ParseUpdate(map[string]interface{}) (interface{}, error)
	// CheckUpdate checks whether there is an update for each of the mods in the given slice, for the given MC version,
	// called for all of the mods that this updater handles
	CheckUpdate([]Mod, string, Pack) ([]UpdateCheck, error)
	// DoUpdate carries out the update previously queried in CheckUpdate, on each Mod's metadata,
	// given pointers to Mods and the value of CachedState for each mod
	DoUpdate([]*Mod, []interface{}) error
}

Updater is used to process updates on mods

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL