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}