diff --git a/nip29/group.go b/nip29/group.go index 5c260e2..e0c0e70 100644 --- a/nip29/group.go +++ b/nip29/group.go @@ -333,3 +333,38 @@ func (group *Group) MergeInMembersEvent(evt *nostr.Event) error { return nil } + +func (group *Group) MergeInRolesEvent(evt *nostr.Event) error { + if evt.Kind != nostr.KindSimpleGroupRoles { + return fmt.Errorf("expected kind %d, got %d", nostr.KindSimpleGroupRoles, evt.Kind) + } + if evt.CreatedAt < group.LastRolesUpdate { + return fmt.Errorf("event is older than our last update (%d vs %d)", evt.CreatedAt, group.LastRolesUpdate) + } + + group.LastRolesUpdate = evt.CreatedAt + for _, tag := range evt.Tags { + if len(tag) < 2 { + continue + } + if tag[0] != "role" { + continue + } + + roleName := tag[1] + roleDescription := "" + if len(tag) >= 3 { + roleDescription = tag[2] + } + + if idx := slices.IndexFunc(group.Roles, func(role *Role) bool { return role.Name == roleName }); idx >= 0 { + // update existing role description + group.Roles[idx].Description = roleDescription + } else { + // add new role + group.Roles = append(group.Roles, &Role{Name: roleName, Description: roleDescription}) + } + } + + return nil +}