@@ -3,6 +3,7 @@ package dao_roles_group
33import (
44 "std"
55
6+ "gno.land/p/demo/avl"
67 "gno.land/p/demo/json"
78 dao_interfaces "gno.land/p/teritori/dao_interfaces"
89 "gno.land/p/teritori/jsonutil"
@@ -12,12 +13,19 @@ import (
1213type RolesGroup struct {
1314 dao_interfaces.IRolesModule
1415
15- rm *role_manager.RoleManager
16+ rm *role_manager.RoleManager
17+ resourcesVPower *avl.Tree // roles -> ResourceVPower[]
18+ }
19+
20+ type ResourceVPower struct {
21+ Resource string
22+ Power uint64
1623}
1724
1825func NewRolesGroup() *RolesGroup {
1926 return &RolesGroup{
20- rm: role_manager.NewWithAddress(std.PrevRealm().Addr()),
27+ rm: role_manager.NewWithAddress(std.PrevRealm().Addr()),
28+ resourcesVPower: avl.NewTree(),
2129 }
2230}
2331
@@ -42,8 +50,25 @@ func (r *RolesGroup) HasRole(address std.Address, role string) bool {
4250 return r.rm.HasRole(address, role)
4351}
4452
45- func (r *RolesGroup) NewRole(roleName string) {
53+ func (r *RolesGroup) NewRoleJSON(roleName, resourcesJSON string) {
54+ node := json.Must(json.Unmarshal([]byte(resourcesJSON)))
55+ arr := node.MustArray()
56+ resources := make([]ResourceVPower, len(arr))
57+ for i, n := range arr {
58+ node := n.MustObject()
59+ resources[i] = ResourceVPower{
60+ Resource: node["resource"].MustString(),
61+ Power: jsonutil.MustUint64(node["power"]),
62+ }
63+ }
64+ r.NewRole(roleName, resources)
65+ }
66+
67+ func (r *RolesGroup) NewRole(roleName string, resources []ResourceVPower) {
4668 r.rm.CreateNewRole(roleName, []string{})
69+ if len(resources) > 0 {
70+ r.resourcesVPower.Set(roleName, resources)
71+ }
4772}
4873
4974func (r *RolesGroup) DeleteRole(roleName string) {
@@ -61,3 +86,21 @@ func (r *RolesGroup) RevokeRole(address std.Address, role string) {
6186func (r *RolesGroup) GetMemberRoles(address std.Address) []string {
6287 return r.rm.GetUserRoles(address)
6388}
89+
90+ func (r *RolesGroup) GetMemberResourceVPower(address std.Address, resource string) uint64 {
91+ roles := r.rm.GetUserRoles(address)
92+ power := uint64(0)
93+ for _, role := range roles {
94+ resourcesRaw, exists := r.resourcesVPower.Get(role)
95+ if !exists {
96+ continue
97+ }
98+ resources := resourcesRaw.([]ResourceVPower)
99+ for _, r := range resources {
100+ if r.Resource == resource && r.Power > power {
101+ power = r.Power
102+ }
103+ }
104+ }
105+ return power
106+ }
0 commit comments