Skip to content

Commit

Permalink
feat(examples): add r/leon (gnolang#2740)
Browse files Browse the repository at this point in the history
## Description

This PR adds v1 of `r/leon` to the examples folder. It contains
`r/leon/home` & `r/leon/config`.
 
For context - this is meant to be a personal realm (or set of realms)
that every gno.land user should have at some point. Later, the idea is
to have a [special user
page](gnolang#2189) which will fetch the
`Render()` of `r/username/home`. This will serve like the profile of the
user; and the home realm will most likely be upgradeable down the line.

The reason I am making this a PR and not simply publishing it to the
Portal Loop is that it allows for further code changes down the line.
`examples/` get loaded into genesis first, and all other replayed addpkg
transactions after that, making it possible to have "upgradeable" realms
on Portal Loop.

<details><summary>Contributors' checklist...</summary>

- [x] Added new tests, or not needed, or not feasible
- [x] Provided an example (e.g. screenshot) to aid review or the PR is
self-explanatory
- [x] Updated the official documentation or not needed
- [x] No breaking changes were made, or a `BREAKING CHANGE: xxx` message
was included in the description
- [x] Added references to related issues and PRs
- [x] Provided any useful hints for running manual tests
- [x] Added new benchmarks to [generated
graphs](https://gnoland.github.io/benchmarks), if any. More info
[here](https://github.com/gnolang/gno/blob/master/.benchmarks/README.md).
</details>
  • Loading branch information
leohhhn committed Sep 3, 2024
1 parent c82e646 commit 65ee7a5
Show file tree
Hide file tree
Showing 4 changed files with 195 additions and 0 deletions.
65 changes: 65 additions & 0 deletions examples/gno.land/r/leon/config/config.gno
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package config

import (
"errors"
"std"
)

var (
main std.Address // leon's main address
backup std.Address // backup address
)

func init() {
main = "g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"
}

func Address() std.Address {
return main
}

func Backup() std.Address {
return backup
}

func SetAddress(a std.Address) error {
if !a.IsValid() {
return errors.New("config: invalid address")
}

if err := checkAuthorized(); err != nil {
return err
}

main = a
return nil
}

func SetBackup(a std.Address) error {
if !a.IsValid() {
return errors.New("config: invalid address")
}

if err := checkAuthorized(); err != nil {
return err
}

backup = a
return nil
}

func checkAuthorized() error {
caller := std.PrevRealm().Addr()
if caller != main || caller != backup {
return errors.New("config: unauthorized")
}

return nil
}

func AssertAuthorized() {
caller := std.PrevRealm().Addr()
if caller != main || caller != backup {
panic("config: unauthorized")
}
}
1 change: 1 addition & 0 deletions examples/gno.land/r/leon/config/gno.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module gno.land/r/leon/config
8 changes: 8 additions & 0 deletions examples/gno.land/r/leon/home/gno.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module gno.land/r/leon/home

require (
gno.land/p/demo/ufmt v0.0.0-latest
gno.land/r/demo/art/gnoface v0.0.0-latest
gno.land/r/demo/art/millipede v0.0.0-latest
gno.land/r/leon/config v0.0.0-latest
)
121 changes: 121 additions & 0 deletions examples/gno.land/r/leon/home/home.gno
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
package home

import (
"std"
"strconv"

"gno.land/p/demo/ufmt"

"gno.land/r/demo/art/gnoface"
"gno.land/r/demo/art/millipede"
"gno.land/r/leon/config"
)

var (
pfp string // link to profile picture
pfpCaption string // profile picture caption
abtMe [2]string
)

func init() {
pfp = "https://i.imgflip.com/91vskx.jpg"
pfpCaption = "[My favourite painting & pfp](https://en.wikipedia.org/wiki/Wanderer_above_the_Sea_of_Fog)"
abtMe = [2]string{
`### About me
Hi, I'm Leon, a DevRel Engineer at gno.land. I am a tech enthusiast,
life-long learner, and sharer of knowledge.`,
`### Contributions
My contributions to gno.land can mainly be found
[here](https://github.com/gnolang/gno/issues?q=sort:updated-desc+author:leohhhn).
TODO import r/gh
`,
}
}

func UpdatePFP(url, caption string) {
config.AssertAuthorized()
pfp = url
pfpCaption = caption
}

func UpdateAboutMe(col1, col2 string) {
config.AssertAuthorized()
abtMe[0] = col1
abtMe[1] = col2
}

func Render(path string) string {
out := "# Leon's Homepage\n\n"

out += renderAboutMe()
out += renderBlogPosts()
out += "\n\n"
out += renderArt()

return out
}

func renderBlogPosts() string {
out := ""
//out += "## Leon's Blog Posts"

// todo fetch blog posts authored by @leohhhn
// and render them
return out
}

func renderAboutMe() string {
out := "<div class='columns-3'>"

out += "<div>\n\n"
out += ufmt.Sprintf("![my profile pic](%s)\n\n%s\n\n", pfp, pfpCaption)
out += "</div>\n\n"

out += "<div>\n\n"
out += abtMe[0] + "\n\n"
out += "</div>\n\n"

out += "<div>\n\n"
out += abtMe[1] + "\n\n"
out += "</div>\n\n"

out += "</div><!-- /columns-3 -->\n\n"

return out
}

func renderArt() string {
out := `<div class="jumbotron">` + "\n\n"
out += "# Gno Art\n\n"

out += "<div class='columns-3'>"

out += renderGnoFace()
out += renderMillipede()
out += "Empty spot :/"

out += "</div><!-- /columns-3 -->\n\n"

out += "This art is dynamic; it will change with every new block.\n\n"
out += `</div><!-- /jumbotron -->` + "\n"

return out
}

func renderGnoFace() string {
out := "<div>\n\n"
out += gnoface.Render(strconv.Itoa(int(std.GetHeight())))
out += "</div>\n\n"

return out
}

func renderMillipede() string {
out := "<div>\n\n"
out += "Millipede\n\n"
out += "```\n" + millipede.Draw(int(std.GetHeight())%10+1) + "```\n"
out += "</div>\n\n"

return out
}

0 comments on commit 65ee7a5

Please sign in to comment.