82 lines
1.9 KiB
Go
82 lines
1.9 KiB
Go
|
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
|
||
|
}
|