package ttbp import ( "encoding/json" "os" "path" "sort" "time" "git.tilde.town/nbsp/neofeels/config" ) var ( PathVar = "/var/global/ttbp" PathVarWWW = path.Join(PathVar, "www") PathLive = "https://tilde.town/~" PathUserFile = path.Join(PathVar, "users.txt") PathGraff = path.Join(PathVar, "graffiti") PathWall = path.Join(PathGraff, "wall.txt") PathWallLock = path.Join(PathGraff, ".lock") ) type User struct { Name string Publishing bool PublishDir string LastPublished time.Time } // GetUsers gets all users with a valid ttbp config, with their name, publishing // settings, and date of last publish, if any. func GetUsers() (users []User) { userDirs, _ := os.ReadDir("/home") for _, user := range userDirs { if !user.IsDir() { continue } if file, err := os.Open(path.Join("/home", user.Name(), ".ttbp/config/ttbprc")); err == nil { defer file.Close() // get user config var config config.Config decoder := json.NewDecoder(file) err = decoder.Decode(&config) if err != nil { continue } // get last published file entries, err := os.ReadDir(path.Join("/home", user.Name(), ".ttbp/entries")) if err != nil { continue } var lastPublished time.Time = *new(time.Time) if len(entries) > 0 { info, err := entries[len(entries)-1].Info() if err != nil { continue } lastPublished = info.ModTime() } users = append(users, User{ Name: user.Name(), Publishing: config.Publishing, PublishDir: config.PublishDir, LastPublished: lastPublished, }) } } return users } // SortUsersByRecent sorts users, putting the users with the most recent // published feels at the beginning. func SortUsersByRecent(users []User) []User { sort.Slice(users, func(i, j int) bool { return users[i].LastPublished.After(users[j].LastPublished) }) return users }