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  }