microblog.gno
2.05 Kb ยท 89 lines
1// Microblog is a website with shortform posts from users.
2// The API is simple - "AddPost" takes markdown and
3// adds it to the users site.
4// The microblog location is determined by the user address
5// /r/demo/microblog:<YOUR-ADDRESS>
6package microblog
7
8import (
9 "strings"
10
11 "gno.land/p/demo/microblog"
12 "gno.land/p/demo/ufmt"
13 susers "gno.land/r/sys/users"
14)
15
16var (
17 title = "gno-based microblog"
18 prefix = "/r/demo/microblog:"
19 m *microblog.Microblog
20)
21
22func init() {
23 m = microblog.NewMicroblog(title, prefix)
24}
25
26func renderHome() string {
27 output := ufmt.Sprintf("# %s\n\n", m.Title)
28 output += "# pages\n\n"
29
30 for _, page := range m.GetPages() {
31 if u := susers.ResolveAddress(page.Author); u != nil {
32 output += ufmt.Sprintf("- [%s (%s)](%s%s)\n", u.Name(), page.Author.String(), m.Prefix, page.Author.String())
33 } else {
34 output += ufmt.Sprintf("- [%s](%s%s)\n", page.Author.String(), m.Prefix, page.Author.String())
35 }
36 }
37
38 return output
39}
40
41func renderUser(user string) string {
42 silo, found := m.Pages.Get(user)
43 if !found {
44 return "404" // StatusNotFound
45 }
46
47 return PageToString((silo.(*microblog.Page)))
48}
49
50func Render(path string) string {
51 parts := strings.Split(path, "/")
52
53 isHome := path == ""
54 isUser := len(parts) == 1
55
56 switch {
57 case isHome:
58 return renderHome()
59
60 case isUser:
61 return renderUser(parts[0])
62 }
63
64 return "404" // StatusNotFound
65}
66
67func PageToString(p *microblog.Page) string {
68 o := ""
69 if u := susers.ResolveAddress(p.Author); u != nil {
70 o += ufmt.Sprintf("# [%s](/r/gnoland/users/v1:%s)\n\n", u, u)
71 }
72 o += ufmt.Sprintf("## [%s](/r/demo/microblog:%s)\n\n", p.Author, p.Author)
73
74 o += ufmt.Sprintf("joined %s, last updated %s\n\n", p.CreatedAt.Format("2006-02-01"), p.LastPosted.Format("2006-02-01"))
75 o += "## feed\n\n"
76 for _, u := range p.GetPosts() {
77 o += u.String() + "\n\n"
78 }
79 return o
80}
81
82// NewPost takes a single argument (post markdown) and
83// adds a post to the address of the caller.
84func NewPost(text string) string {
85 if err := m.NewPost(text); err != nil {
86 return "unable to add new post"
87 }
88 return "added new post"
89}