Files
factorio-server-manager/src/mod_modInfo.go

186 lines
3.8 KiB
Go
Raw Normal View History

package main
import (
2017-12-22 19:32:33 +01:00
"archive/zip"
"encoding/json"
"errors"
"io"
"io/ioutil"
"lockfile"
"log"
"os"
"path/filepath"
)
type ModInfoList struct {
2017-12-22 19:32:33 +01:00
Mods []ModInfo `json:"mods"`
Destination string `json:"-"`
}
type ModInfo struct {
2017-12-22 19:32:33 +01:00
Name string `json:"name"`
Version string `json:"version"`
Title string `json:"title"`
Author string `json:"author"`
FileName string `json:"file_name"`
FactorioVersion string `json:"factorio_version"`
}
func newModInfoList(destination string) (ModInfoList, error) {
2017-12-22 19:32:33 +01:00
var err error
2017-12-22 20:13:49 +01:00
modInfoList := ModInfoList{
2017-12-22 19:32:33 +01:00
Destination: destination,
}
2017-12-22 20:13:49 +01:00
err = modInfoList.listInstalledMods()
2017-12-22 19:32:33 +01:00
if err != nil {
log.Printf("ModInfoList ... error listing installed Mods: %s", err)
2017-12-22 20:13:49 +01:00
return modInfoList, err
2017-12-22 19:32:33 +01:00
}
2017-12-22 20:13:49 +01:00
return modInfoList, nil
}
2017-12-22 20:13:49 +01:00
func (modInfoList *ModInfoList) listInstalledMods() error {
2017-12-22 19:32:33 +01:00
var err error
2017-12-22 20:13:49 +01:00
modInfoList.Mods = nil
2017-12-22 19:32:33 +01:00
2017-12-22 20:13:49 +01:00
err = filepath.Walk(modInfoList.Destination, func(path string, info os.FileInfo, err error) error {
2017-12-22 19:32:33 +01:00
if !info.IsDir() && filepath.Ext(path) == ".zip" {
err = fileLock.RLock(path)
if err != nil && err == lockfile.ErrorAlreadyLocked {
log.Println(err)
return nil
} else if err != nil {
log.Printf("error locking file: %s", err)
return err
}
defer fileLock.RUnlock(path)
2017-12-22 20:13:49 +01:00
zipFile, err := zip.OpenReader(path)
2017-12-22 19:32:33 +01:00
if err != nil {
log.Fatalln(err)
return err
}
2017-12-22 20:13:49 +01:00
var modInfo ModInfo
err = modInfo.getModInfo(&zipFile.Reader)
2017-12-22 19:32:33 +01:00
if err != nil {
log.Fatalf("Error in getModInfo: %s", err)
}
2017-12-22 20:13:49 +01:00
modInfo.FileName = info.Name()
modInfoList.Mods = append(modInfoList.Mods, modInfo)
2017-12-22 19:32:33 +01:00
}
return nil
})
if err != nil {
log.Printf("error while walking over the given dir: %s", err)
return err
}
return nil
}
2017-12-22 20:13:49 +01:00
func (modInfoList *ModInfoList) deleteMod(modName string) error {
2017-12-22 19:32:33 +01:00
var err error
//search for mod, that should be deleted
2017-12-22 20:13:49 +01:00
for _, mod := range modInfoList.Mods {
if mod.Name == modName {
filePath := modInfoList.Destination + "/" + mod.FileName
2017-12-22 19:32:33 +01:00
fileLock.LockW(filePath)
//delete mod
err = os.Remove(filePath)
fileLock.Unlock(filePath)
if err != nil {
log.Printf("ModInfoList ... error when deleting mod: %s", err)
return err
}
//reload mod-list
2017-12-22 20:13:49 +01:00
err = modInfoList.listInstalledMods()
2017-12-22 19:32:33 +01:00
if err != nil {
log.Printf("ModInfoList ... error while refreshing installedModList: %s", err)
return err
}
return nil
}
}
log.Printf("the mod-file for mod %s doesntt exists!", modName)
2017-12-22 19:32:33 +01:00
return nil
}
2017-12-22 20:13:49 +01:00
func (modInfo *ModInfo) getModInfo(reader *zip.Reader) error {
for _, singleFile := range reader.File {
if singleFile.FileInfo().Name() == "info.json" {
2017-12-22 19:32:33 +01:00
//interpret info.json
2017-12-22 20:13:49 +01:00
rc, err := singleFile.Open()
2017-12-22 19:32:33 +01:00
if err != nil {
log.Fatal(err)
return err
}
2017-12-22 20:13:49 +01:00
byteArray, err := ioutil.ReadAll(rc)
2017-12-22 19:32:33 +01:00
rc.Close()
if err != nil {
log.Fatal(err)
return err
}
2017-12-22 20:13:49 +01:00
err = json.Unmarshal(byteArray, modInfo)
2017-12-22 19:32:33 +01:00
if err != nil {
log.Fatalln(err)
return err
}
return nil
}
}
return errors.New("info.json not found in zip-file")
}
2017-12-22 20:13:49 +01:00
func (modInfoList *ModInfoList) createMod(modName string, fileName string, modFile io.Reader) error {
2017-12-22 19:32:33 +01:00
var err error
//save uploaded file
2017-12-22 20:13:49 +01:00
filePath := modInfoList.Destination + "/" + fileName
newFile, err := os.Create(filePath)
2017-12-22 19:32:33 +01:00
if err != nil {
2017-12-22 20:13:49 +01:00
log.Printf("error on creating new file - %s: %s", fileName, err)
2017-12-22 19:32:33 +01:00
return err
}
2017-12-22 20:13:49 +01:00
defer newFile.Close()
2017-12-22 19:32:33 +01:00
fileLock.LockW(filePath)
2017-12-22 20:13:49 +01:00
_, err = io.Copy(newFile, modFile)
2017-12-22 19:32:33 +01:00
if err != nil {
log.Printf("error on copying file to disk: %s", err)
return err
}
2017-12-22 20:13:49 +01:00
err = newFile.Close()
2017-12-22 19:32:33 +01:00
if err != nil {
log.Printf("error on closing new created zip-file: %s", err)
return err
}
fileLock.Unlock(filePath)
//reload the list
2017-12-22 20:13:49 +01:00
err = modInfoList.listInstalledMods()
2017-12-22 19:32:33 +01:00
if err != nil {
log.Printf("error on listing mod-infos: %s", err)
return err
}
return nil
}