71 lines
1.7 KiB
Go
71 lines
1.7 KiB
Go
package relay29
|
|
|
|
import (
|
|
"context"
|
|
"sync"
|
|
|
|
"github.com/nbd-wtf/go-nostr"
|
|
"github.com/nbd-wtf/go-nostr/nip29"
|
|
)
|
|
|
|
type Group struct {
|
|
nip29.Group
|
|
mu sync.RWMutex
|
|
}
|
|
|
|
func (s *State) NewGroup(id string) *Group {
|
|
return &Group{
|
|
Group: nip29.Group{
|
|
Address: nip29.GroupAddress{
|
|
ID: id,
|
|
Relay: "wss://" + s.Domain,
|
|
},
|
|
Members: map[string]*nip29.Role{},
|
|
},
|
|
}
|
|
}
|
|
|
|
// loadGroups loads all the group metadata from all the past action messages.
|
|
func (s *State) loadGroups(ctx context.Context) {
|
|
groupMetadataEvents, _ := s.DB.QueryEvents(ctx, nostr.Filter{Kinds: []int{nostr.KindSimpleGroupCreateGroup}})
|
|
for evt := range groupMetadataEvents {
|
|
gtag := evt.Tags.GetFirst([]string{"h", ""})
|
|
id := (*gtag)[1]
|
|
|
|
group := s.NewGroup(id)
|
|
f := nostr.Filter{
|
|
Limit: 5000, Kinds: nip29.ModerationEventKinds, Tags: nostr.TagMap{"h": []string{id}},
|
|
}
|
|
ch, _ := s.DB.QueryEvents(ctx, f)
|
|
|
|
events := make([]*nostr.Event, 0, 5000)
|
|
for event := range ch {
|
|
events = append(events, event)
|
|
}
|
|
for i := len(events) - 1; i >= 0; i-- {
|
|
evt := events[i]
|
|
act, _ := PrepareModerationAction(evt)
|
|
act.Apply(&group.Group)
|
|
}
|
|
|
|
// if the group was deleted there will be no actions after the delete
|
|
if len(events) > 0 && events[0].Kind == nostr.KindSimpleGroupDeleteGroup {
|
|
// we don't keep track of this if it was deleted
|
|
continue
|
|
}
|
|
|
|
s.Groups.Store(group.Address.ID, group)
|
|
}
|
|
}
|
|
|
|
func (s *State) GetGroupFromEvent(event *nostr.Event) *Group {
|
|
group, _ := s.Groups.Load(GetGroupIDFromEvent(event))
|
|
return group
|
|
}
|
|
|
|
func GetGroupIDFromEvent(event *nostr.Event) string {
|
|
gtag := event.Tags.GetFirst([]string{"h", ""})
|
|
groupId := (*gtag)[1]
|
|
return groupId
|
|
}
|