Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}