121 lines
2.3 KiB
Go
121 lines
2.3 KiB
Go
package services
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
)
|
|
|
|
type ModInfo struct {
|
|
ID string `json:"id"`
|
|
Name string `json:"name"`
|
|
Source string `json:"source"`
|
|
Path string `json:"path"`
|
|
Size int64 `json:"size"`
|
|
InUse bool `json:"in_use"`
|
|
Modlists []string `json:"modlists"`
|
|
}
|
|
|
|
func ListWorkshopMods(serverfileDir string) []ModInfo {
|
|
workshopDir := filepath.Join(serverfileDir, "steamapps", "workshop", "content", workshopAppID)
|
|
entries, err := os.ReadDir(workshopDir)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
var mods []ModInfo
|
|
for _, e := range entries {
|
|
if !e.IsDir() {
|
|
continue
|
|
}
|
|
id := e.Name()
|
|
p := filepath.Join(workshopDir, id)
|
|
size := dirSize(p)
|
|
mods = append(mods, ModInfo{
|
|
ID: id,
|
|
Name: "",
|
|
Source: "workshop",
|
|
Path: p,
|
|
Size: size,
|
|
})
|
|
}
|
|
return mods
|
|
}
|
|
|
|
func ListLocalMods(modsDir string) []ModInfo {
|
|
entries, err := os.ReadDir(modsDir)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
var mods []ModInfo
|
|
for _, e := range entries {
|
|
if !e.IsDir() {
|
|
continue
|
|
}
|
|
name := e.Name()
|
|
p := filepath.Join(modsDir, name)
|
|
size := dirSize(p)
|
|
displayName := name
|
|
if len(name) > 0 && name[0] == '@' {
|
|
displayName = name[1:]
|
|
}
|
|
mods = append(mods, ModInfo{
|
|
ID: displayName,
|
|
Name: name,
|
|
Source: "local",
|
|
Path: p,
|
|
Size: size,
|
|
})
|
|
}
|
|
return mods
|
|
}
|
|
|
|
func BuildUsageMap(modlists *ModlistManager) (usedWorkshop map[string][]string, usedLocal map[string][]string) {
|
|
usedWorkshop = make(map[string][]string)
|
|
usedLocal = make(map[string][]string)
|
|
|
|
lists, err := modlists.List()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, li := range lists {
|
|
ml, err := modlists.Get(li.ID)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
for _, m := range ml.Mods {
|
|
if m.ID != "" {
|
|
usedWorkshop[m.ID] = append(usedWorkshop[m.ID], ml.Name)
|
|
}
|
|
if m.Name != "" {
|
|
nameWithAt := "@" + m.Name
|
|
usedLocal[m.Name] = append(usedLocal[m.Name], ml.Name)
|
|
usedLocal[nameWithAt] = append(usedLocal[nameWithAt], ml.Name)
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func RemoveMod(path string) error {
|
|
return os.RemoveAll(path)
|
|
}
|
|
|
|
func dirSize(path string) int64 {
|
|
var size int64
|
|
filepath.WalkDir(path, func(_ string, d os.DirEntry, err error) error {
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
if !d.IsDir() {
|
|
fi, err := d.Info()
|
|
if err == nil {
|
|
size += fi.Size()
|
|
}
|
|
}
|
|
return nil
|
|
})
|
|
return size
|
|
}
|