From ead9e92ec24a50e455b8848ebcc956310f66c18b Mon Sep 17 00:00:00 2001 From: Leon's iPad Date: Fri, 24 Jan 2025 01:05:20 +0000 Subject: [PATCH 1/4] update home, update config - first nvim coded realms :) --- examples/gno.land/r/leon/config/config.gno | 69 +++++++++++----------- examples/gno.land/r/leon/home/home.gno | 8 +-- 2 files changed, 35 insertions(+), 42 deletions(-) diff --git a/examples/gno.land/r/leon/config/config.gno b/examples/gno.land/r/leon/config/config.gno index bc800ec8263..88fa1914036 100644 --- a/examples/gno.land/r/leon/config/config.gno +++ b/examples/gno.land/r/leon/config/config.gno @@ -3,61 +3,58 @@ package config import ( "errors" "std" + + "gno.land/p/demo/avl" + "gno.land/p/demo/ownable" + "gno.land/p/demo/ufmt" + "gno.land/p/moul/md" ) var ( - main std.Address // leon's main address - backup std.Address // backup address + configs = avl.NewTree() + + OwnableMain = ownable.NewWithAddress("g125em6arxsnj49vx35f0n0z34putv5ty3376fg5") + OwnableBackup = ownable.NewWithAddress("g125em6arxsnj49vx35f0n0z34putv5ty3376fg5") - ErrInvalidAddr = errors.New("leon's config: invalid address") ErrUnauthorized = errors.New("leon's config: unauthorized") ) -func init() { - main = "g125em6arxsnj49vx35f0n0z34putv5ty3376fg5" -} - -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, lines) // allows overwrite } -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 IsAuthorized(addr std.Address) bool { + return addr == OwnableMain.Owner() || addr == OwnableBackup.Owner() } -func SetBackup(a std.Address) error { - if !a.IsValid() { - return ErrInvalidAddr - } +func Render(_ string) (out string) { + out += md.H1("Leon's config Package") - if err := checkAuthorized(); err != nil { - return err - } + 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()) - backup = a - return nil -} + out += md.H2("Leon's configs") -func checkAuthorized() error { - caller := std.PrevRealm().Addr() - isAuthorized := caller == main || caller == backup + configs.Iterate("", "", func(key string, value interface{}) bool { + out += ufmt.Sprintf("## %s\n\n", key) + out += ufmt.Sprintf("```\n%s\n```", value.(string)) - if !isAuthorized { - return ErrUnauthorized - } + return false + }) - return nil + return out } diff --git a/examples/gno.land/r/leon/home/home.gno b/examples/gno.land/r/leon/home/home.gno index cf33260cc6b..4e48659aa77 100644 --- a/examples/gno.land/r/leon/home/home.gno +++ b/examples/gno.land/r/leon/home/home.gno @@ -39,7 +39,7 @@ TODO import r/gh } func UpdatePFP(url, caption string) { - if !isAuthorized(std.PrevRealm().Addr()) { + if !config.IsAuthorized(std.PrevRealm().Addr()) { panic(config.ErrUnauthorized) } @@ -48,7 +48,7 @@ func UpdatePFP(url, caption string) { } func UpdateAboutMe(col1, col2 string) { - if !isAuthorized(std.PrevRealm().Addr()) { + if !config.IsAuthorized(std.PrevRealm().Addr()) { panic(config.ErrUnauthorized) } @@ -130,7 +130,3 @@ func renderMillipede() string { return out } - -func isAuthorized(addr std.Address) bool { - return addr == config.Address() || addr == config.Backup() -} From a8cb3d85d5d8e14d3a154985b5c1b75844f4b99e Mon Sep 17 00:00:00 2001 From: leohhhn Date: Fri, 24 Jan 2025 21:10:09 +0100 Subject: [PATCH 2/4] update conf --- examples/gno.land/r/leon/config/config.gno | 78 +++++++++++++++++++--- examples/gno.land/r/leon/home/home.gno | 34 +++++----- 2 files changed, 85 insertions(+), 27 deletions(-) diff --git a/examples/gno.land/r/leon/config/config.gno b/examples/gno.land/r/leon/config/config.gno index 88fa1914036..4cd7dac4781 100644 --- a/examples/gno.land/r/leon/config/config.gno +++ b/examples/gno.land/r/leon/config/config.gno @@ -3,28 +3,43 @@ package config import ( "errors" "std" + "strconv" + "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 ( 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---" + // SafeObjects OwnableMain = ownable.NewWithAddress("g125em6arxsnj49vx35f0n0z34putv5ty3376fg5") OwnableBackup = ownable.NewWithAddress("g125em6arxsnj49vx35f0n0z34putv5ty3376fg5") ErrUnauthorized = errors.New("leon's config: unauthorized") ) +type Config struct { + lines string + updated time.Time +} + func AddConfig(name, lines string) { if !IsAuthorized(std.PrevRealm().Addr()) { panic(ErrUnauthorized) } - configs.Set(name, lines) // allows overwrite + configs.Set(name, Config{ + lines: lines, + updated: time.Now(), + }) // no overwrite check } func RemoveConfig(name string) { @@ -37,24 +52,65 @@ func RemoveConfig(name string) { } } +func UpdateBanner(newBanner string) { + if !IsAuthorized(std.PrevRealm().Addr()) { + panic(ErrUnauthorized) + } + + banner = newBanner +} + func IsAuthorized(addr std.Address) bool { return addr == OwnableMain.Owner() || addr == OwnableBackup.Owner() } -func Render(_ string) (out string) { - out += md.H1("Leon's config Package") +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()) + 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()) - out += md.H2("Leon's configs") + out += md.H2("Leon's configs") - configs.Iterate("", "", func(key string, value interface{}) bool { - out += ufmt.Sprintf("## %s\n\n", key) - out += ufmt.Sprintf("```\n%s\n```", value.(string)) + if configs.Size() == 0 { + out += "No configs yet :c\n\n" + } + + page := pager.MustGetPageByPath(path) + for _, item := range page.Items { + out += ufmt.Sprintf("- [%s](/r/leon/config:%s)\n\n", item.Key, 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 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 + } - return false - }) + 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 } diff --git a/examples/gno.land/r/leon/home/home.gno b/examples/gno.land/r/leon/home/home.gno index 4e48659aa77..aef261fcd60 100644 --- a/examples/gno.land/r/leon/home/home.gno +++ b/examples/gno.land/r/leon/home/home.gno @@ -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{ @@ -30,12 +47,8 @@ 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) { @@ -56,17 +69,6 @@ func UpdateAboutMe(col1, col2 string) { 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" From da9a1ce8dc570bb4e838a2c8a298f683c6ce73b9 Mon Sep 17 00:00:00 2001 From: leohhhn Date: Sat, 25 Jan 2025 00:47:25 +0100 Subject: [PATCH 3/4] update conf --- examples/gno.land/r/leon/config/config.gno | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/gno.land/r/leon/config/config.gno b/examples/gno.land/r/leon/config/config.gno index 4cd7dac4781..bb90a6c21d7 100644 --- a/examples/gno.land/r/leon/config/config.gno +++ b/examples/gno.land/r/leon/config/config.gno @@ -4,6 +4,7 @@ import ( "errors" "std" "strconv" + "strings" "time" "gno.land/p/demo/avl" @@ -18,10 +19,11 @@ var ( 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("g125em6arxsnj49vx35f0n0z34putv5ty3376fg5") + OwnableBackup = ownable.NewWithAddress("g1lavlav7zwsjqlzzl3qdl3nl242qtf638vnhdjh") ErrUnauthorized = errors.New("leon's config: unauthorized") ) @@ -84,7 +86,7 @@ func Render(path string) (out string) { page := pager.MustGetPageByPath(path) for _, item := range page.Items { - out += ufmt.Sprintf("- [%s](/r/leon/config:%s)\n\n", item.Key, item.Key) + out += ufmt.Sprintf("- [%s](%s:%s)\n\n", item.Key, absPath, item.Key) } out += page.Picker() From f6d585c65e6182209b21bc7067d4703aa44f1156 Mon Sep 17 00:00:00 2001 From: Leon's iPad Date: Sat, 25 Jan 2025 23:24:03 +0000 Subject: [PATCH 4/4] rm .Error(), add config to hof --- examples/gno.land/r/leon/hof/hof.gno | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/examples/gno.land/r/leon/hof/hof.gno b/examples/gno.land/r/leon/hof/hof.gno index 147a0dd1a95..96266ffe380 100644 --- a/examples/gno.land/r/leon/hof/hof.gno +++ b/examples/gno.land/r/leon/hof/hof.gno @@ -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 ( @@ -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 } @@ -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) } @@ -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{}{}) @@ -101,14 +103,14 @@ 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{}{}) @@ -116,19 +118,19 @@ func Downvote(pkgpath string) { 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) } }