package main import ( "bytes" "encoding/json" "fmt" "html/template" "math/rand" "os" "os/exec" "time" ) //const statsPath = "/home/vilmibm/bin/townstats" const statsPath = "/town/bin/stats" type user struct { Username string `json:"username"` // Username of user PageTitle string `json:"title"` // Title of user's HTML page, if they have one DefaultPage bool `json:"default"` // Whether or not user has updated their default index.html } type tildeData struct { Users []*user `json:"users"` } func _main() error { data, err := stats() if err != nil { return err } users := []*user{} for _, u := range data.Users { if !u.DefaultPage { users = append(users, u) } } hypertextDocument := getHeader() rand.Seed(time.Now().UTC().UnixNano()) for i := range rand.Perm(len(users)) { link, err := renderUserLink(users[i]) if err != nil { return err } hypertextDocument += link } hypertextDocument += getFooter() fmt.Println(hypertextDocument) return nil } func renderUserLink(u *user) (string, error) { title := u.PageTitle if title == "" { title = "~" + u.Username } pt := rand.Intn(20) pb := rand.Intn(30) pl := rand.Intn(25) pr := rand.Intn(20) opacity := rand.Intn(50) + 50 h := rand.Intn(5) t, err := template.New("userlink").Parse(` {{.Title}} `) if err != nil { return "", err } float := "left" if rand.Intn(2) == 0 { float = "right" } out := bytes.Buffer{} err = t.Execute(&out, struct { Username string Pt int Pb int Pl int Pr int Opacity int H int Title string Float string }{ Pt: pt, Pb: pb, Pl: pl, Pr: pr, Opacity: opacity, H: h, Username: u.Username, Title: title, Float: float, }) if err != nil { return "", err } return out.String(), nil } func main() { err := _main() if err != nil { fmt.Fprintf(os.Stderr, "error: %s\n", err) os.Exit(1) } } func stats() (*tildeData, error) { sout := bytes.Buffer{} cmd := exec.Command(statsPath) cmd.Stdout = &sout err := cmd.Run() if err != nil { return nil, err } data := tildeData{} err = json.Unmarshal(sout.Bytes(), &data) if err != nil { return nil, err } return &data, nil } func getHeader() string { return ` web pages of tilde town ` } func getFooter() string { return ` ` }