You've already forked factorio-server-manager
mirror of
https://github.com/OpenFactorioServerManager/factorio-server-manager.git
synced 2025-07-09 00:55:43 +02:00
165 lines
4.1 KiB
Go
165 lines
4.1 KiB
Go
![]() |
package main
|
||
|
|
||
|
import (
|
||
|
"log"
|
||
|
"encoding/json"
|
||
|
"io/ioutil"
|
||
|
"os"
|
||
|
"path/filepath"
|
||
|
"archive/zip"
|
||
|
"errors"
|
||
|
"io"
|
||
|
)
|
||
|
|
||
|
type ModInfoList struct {
|
||
|
Mods []ModInfo `json:"mods"`
|
||
|
Destination string `json:"-"`
|
||
|
}
|
||
|
type ModInfo struct {
|
||
|
Name string `json:"name"`
|
||
|
Version string `json:"version"`
|
||
|
Title string `json:"title"`
|
||
|
Author string `json:"author"`
|
||
|
FileName string `json:"file_name"`
|
||
|
}
|
||
|
|
||
|
func newModInfoList(destination string) (ModInfoList, error) {
|
||
|
var err error
|
||
|
mod_info_list := ModInfoList{
|
||
|
Destination: destination,
|
||
|
}
|
||
|
|
||
|
err = mod_info_list.listInstalledMods()
|
||
|
if err != nil {
|
||
|
log.Printf("ModInfoList ... error listing installed Mods: %s", err)
|
||
|
return mod_info_list, err
|
||
|
}
|
||
|
|
||
|
return mod_info_list, nil
|
||
|
}
|
||
|
|
||
|
func (mod_info_list *ModInfoList) listInstalledMods() (error) {
|
||
|
var err error
|
||
|
mod_info_list.Mods = nil
|
||
|
|
||
|
err = filepath.Walk(mod_info_list.Destination, func(path string, info os.FileInfo, err error) error {
|
||
|
if !info.IsDir() && filepath.Ext(path) == ".zip" {
|
||
|
zip_file, err := zip.OpenReader(path)
|
||
|
if err != nil {
|
||
|
log.Fatalln(err)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
var mod_info ModInfo
|
||
|
err = mod_info.getModInfo(&zip_file.Reader)
|
||
|
if err != nil {
|
||
|
log.Fatalf("Error in getModInfo: %s", err)
|
||
|
}
|
||
|
|
||
|
mod_info.FileName = info.Name()
|
||
|
mod_info_list.Mods = append(mod_info_list.Mods, mod_info)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
})
|
||
|
|
||
|
if err != nil {
|
||
|
log.Printf("error while walking over the given dir: %s", err)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (mod_info_list *ModInfoList) deleteMod(mod_name string) (error) {
|
||
|
var err error
|
||
|
|
||
|
//search for mod, that should be deleted
|
||
|
for _, mod := range mod_info_list.Mods {
|
||
|
if mod.Name == mod_name {
|
||
|
//delete mod
|
||
|
err = os.Remove(mod_info_list.Destination + "/" + mod.FileName)
|
||
|
if err != nil {
|
||
|
log.Printf("ModInfoList ... error when deleting mod: %s", err)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
//reload mod-list
|
||
|
err = mod_info_list.listInstalledMods()
|
||
|
if err != nil {
|
||
|
log.Printf("ModInfoList ... error while refreshing installedModList: %s", err)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
log.Printf("the mod-file doesnt exists!")
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (mod_info *ModInfo) getModInfo(reader *zip.Reader) error {
|
||
|
for _, single_file := range reader.File {
|
||
|
if single_file.FileInfo().Name() == "info.json" {
|
||
|
//interpret info.json
|
||
|
rc, err := single_file.Open()
|
||
|
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
byte_array, err := ioutil.ReadAll(rc)
|
||
|
rc.Close()
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
err = json.Unmarshal(byte_array, mod_info)
|
||
|
if err != nil {
|
||
|
log.Fatalln(err)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return errors.New("info.json not found in zip-file")
|
||
|
}
|
||
|
|
||
|
func (mod_info_list ModInfoList) createMod(mod_name string, file_name string, mod_file io.Reader) error {
|
||
|
var err error
|
||
|
|
||
|
//save uploaded file
|
||
|
new_file, err := os.Create(mod_info_list.Destination + "/" + file_name)
|
||
|
if err != nil {
|
||
|
log.Printf("error on creating new file - %s: %s", file_name, err)
|
||
|
return err
|
||
|
}
|
||
|
defer new_file.Close()
|
||
|
|
||
|
_, err = io.Copy(new_file, mod_file)
|
||
|
if err != nil {
|
||
|
log.Printf("error on copying file to disk: %s", err)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
//reload the list
|
||
|
err = new_file.Close()
|
||
|
if err != nil {
|
||
|
log.Printf("error on closing new created zip-file: %s", err)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
err = mod_info_list.listInstalledMods()
|
||
|
if err != nil {
|
||
|
log.Printf("error on listing mod-infos: %s", err)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|