forked from github-mirrorer/quake-kube
73 lines
1.2 KiB
Go
73 lines
1.2 KiB
Go
package content
|
|
|
|
import (
|
|
"archive/zip"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
type Map struct {
|
|
File string `json:"file"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
func getMaps(dir string) (result []*Map, err error) {
|
|
err = walk(dir, func(path string, info os.FileInfo, err error) error {
|
|
mp, err := OpenMapPack(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer mp.Close()
|
|
|
|
maps, err := mp.Maps()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
result = append(result, maps...)
|
|
return err
|
|
}, ".pk3")
|
|
return
|
|
}
|
|
|
|
type MapPack struct {
|
|
*os.File
|
|
*zip.Reader
|
|
|
|
path string
|
|
}
|
|
|
|
func OpenMapPack(path string) (*MapPack, error) {
|
|
f, err := os.Open(path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info, err := f.Stat()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
r, err := zip.NewReader(f, info.Size())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
mp := &MapPack{
|
|
File: f,
|
|
Reader: r,
|
|
path: path,
|
|
}
|
|
return mp, nil
|
|
}
|
|
|
|
func (m *MapPack) Maps() ([]*Map, error) {
|
|
maps := make([]*Map, 0)
|
|
for _, f := range m.Reader.File {
|
|
if !hasExts(f.Name, ".bsp") {
|
|
continue
|
|
}
|
|
path := filepath.Join(filepath.Base(filepath.Dir(m.path)), filepath.Base(m.path))
|
|
mapName := strings.TrimSuffix(filepath.Base(f.Name), ".bsp")
|
|
maps = append(maps, &Map{File: path, Name: mapName})
|
|
}
|
|
return maps, nil
|
|
}
|