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