mirror of
https://github.com/nbd-wtf/go-nostr.git
synced 2025-09-17 19:13:56 +02:00
nip29: bring in helpers for managing groups to be used on the relay side.
This commit is contained in:
@@ -16,11 +16,13 @@ type Group struct {
|
||||
Closed bool
|
||||
|
||||
LastMetadataUpdate nostr.Timestamp
|
||||
LastAdminsUpdate nostr.Timestamp
|
||||
LastMembersUpdate nostr.Timestamp
|
||||
}
|
||||
|
||||
func (group Group) ToMetadataEvent() *nostr.Event {
|
||||
evt := &nostr.Event{
|
||||
Kind: 39000,
|
||||
Kind: nostr.KindSimpleGroupMetadata,
|
||||
CreatedAt: group.LastMetadataUpdate,
|
||||
Content: group.About,
|
||||
Tags: nostr.Tags{
|
||||
@@ -52,6 +54,47 @@ func (group Group) ToMetadataEvent() *nostr.Event {
|
||||
return evt
|
||||
}
|
||||
|
||||
func (group Group) ToAdminsEvent() *nostr.Event {
|
||||
evt := &nostr.Event{
|
||||
Kind: nostr.KindSimpleGroupAdmins,
|
||||
CreatedAt: group.LastAdminsUpdate,
|
||||
Tags: make(nostr.Tags, 1, 1+len(group.Members)/3),
|
||||
}
|
||||
evt.Tags[0] = nostr.Tag{"d", group.ID}
|
||||
|
||||
for member, role := range group.Members {
|
||||
if role != nil {
|
||||
// is an admin
|
||||
tag := make([]string, 0, 3+len(role.Permissions))
|
||||
tag[0] = "p"
|
||||
tag[1] = member
|
||||
tag[2] = role.Name
|
||||
for perm := range role.Permissions {
|
||||
tag = append(tag, string(perm))
|
||||
}
|
||||
evt.Tags = append(evt.Tags, tag)
|
||||
}
|
||||
}
|
||||
|
||||
return evt
|
||||
}
|
||||
|
||||
func (group Group) ToMembersEvent() *nostr.Event {
|
||||
evt := &nostr.Event{
|
||||
Kind: nostr.KindSimpleGroupMembers,
|
||||
CreatedAt: group.LastMembersUpdate,
|
||||
Tags: make(nostr.Tags, 1, 1+len(group.Members)),
|
||||
}
|
||||
evt.Tags[0] = nostr.Tag{"d", group.ID}
|
||||
|
||||
for member := range group.Members {
|
||||
// include both admins and normal members
|
||||
evt.Tags = append(evt.Tags, nostr.Tag{"p", member})
|
||||
}
|
||||
|
||||
return evt
|
||||
}
|
||||
|
||||
func (group *Group) MergeInMetadataEvent(evt *nostr.Event) error {
|
||||
if evt.Kind != nostr.KindSimpleGroupMetadata {
|
||||
return fmt.Errorf("expected kind %d, got %d", nostr.KindSimpleGroupMetadata, evt.Kind)
|
||||
@@ -84,3 +127,53 @@ func (group *Group) MergeInMetadataEvent(evt *nostr.Event) error {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (group *Group) MergeInAdminsEvent(evt *nostr.Event) error {
|
||||
if evt.Kind != nostr.KindSimpleGroupAdmins {
|
||||
return fmt.Errorf("expected kind %d, got %d", nostr.KindSimpleGroupAdmins, evt.Kind)
|
||||
}
|
||||
|
||||
if evt.CreatedAt <= group.LastAdminsUpdate {
|
||||
return fmt.Errorf("event is older than our last update (%d vs %d)", evt.CreatedAt, group.LastAdminsUpdate)
|
||||
}
|
||||
|
||||
group.LastAdminsUpdate = evt.CreatedAt
|
||||
for _, tag := range evt.Tags {
|
||||
if len(tag) < 3 {
|
||||
continue
|
||||
}
|
||||
if tag[0] != "p" {
|
||||
continue
|
||||
}
|
||||
if !nostr.IsValidPublicKeyHex(tag[1]) {
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (group *Group) MergeInMembersEvent(evt *nostr.Event) error {
|
||||
if evt.Kind != nostr.KindSimpleGroupMembers {
|
||||
return fmt.Errorf("expected kind %d, got %d", nostr.KindSimpleGroupMembers, evt.Kind)
|
||||
}
|
||||
|
||||
if evt.CreatedAt <= group.LastMembersUpdate {
|
||||
return fmt.Errorf("event is older than our last update (%d vs %d)", evt.CreatedAt, group.LastMembersUpdate)
|
||||
}
|
||||
|
||||
group.LastMembersUpdate = evt.CreatedAt
|
||||
for _, tag := range evt.Tags {
|
||||
if len(tag) < 2 {
|
||||
continue
|
||||
}
|
||||
if tag[0] != "p" {
|
||||
continue
|
||||
}
|
||||
if !nostr.IsValidPublicKeyHex(tag[1]) {
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user