From 971cc396e1d01f53f65a86278fd0ac4490565335 Mon Sep 17 00:00:00 2001 From: Mitch Riedstra Date: Fri, 20 Nov 2020 19:56:29 -0500 Subject: Reorganize. Update to use go modules. --- steam/steam.go | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 steam/steam.go (limited to 'steam/steam.go') diff --git a/steam/steam.go b/steam/steam.go new file mode 100644 index 0000000..ea27e5a --- /dev/null +++ b/steam/steam.go @@ -0,0 +1,123 @@ +// This is designed to be a rather simplistic library to help pull information +// from a local steam library +package steam + +import ( + "fmt" + "io/ioutil" + + "errors" + + "bufio" + "os" + "path/filepath" + "strings" + // "log" +) + +type Library struct { + Folder string + Games []string +} + +func ProcessMultipleLibraries(r []string) ([]*Library, error) { + var libs []*Library + for _, i := range r { + lib := &Library{} + err := lib.ProcessLibrary(i) + if err != nil { + return nil, err + } + libs = append(libs, lib) + } + return libs, nil +} + +// Populate the "Folder" and "Games" fields based on the provided directory +func (s *Library) ProcessLibrary(r string) error { + if hasCommon(r) { + dirs, err := ioutil.ReadDir(r + "/common") + if err != nil { + return err + } + s.Folder = r + for _, f := range dirs { + if f.IsDir() { + s.Games = append(s.Games, f.Name()) + } + } + } else { + return errors.New(fmt.Sprintf("No common directory in: %s", r)) + } + return nil +} + +// Find the ACF files related to this video game +func (l *Library) FindACF(g string) (string, error) { + working_dir, err := os.Getwd() + if err != nil { + return "", err + } + if err = os.Chdir(l.Folder); err != nil { + return "", err + } + files, err := filepath.Glob("*.acf") + if err != nil { + return "", err + } + for _, fn := range files { + info, err := os.Lstat(fn) + if err != nil { + return "", err + } + // We don't want it if it's a directory + if info.IsDir() { + continue + } + + // Open up the file + f, err := os.Open(fn) + defer f.Close() + if err != nil { + return "", err + } + scanner := bufio.NewScanner(f) + for scanner.Scan() { + // Finally check and see if the file has the video game name + if strings.Contains(scanner.Text(), g) { + os.Chdir(working_dir) + return fn, nil + // fmt.Printf("%s/%s:%d: %s\n", root, path, i, scanner.Text()) + } + } + + } + str := "Couldn't find ACF file related to Game: %s" + return "", errors.New(fmt.Sprintf(str, g)) +} + +// This is automatically called to print out the contents of the struct +// when things like fmt.Println are used +func (s *Library) String() (str string) { + str = fmt.Sprintln("\n----") + str = str + fmt.Sprintln(s.Folder) + str = str + "\n----\n" + for k, v := range s.Games { + str = str + fmt.Sprintf("%d: %s\n", k, v) + //str = str + fmt.Sprintln(v) + } + return +} + +func hasCommon(d string) bool { + dirs, err := ioutil.ReadDir(d) + if err != nil { + return false + } + for _, f := range dirs { + if f.Name() == "common" && f.IsDir() { + return true + } + } + return false +} -- cgit v1.2.3