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}