z_mirror/fmm
git clone https://git.raiguard.me/z_mirror/fmm
811753c
updating
1package cli 2 3import ( 4"cmp" 5"errors" 6"fmt" 7"io" 8"os" 9"path/filepath" 10"slices" 11"strings" 12 13 fmm"github.com/raiguard/fmm/lib" 14) 15 16const usageStr string = `usage: fmm <command> [args...] 17commands: 18add [args...] Download and enable the given mods and their dependencies 19disable [args...] Disable the given mods, or all mods if none are given 20enable [args...] Enable the given mods and their dependencies 21help Show usage information 22list [files...] List all mods in the mods directory, or in the given save files 23sync [args...] Disable all mods, then download and enable the given mods and their dependencies 24upload [files...] Upload the given mod zip files to the mod portal` 25 26func Run (args []string ) { 27if len (args )== 0 { 28printUsage ("no operation was specified" ) 29 } 30 31var task func (* fmm.Manager , []string ) 32switch args [0 ] { 33case "add" ,"a" : 34task = add 35case "disable" ,"d" : 36task = disable 37case "enable" ,"e" : 38task = enable 39case "help" ,"h" ,"-h" ,"--help" ,"-help" : 40printUsage () 41case "list" ,"ls" : 42task = list 43case "sync" ,"s" : 44task = sync 45case "update" ,"u" : 46task = update 47case "upload" ,"ul" : 48task = upload 49default : 50printUsage ("unrecognized operation" ,args [0 ]) 51 } 52args = args [1 :] 53 54manager ,err := fmm .NewManager ("." ,filepath .Join ("." ,"mods" )) 55if err != nil { 56if ! errors .Is (err ,fmm .ErrInvalidGameDirectory ) { 57abort (err ) 58 } 59gamePath := os .Getenv ("FACTORIO_PATH" ) 60modsPath := os .Getenv ("FACTORIO_MODS_PATH" ) 61if modsPath == "" { 62modsPath = filepath .Join (gamePath ,"mods" ) 63 } 64manager ,err = fmm .NewManager (gamePath ,modsPath ) 65if err != nil { 66abort (err ) 67 } 68 } 69 70if ! manager .HasPlayerData () { 71manager .SetPlayerData (fmm.PlayerData { 72Token :os .Getenv ("FACTORIO_TOKEN" ), 73Username :os .Getenv ("FACTORIO_USERNAME" ), 74 }) 75 } 76 77manager .SetApiKey (os .Getenv ("FACTORIO_API_KEY" )) 78 79stdinStat ,_ := os .Stdin .Stat () 80if stdinStat .Mode ()& os .ModeNamedPipe > 0 { 81bytes ,err := io .ReadAll (os .Stdin ) 82if err == nil { 83args = append (args ,strings .Split (strings .TrimSpace (string (bytes )),"\n" )... ) 84 } 85 } 86 87task (manager ,args ) 88 89if err := manager .Save ();err != nil { 90errorln (errors .Join (errors .New ("unable to save modifications" ),err )) 91 } 92} 93 94func add (manager * fmm.Manager ,args []string ) { 95for _ ,mod := range manager .ExpandDependencies (getMods (args ),true ) { 96ver ,err := manager .Add (mod ) 97if err != nil { 98errorf ("failed to add %s\n" ,mod .ToString ()) 99errorln (err ) 100 }else if ver != nil { 101fmt .Println ("enabled" ,mod .Name ,ver .ToString (false )) 102 } 103 } 104} 105 106func disable (manager * fmm.Manager ,args []string ) { 107if len (args )== 0 { 108manager .DisableAll () 109fmt .Println ("disabled all mods" ) 110return 111 } 112 113for _ ,mod := range getMods (args ) { 114if err := manager .Disable (mod .Name );err != nil { 115errorf ("failed to disable %s\n" ,mod .ToString ()) 116errorln (err ) 117 }else { 118fmt .Println ("disabled" ,mod .Name ) 119 } 120 } 121} 122 123func enable (manager * fmm.Manager ,args []string ) { 124for _ ,mod := range manager .ExpandDependencies (getMods (args ),false ) { 125ver ,err := manager .Enable (mod ) 126if err != nil { 127errorf ("failed to enable %s\n" ,mod .ToString ()) 128errorln (err ) 129 }else if ver != nil { 130fmt .Println ("enabled" ,mod .Name ,ver .ToString (false )) 131 } 132 } 133} 134 135func list (manager * fmm.Manager ,args []string ) { 136mods := []fmm.ModIdent {} 137if len (args )== 0 { 138mods = manager .GetMods () 139 }else { 140for _ ,filepath := range args { 141fileMods ,err := fmm .ParseSaveFile (filepath ) 142if err != nil { 143fmt .Println (err ) 144 } 145mods = append (mods ,fileMods ... ) 146 } 147 } 148slices .SortFunc (mods ,func (a fmm.ModIdent ,b fmm.ModIdent )int { 149if a .Name != b .Name { 150return cmp .Compare (a .Name ,b .Name ) 151 } 152switch a .Version .Cmp (b .Version ) { 153case fmm .VersionLt : 154return - 1 155case fmm .VersionGt : 156return 1 157case fmm .VersionEq : 158return 0 159// Should be unreachable 160default : 161return 0 162 } 163 }) 164for _ ,mod := range mods { 165fmt .Println (mod .ToString ()) 166 } 167} 168 169func sync (manager * fmm.Manager ,args []string ) { 170manager .DisableAll () 171fmt .Println ("disabled all mods" ) 172add (manager ,args ) 173} 174 175func update (manager * fmm.Manager ,args []string ) { 176manager .CheckDownloadUpdates (getMods (args )) 177} 178 179func upload (manager * fmm.Manager ,files []string ) { 180for _ ,file := range files { 181if err := manager .Portal .UploadMod (file );err != nil { 182fmt .Println (err ) 183 } 184 } 185}