memberstore.gno
5.62 Kb · 159 lines
1package memberstore
2
3import (
4 "std"
5 "strings"
6
7 "gno.land/p/demo/avl"
8 "gno.land/p/demo/ufmt"
9 "gno.land/r/gov/dao"
10)
11
12var members MembersByTier
13var Tiers TiersByName
14
15const (
16 T1 = "T1"
17 T2 = "T2"
18 T3 = "T3"
19)
20
21func init() {
22 members = NewMembersByTier()
23
24 Tiers = TiersByName{avl.NewTree()}
25 Tiers.Set(T1, Tier{
26 InvitationPoints: 3,
27 MinSize: func(membersByTier MembersByTier, tiersByName TiersByName) int {
28 return 70
29 },
30 MaxSize: func(membersByTier MembersByTier, tiersByName TiersByName) int {
31 return 0
32 },
33 BasePower: 3,
34 PowerHandler: func(membersByTier MembersByTier, tiersByName TiersByName) float64 {
35 return 3
36 },
37 })
38
39 Tiers.Set(T2, Tier{
40 InvitationPoints: 2,
41 MaxSize: func(membersByTier MembersByTier, tiersByName TiersByName) int {
42 return membersByTier.GetTierSize(T1) * 2
43 },
44 MinSize: func(membersByTier MembersByTier, tiersByName TiersByName) int {
45 return membersByTier.GetTierSize(T1) / 4
46 },
47 BasePower: 2,
48 PowerHandler: func(membersByTier MembersByTier, tiersByName TiersByName) float64 {
49 t1ms := float64(membersByTier.GetTierSize(T1))
50 t1, _ := tiersByName.GetTier(T1)
51 t2ms := float64(membersByTier.GetTierSize(T2))
52 t2, _ := tiersByName.GetTier(T2)
53
54 t1p := t1.BasePower * t1ms
55 t2p := t2.BasePower * t2ms
56
57 // capped to 2/3 of tier 1
58 t1ptreshold := t1p * (2.0 / 3.0)
59 if t2p > t1ptreshold {
60 return t1ptreshold / t2ms
61 }
62
63 return t2.BasePower
64 },
65 })
66
67 Tiers.Set(T3, Tier{
68 InvitationPoints: 1,
69 MaxSize: func(membersByTier MembersByTier, tiersByName TiersByName) int {
70 return 0
71 },
72 MinSize: func(membersByTier MembersByTier, tiersByName TiersByName) int {
73 return 0
74 },
75 BasePower: 1,
76 PowerHandler: func(membersByTier MembersByTier, tiersByName TiersByName) float64 {
77 t1ms := float64(membersByTier.GetTierSize(T1))
78 t1, _ := tiersByName.GetTier(T1)
79 t3ms := float64(membersByTier.GetTierSize(T3))
80 t3, _ := tiersByName.GetTier(T3)
81
82 t1p := t1.BasePower * t1ms
83 t3p := t3.BasePower * t3ms
84
85 // capped to 1/3 of tier 1
86 t1ptreshold := t1p * (1.0 / 3.0)
87 if t3p > t1ptreshold {
88 return t1ptreshold / t3ms
89 }
90
91 return t3.BasePower
92 },
93 })
94
95 members.SetTier(T1)
96 members.SetMember(T1, std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj"), &Member{InvitationPoints: 3}) // Jae
97 members.SetMember(T1, std.Address("g1manfred47kzduec920z88wfr64ylksmdcedlf5"), &Member{InvitationPoints: 3}) // Manfred
98 members.SetMember(T1, std.Address("g1e6gxg5tvc55mwsn7t7dymmlasratv7mkv0rap2"), &Member{InvitationPoints: 3}) // Milos
99 members.SetMember(T1, std.Address("g18amm3fc00t43dcxsys6udug0czyvqt9e7p23rd"), &Member{InvitationPoints: 3}) // Marc
100 members.SetMember(T1, std.Address("g19p3yzr3cuhzqa02j0ce6kzvyjqfzwemw3vam0x"), &Member{InvitationPoints: 3}) // Guilhem
101 members.SetMember(T1, std.Address("g127l4gkhk0emwsx5tmxe96sp86c05h8vg5tufzq"), &Member{InvitationPoints: 3}) // Maxwell
102 members.SetMember(T1, std.Address("g1m0rgan0rla00ygmdmp55f5m0unvsvknluyg2a4"), &Member{InvitationPoints: 3}) // Morgan
103 members.SetMember(T1, std.Address("g1ker4vvggvsyatexxn3hkthp2hu80pkhrwmuczr"), &Member{InvitationPoints: 3}) // Sergio
104 members.SetMember(T1, std.Address("g18x425qmujg99cfz3q97y4uep5pxjq3z8lmpt25"), &Member{InvitationPoints: 3}) // Antoine
105 members.SetMember(T1, std.Address("g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5"), &Member{InvitationPoints: 3}) // Michelle
106 members.SetMember(T1, std.Address("g12vx7dn3dqq89mz550zwunvg4qw6epq73d9csay"), &Member{InvitationPoints: 3}) // Dongwon
107 members.SetMember(T1, std.Address("g1mx4pum9976th863jgry4sdjzfwu03qan5w2v9j"), &Member{InvitationPoints: 3}) // Ray
108 members.SetMember(T1, std.Address("g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c"), &Member{InvitationPoints: 3}) // Zooma
109
110 members.SetTier(T2)
111 members.SetMember(T2, std.Address("g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7"), &Member{InvitationPoints: 2}) // Nemanja
112 members.SetMember(T2, std.Address("g1dfr24yhk5ztwtqn2a36m8f6ud8cx5hww4dkjfl"), &Member{InvitationPoints: 2}) // Antonio
113 members.SetMember(T2, std.Address("g16tfrrul20g4jzt3z303raqw8vs8s2pqqh5clwu"), &Member{InvitationPoints: 2}) // Ilker
114 members.SetMember(T2, std.Address("g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun"), &Member{InvitationPoints: 2}) // Jerónimo
115 members.SetMember(T2, std.Address("g1lckl8j2g3jyyuq6fx7pke3uz4kemht7lw4fg5l"), &Member{InvitationPoints: 2}) // Danny
116 members.SetMember(T2, std.Address("g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"), &Member{InvitationPoints: 2}) // Leon
117 members.SetMember(T2, std.Address("g17n4y745s08awwq4e0a38lagsgtntna0749tnxe"), &Member{InvitationPoints: 2}) // Jinwoo (Onbloc)
118 members.SetMember(T2, std.Address("g1ckae7tc5sez8ul3ssne75sk4muwgttp6ks2ky9"), &Member{InvitationPoints: 2}) // ByeongJun (Onbloc)
119
120 members.SetTier(T3)
121 members.SetMember(T3, std.Address("g1tdjkvapz5jxap6zxf06dxp7g88kad72svpzcu9"), &Member{InvitationPoints: 1}) // Norman
122 members.SetMember(T3, std.Address("g1qynsu9dwj9lq0m5fkje7jh6qy3md80ztqnshhm"), &Member{InvitationPoints: 1}) // Rémi
123}
124
125func Render(string) string {
126 var sb strings.Builder
127
128 sb.WriteString("# Memberstore Govdao v3:\n\n")
129
130 members.Iterate("", "", func(tn string, ti interface{}) bool {
131 tree, ok := ti.(*avl.Tree)
132 if !ok {
133 return false
134 }
135
136 tier, ok := Tiers.GetTier(tn)
137 if !ok {
138 return false
139 }
140
141 tp := (tier.PowerHandler(members, Tiers) * float64(members.GetTierSize(tn)))
142
143 sb.WriteString(ufmt.Sprintf("- Tier %v contains %v members with power: %v\n", tn, tree.Size(), tp))
144
145 return false
146 })
147
148 return sb.String()
149}
150
151// Get gets the Members store
152func Get() MembersByTier {
153 currealm := std.CurrentRealm().PkgPath()
154 if !dao.InAllowedDAOs(currealm) {
155 panic("this Realm is not allowed to get the Members data: " + currealm)
156 }
157
158 return members
159}