render.gno
2.51 Kb ยท 98 lines
1package cockpit
2
3import (
4 "strings"
5
6 "gno.land/p/moul/md"
7 "gno.land/p/nt/mux"
8 "gno.land/p/nt/ufmt"
9 "gno.land/r/demo/profile"
10 rusers "gno.land/r/sys/users"
11)
12
13const (
14 chainId = "test5"
15 pkgPath = "r/zenao/cockpit"
16 userSlug = "u"
17 usersRealm = "r/gnoland/users/v1"
18 ghLinkHint = "r/gnoland/ghverify?help&__func=RequestVerification"
19 ghProfileHint = "/r/demo/profile:u/"
20 gatewayDomain = "pinata.zenao.io"
21)
22
23func Render(reqPath string) string {
24 router := mux.NewRouter()
25
26 router.HandleFunc("", renderHome)
27 router.HandleFunc(userSlug+"/{aon}", renderUser)
28
29 return router.Render(reqPath)
30}
31
32func renderHome(res *mux.ResponseWriter, req *mux.Request) {
33 res.Write("# Cockpit\n\n")
34 res.Write("See `:" + userSlug + "/{addressOrName}`\n\n")
35 res.Write("Examples:\n")
36 elems := rusers.GetReadOnlyNameStore()
37 i := 0
38 elems.Iterate("", "", func(key string, value any) bool {
39 if i == 20 {
40 return true
41 }
42 elem := value.(*rusers.UserData)
43 if elem == nil {
44 return false
45 }
46 name := elem.Name()
47 res.Write("- [ " + name + " ](./" + pkgPath + ":" + userSlug + "/@" + name + ")\n")
48 i++
49 return false
50 })
51}
52
53func renderUser(res *mux.ResponseWriter, req *mux.Request) {
54 addr, username, ok := resolveUserBasics(req.GetVar("aon"))
55 if !ok {
56 res.Write("404")
57 return
58 }
59
60 // FIXME: markdown injection, spam
61 res.Write("# " + profile.GetStringField(addr, profile.DisplayName, "Anon") + "\n")
62
63 res.Write(md.Image("Avatar", pfpURL(profile.GetStringField(addr, profile.Avatar, "Anon"))) + "\n")
64
65 if username != "" {
66 res.Write("- Username: [" + username + "](/u/" + username + ")\n")
67 } else {
68 res.Write("- Username: [Not registered](/" + usersRealm + "?help&__func=Register)\n")
69 }
70
71 res.Write("- Address: [" + addr.String() + "](https://gnoscan.io/accounts/" + addr.String() + "?chainId=" + chainId + ")\n\n")
72
73 // FIXME: markdown injection, spam
74 res.Write("```\n" + profile.GetStringField(addr, profile.Bio, "No bio") + "\n```\n[Full profile / edit](" + ghProfileHint + addr.String() + ")\n")
75}
76
77func resolveUserBasics(aon string) (address, string, bool) {
78 user, ok := rusers.ResolveAny(aon)
79 if ok {
80 return user.Addr(), user.Name(), true
81 }
82
83 addr := address(aon)
84 if addr.IsValid() {
85 return addr, "", true
86 }
87
88 return addr, "", false
89}
90
91func pfpURL(uri string) string {
92 if !strings.HasPrefix(uri, "ipfs://") {
93 return uri
94 }
95 withoutScheme := strings.TrimPrefix(uri, "ipfs://")
96 res := ufmt.Sprintf(`https://%s/ipfs/%s?img-width=100&img-height=100&img-fit=cover&img-dpr=2`, gatewayDomain, withoutScheme)
97 return res
98}