Skip to content

Commit

Permalink
feat(examples): update leon's config & home (#3603)
Browse files Browse the repository at this point in the history
  • Loading branch information
leohhhn authored Jan 29, 2025
1 parent a885c78 commit df4113d
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 64 deletions.
119 changes: 87 additions & 32 deletions examples/gno.land/r/leon/config/config.gno
Original file line number Diff line number Diff line change
Expand Up @@ -3,61 +3,116 @@ package config
import (
"errors"
"std"
"strconv"
"strings"
"time"

"gno.land/p/demo/avl"
p "gno.land/p/demo/avl/pager"
"gno.land/p/demo/ownable"
"gno.land/p/demo/ufmt"
"gno.land/p/moul/md"
"gno.land/p/moul/realmpath"
)

var (
main std.Address // leon's main address
backup std.Address // backup address
configs = avl.NewTree()
pager = p.NewPager(configs, 10, false)
banner = "---\n[[Leon's Home page]](/r/leon/home) | [[GitHub: @leohhhn]](https://github.com/leohhhn)\n\n---"
absPath = strings.TrimPrefix(std.CurrentRealm().PkgPath(), std.GetChainDomain())

// SafeObjects
OwnableMain = ownable.NewWithAddress("g125em6arxsnj49vx35f0n0z34putv5ty3376fg5")
OwnableBackup = ownable.NewWithAddress("g1lavlav7zwsjqlzzl3qdl3nl242qtf638vnhdjh")

ErrInvalidAddr = errors.New("leon's config: invalid address")
ErrUnauthorized = errors.New("leon's config: unauthorized")
)

