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}