github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/examples/gno.land/r/demo/groups/group.gno (about) 1 package groups 2 3 import ( 4 "std" 5 "strconv" 6 "time" 7 8 "gno.land/p/demo/avl" 9 ) 10 11 type GroupID uint64 12 13 func (gid GroupID) String() string { 14 return strconv.Itoa(int(gid)) 15 } 16 17 type Group struct { 18 id GroupID 19 url string 20 name string 21 lastMemberID MemberID 22 members avl.Tree 23 creator std.Address 24 createdAt time.Time 25 } 26 27 func newGroup(url string, name string, creator std.Address) *Group { 28 if !reName.MatchString(name) { 29 panic("invalid name: " + name) 30 } 31 if gGroupsByName.Has(name) { 32 panic("Group with such name already exists") 33 } 34 return &Group{ 35 id: incGetGroupID(), 36 url: url, 37 name: name, 38 creator: creator, 39 members: avl.Tree{}, 40 createdAt: time.Now(), 41 } 42 } 43 44 func (group *Group) newMember(id MemberID, address std.Address, weight int, metadata string) *Member { 45 if group.members.Has(address.String()) { 46 panic("this member for this group already exists") 47 } 48 return &Member{ 49 id: id, 50 address: address, 51 weight: weight, 52 metadata: metadata, 53 createdAt: time.Now(), 54 } 55 } 56 57 func (group *Group) HasPermission(addr std.Address, perm Permission) bool { 58 if group.creator != addr { 59 return false 60 } 61 return isValidPermission(perm) 62 } 63 64 func (group *Group) RenderGroup() string { 65 str := "Group ID: " + groupIDKey(group.id) + "\n\n" + 66 "Group Name: " + group.name + "\n\n" + 67 "Group Creator: " + usernameOf(group.creator) + "\n\n" + 68 "Group createdAt: " + group.createdAt.String() + "\n\n" + 69 "Group Last MemberID: " + memberIDKey(group.lastMemberID) + "\n\n" 70 71 str += "Group Members: \n\n" 72 group.members.Iterate("", "", func(key string, value interface{}) bool { 73 member := value.(*Member) 74 str += member.getMemberStr() 75 return false 76 }) 77 return str 78 } 79 80 func (group *Group) deleteGroup() { 81 gidkey := groupIDKey(group.id) 82 _, gGroupsRemoved := gGroups.Remove(gidkey) 83 if !gGroupsRemoved { 84 panic("group does not exist with id " + group.id.String()) 85 } 86 gGroupsByName.Remove(group.name) 87 } 88 89 func (group *Group) deleteMember(mid MemberID) { 90 gidkey := groupIDKey(group.id) 91 if !gGroups.Has(gidkey) { 92 panic("group does not exist with id " + group.id.String()) 93 } 94 95 g := getGroup(group.id) 96 midkey := memberIDKey(mid) 97 g.members.Remove(midkey) 98 }