func init() {
main = "g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"
type Config struct {
lines string
updated time.Time
}

func Address() std.Address {
return main
}
func AddConfig(name, lines string) {
if !IsAuthorized(std.PrevRealm().Addr()) {
panic(ErrUnauthorized)
}

func Backup() std.Address {
return backup
configs.Set(name, Config{
lines: lines,
updated: time.Now(),
}) // no overwrite check
}

func SetAddress(a std.Address) error {
if !a.IsValid() {
return ErrInvalidAddr
func RemoveConfig(name string) {
if !IsAuthorized(std.PrevRealm().Addr()) {
panic(ErrUnauthorized)
}

if err := checkAuthorized(); err != nil {
return err
if _, ok := configs.Remove(name); !ok {
panic("no config with that name")
}

main = a
return nil
}

func SetBackup(a std.Address) error {
if !a.IsValid() {
return ErrInvalidAddr
func UpdateBanner(newBanner string) {
if !IsAuthorized(std.PrevRealm().Addr()) {
panic(ErrUnauthorized)
}

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

backup = a
return nil
func IsAuthorized(addr std.Address) bool {
return addr == OwnableMain.Owner() || addr == OwnableBackup.Owner()
}

func checkAuthorized() error {
caller := std.PrevRealm().Addr()
isAuthorized := caller == main || caller == backup
func Banner() string {
return banner
}

func Render(path string) (out string) {
req := realmpath.Parse(path)
if req.Path == "" {
out += md.H1("Leon's config package")

out += ufmt.Sprintf("Leon's main address: %s\n\n", OwnableMain.Owner().String())
out += ufmt.Sprintf("Leon's backup address: %s\n\n", OwnableBackup.Owner().String())

if !isAuthorized {
return ErrUnauthorized
out += md.H2("Leon's configs")

if configs.Size() == 0 {
out += "No configs yet :c\n\n"
}

page := pager.MustGetPageByPath(path)
for _, item := range page.Items {
out += ufmt.Sprintf("- [%s](%s:%s)\n\n", item.Key, absPath, item.Key)
}

out += page.Picker()
out += "\n\n"
out += "Page " + strconv.Itoa(page.PageNumber) + " of " + strconv.Itoa(page.TotalPages) + "\n\n"

out += Banner()

return out
}

return nil
return renderConfPage(req.Path)
}

func renderConfPage(confName string) (out string) {
raw, ok := configs.Get(confName)
if !ok {
out += md.H1("404")
out += "That config does not exist :/"
return out
}

conf := raw.(Config)
out += md.H1(confName)
out += ufmt.Sprintf("```\n%s\n```\n\n", conf.lines)
out += ufmt.Sprintf("_Last updated on %s_", conf.updated.Format("02 Jan, 2006"))

return out
}
22 changes: 12 additions & 10 deletions examples/gno.land/r/leon/hof/hof.gno
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import (
"gno.land/p/demo/ownable"
"gno.land/p/demo/pausable"
"gno.land/p/demo/seqid"

"gno.land/r/leon/config"
)

var (
Expand All @@ -24,7 +26,7 @@ type (
Exhibition struct {
itemCounter seqid.ID
description string
items *avl.Tree // pkgPath > Item
items *avl.Tree // pkgPath > &Item
itemsSorted *avl.Tree // same data but sorted, storing pointers
}

Expand All @@ -43,7 +45,7 @@ func init() {
itemsSorted: avl.NewTree(),
}

Ownable = ownable.NewWithAddress(std.Address("g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"))
Ownable = ownable.NewWithAddress(config.OwnableMain.Owner()) // OrigSendOwnable?
Pausable = pausable.NewFromOwnable(Ownable)
}

Expand Down Expand Up @@ -85,14 +87,14 @@ func Register() {
func Upvote(pkgpath string) {
rawItem, ok := exhibition.items.Get(pkgpath)
if !ok {
panic(ErrNoSuchItem.Error())
panic(ErrNoSuchItem)
}

item := rawItem.(*Item)
caller := std.PrevRealm().Addr().String()

if item.upvote.Has(caller) {
panic(ErrDoubleUpvote.Error())
panic(ErrDoubleUpvote)
}

item.upvote.Set(caller, struct{}{})
Expand All @@ -101,34 +103,34 @@ func Upvote(pkgpath string) {
func Downvote(pkgpath string) {
rawItem, ok := exhibition.items.Get(pkgpath)
if !ok {
panic(ErrNoSuchItem.Error())
panic(ErrNoSuchItem)
}

item := rawItem.(*Item)
caller := std.PrevRealm().Addr().String()

if item.downvote.Has(caller) {
panic(ErrDoubleDownvote.Error())
panic(ErrDoubleDownvote)
}

item.downvote.Set(caller, struct{}{})
}

func Delete(pkgpath string) {
if !Ownable.CallerIsOwner() {
panic(ownable.ErrUnauthorized.Error())
panic(ownable.ErrUnauthorized)
}

i, ok := exhibition.items.Get(pkgpath)
if !ok {
panic(ErrNoSuchItem.Error())
panic(ErrNoSuchItem)
}

if _, removed := exhibition.itemsSorted.Remove(i.(*Item).id.String()); !removed {
panic(ErrNoSuchItem.Error())
panic(ErrNoSuchItem)
}

if _, removed := exhibition.items.Remove(pkgpath); !removed {
panic(ErrNoSuchItem.Error())
panic(ErrNoSuchItem)
}
}
42 changes: 20 additions & 22 deletions examples/gno.land/r/leon/home/home.gno
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,24 @@ var (
abtMe [2]string
)

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

out += renderAboutMe()
out += renderBlogPosts()
out += "\n\n"
out += renderArt()
out += "\n\n"
out += config.Banner()
out += "\n\n"

return out
}

func init() {
hof.Register()
mirror.Register(std.CurrentRealm().PkgPath(), Render)

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{
Expand All @@ -30,16 +47,12 @@ life-long learner, and sharer of knowledge.`,
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
`,
TODO import r/gh`,
}

hof.Register()
mirror.Register(std.CurrentRealm().PkgPath(), Render)
}

func UpdatePFP(url, caption string) {
if !isAuthorized(std.PrevRealm().Addr()) {
if !config.IsAuthorized(std.PrevRealm().Addr()) {
panic(config.ErrUnauthorized)
}

Expand All @@ -48,25 +61,14 @@ func UpdatePFP(url, caption string) {
}

func UpdateAboutMe(col1, col2 string) {
if !isAuthorized(std.PrevRealm().Addr()) {
if !config.IsAuthorized(std.PrevRealm().Addr()) {
panic(config.ErrUnauthorized)
}

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"
Expand Down Expand Up @@ -130,7 +132,3 @@ func renderMillipede() string {

return out
}

func isAuthorized(addr std.Address) bool {
return addr == config.Address() || addr == config.Backup()
}

0 comments on commit df4113d

Please sign in to comment.