github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/examples/gno.land/r/demo/microblog/microblog.gno (about)

     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>
     6  package microblog
     7  
     8  import (
     9  	"std"
    10  	"strings"
    11  
    12  	"gno.land/p/demo/microblog"
    13  	"gno.land/p/demo/ufmt"
    14  	"gno.land/r/demo/users"
    15  )
    16  
    17  var (
    18  	title  = "gno-based microblog"
    19  	prefix = "/r/demo/microblog:"
    20  	m      *microblog.Microblog
    21  )
    22  
    23  func init() {
    24  	m = microblog.NewMicroblog(title, prefix)
    25  }
    26  
    27  func renderHome() string {
    28  	output := ufmt.Sprintf("# %s\n\n", m.Title)
    29  	output += "# pages\n\n"
    30  
    31  	for _, page := range m.GetPages() {
    32  		if u := users.GetUserByAddress(page.Author); u != nil {
    33  			output += ufmt.Sprintf("- [%s (%s)](%s%s)\n", u.Name, page.Author.String(), m.Prefix, page.Author.String())
    34  		} else {
    35  			output += ufmt.Sprintf("- [%s](%s%s)\n", page.Author.String(), m.Prefix, page.Author.String())
    36  		}
    37  	}
    38  
    39  	return output
    40  }
    41  
    42  func renderUser(user string) string {
    43  	silo, found := m.Pages.Get(user)
    44  	if !found {
    45  		return "404" // StatusNotFound
    46  	}
    47  
    48  	return PageToString((silo.(*microblog.Page)))
    49  }
    50  
    51  func Render(path string) string {
    52  	parts := strings.Split(path, "/")
    53  
    54  	isHome := path == ""
    55  	isUser := len(parts) == 1
    56  
    57  	switch {
    58  	case isHome:
    59  		return renderHome()
    60  
    61  	case isUser:
    62  		return renderUser(parts[0])
    63  	}
    64  
    65  	return "404" // StatusNotFound
    66  }
    67  
    68  func PageToString(p *microblog.Page) string {
    69  	o := ""
    70  	if u := users.GetUserByAddress(p.Author); u != nil {
    71  		o += ufmt.Sprintf("# [%s](/r/demo/users:%s)\n\n", u, u)
    72  		o += ufmt.Sprintf("%s\n\n", u.Profile)
    73  	}
    74  	o += ufmt.Sprintf("## [%s](/r/demo/microblog:%s)\n\n", p.Author, p.Author)
    75  
    76  	o += ufmt.Sprintf("joined %s, last updated %s\n\n", p.CreatedAt.Format("2006-02-01"), p.LastPosted.Format("2006-02-01"))
    77  	o += "## feed\n\n"
    78  	for _, u := range p.GetPosts() {
    79  		o += u.String() + "\n\n"
    80  	}
    81  	return o
    82  }
    83  
    84  // NewPost takes a single argument (post markdown) and
    85  // adds a post to the address of the caller.
    86  func NewPost(text string) string {
    87  	if err := m.NewPost(text); err != nil {
    88  		return "unable to add new post"
    89  	}
    90  	return "added new post"
    91  }
    92  
    93  func Register(name, profile string) string {
    94  	caller := std.GetOrigCaller() // main
    95  	users.Register(caller, name, profile)
    96  	return "OK"
    97  }