mirror of
https://github.com/nbd-wtf/go-nostr.git
synced 2025-07-04 12:33:04 +02:00
experimental nip29 support.
This commit is contained in:
13
event.go
13
event.go
@ -32,12 +32,22 @@ const (
|
|||||||
KindDeletion int = 5
|
KindDeletion int = 5
|
||||||
KindRepost int = 6
|
KindRepost int = 6
|
||||||
KindReaction int = 7
|
KindReaction int = 7
|
||||||
|
KindSimpleGroupChatMessage int = 9
|
||||||
|
KindSimpleGroupThread int = 11
|
||||||
|
KindSimpleGroupReply int = 12
|
||||||
KindChannelCreation int = 40
|
KindChannelCreation int = 40
|
||||||
KindChannelMetadata int = 41
|
KindChannelMetadata int = 41
|
||||||
KindChannelMessage int = 42
|
KindChannelMessage int = 42
|
||||||
KindChannelHideMessage int = 43
|
KindChannelHideMessage int = 43
|
||||||
KindChannelMuteUser int = 44
|
KindChannelMuteUser int = 44
|
||||||
KindFileMetadata int = 1063
|
KindFileMetadata int = 1063
|
||||||
|
KindSimpleGroupAddUser int = 9000
|
||||||
|
KindSimpleGroupRemoveUser int = 9001
|
||||||
|
KindSimpleGroupEditMetadata int = 9002
|
||||||
|
KindSimpleGroupAddPermission int = 9003
|
||||||
|
KindSimpleGroupRemovePermission int = 9004
|
||||||
|
KindSimpleGroupDeleteEvent int = 9005
|
||||||
|
KindSimpleGroupEditGroupStatus int = 9006
|
||||||
KindZapRequest int = 9734
|
KindZapRequest int = 9734
|
||||||
KindZap int = 9735
|
KindZap int = 9735
|
||||||
KindMuteList int = 10000
|
KindMuteList int = 10000
|
||||||
@ -56,6 +66,9 @@ const (
|
|||||||
KindProductDefinition int = 30018
|
KindProductDefinition int = 30018
|
||||||
KindArticle int = 30023
|
KindArticle int = 30023
|
||||||
KindApplicationSpecificData int = 30078
|
KindApplicationSpecificData int = 30078
|
||||||
|
KindSimpleGroupMetadata int = 39000
|
||||||
|
KindSimpleGroupAdmins int = 39001
|
||||||
|
KindSimpleGroupMembers int = 39002
|
||||||
)
|
)
|
||||||
|
|
||||||
// Event Stringer interface, just returns the raw JSON as a string.
|
// Event Stringer interface, just returns the raw JSON as a string.
|
||||||
|
86
nip29/group.go
Normal file
86
nip29/group.go
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
package nip29
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/nbd-wtf/go-nostr"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Group struct {
|
||||||
|
ID string
|
||||||
|
Name string
|
||||||
|
Picture string
|
||||||
|
About string
|
||||||
|
Members map[string]*Role
|
||||||
|
Private bool
|
||||||
|
Closed bool
|
||||||
|
|
||||||
|
LastMetadataUpdate nostr.Timestamp
|
||||||
|
}
|
||||||
|
|
||||||
|
func (group Group) ToMetadataEvent() *nostr.Event {
|
||||||
|
evt := &nostr.Event{
|
||||||
|
Kind: 39000,
|
||||||
|
CreatedAt: group.LastMetadataUpdate,
|
||||||
|
Content: group.About,
|
||||||
|
Tags: nostr.Tags{
|
||||||
|
nostr.Tag{"d", group.ID},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if group.Name != "" {
|
||||||
|
evt.Tags = append(evt.Tags, nostr.Tag{"name", group.Name})
|
||||||
|
}
|
||||||
|
if group.About != "" {
|
||||||
|
evt.Tags = append(evt.Tags, nostr.Tag{"about", group.Name})
|
||||||
|
}
|
||||||
|
if group.Picture != "" {
|
||||||
|
evt.Tags = append(evt.Tags, nostr.Tag{"picture", group.Picture})
|
||||||
|
}
|
||||||
|
|
||||||
|
// status
|
||||||
|
if group.Private {
|
||||||
|
evt.Tags = append(evt.Tags, nostr.Tag{"private"})
|
||||||
|
} else {
|
||||||
|
evt.Tags = append(evt.Tags, nostr.Tag{"public"})
|
||||||
|
}
|
||||||
|
if group.Closed {
|
||||||
|
evt.Tags = append(evt.Tags, nostr.Tag{"closed"})
|
||||||
|
} else {
|
||||||
|
evt.Tags = append(evt.Tags, nostr.Tag{"open"})
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
|
||||||
|
if evt.CreatedAt <= group.LastMetadataUpdate {
|
||||||
|
return fmt.Errorf("event is older than our last update (%d vs %d)", evt.CreatedAt, group.LastMetadataUpdate)
|
||||||
|
}
|
||||||
|
|
||||||
|
group.LastMetadataUpdate = evt.CreatedAt
|
||||||
|
group.ID = evt.Tags.GetD()
|
||||||
|
group.Name = group.ID
|
||||||
|
|
||||||
|
if tag := evt.Tags.GetFirst([]string{"name", ""}); tag != nil {
|
||||||
|
group.Name = (*tag)[1]
|
||||||
|
}
|
||||||
|
if tag := evt.Tags.GetFirst([]string{"about", ""}); tag != nil {
|
||||||
|
group.About = (*tag)[1]
|
||||||
|
}
|
||||||
|
if tag := evt.Tags.GetFirst([]string{"picture", ""}); tag != nil {
|
||||||
|
group.Picture = (*tag)[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
if tag := evt.Tags.GetFirst([]string{"private"}); tag != nil {
|
||||||
|
group.Private = true
|
||||||
|
}
|
||||||
|
if tag := evt.Tags.GetFirst([]string{"closed"}); tag != nil {
|
||||||
|
group.Closed = true
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
46
nip29/nip29.go
Normal file
46
nip29/nip29.go
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
package nip29
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/nbd-wtf/go-nostr"
|
||||||
|
"golang.org/x/exp/slices"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Role struct {
|
||||||
|
Name string
|
||||||
|
Permissions map[Permission]struct{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type Permission = string
|
||||||
|
|
||||||
|
const (
|
||||||
|
PermAddUser Permission = "add-user"
|
||||||
|
PermEditMetadata Permission = "edit-metadata"
|
||||||
|
PermDeleteEvent Permission = "delete-event"
|
||||||
|
PermRemoveUser Permission = "remove-user"
|
||||||
|
PermAddPermission Permission = "add-permission"
|
||||||
|
PermRemovePermission Permission = "remove-permission"
|
||||||
|
PermEditGroupStatus Permission = "edit-group-status"
|
||||||
|
)
|
||||||
|
|
||||||
|
type KindRange []int
|
||||||
|
|
||||||
|
var ModerationEventKinds = KindRange{
|
||||||
|
nostr.KindSimpleGroupAddUser,
|
||||||
|
nostr.KindSimpleGroupRemoveUser,
|
||||||
|
nostr.KindSimpleGroupEditMetadata,
|
||||||
|
nostr.KindSimpleGroupAddPermission,
|
||||||
|
nostr.KindSimpleGroupRemovePermission,
|
||||||
|
nostr.KindSimpleGroupDeleteEvent,
|
||||||
|
nostr.KindSimpleGroupEditGroupStatus,
|
||||||
|
}
|
||||||
|
|
||||||
|
var MetadataEventKinds = KindRange{
|
||||||
|
nostr.KindSimpleGroupMetadata,
|
||||||
|
nostr.KindSimpleGroupAdmins,
|
||||||
|
nostr.KindSimpleGroupMembers,
|
||||||
|
}
|
||||||
|
|
||||||
|
func (kr KindRange) Includes(kind int) bool {
|
||||||
|
_, ok := slices.BinarySearch(kr, kind)
|
||||||
|
return ok
|
||||||
|
}
|
Reference in New Issue
Block a user