Files
nostrlib/nip34/repository.go
2025-11-23 17:52:39 -03:00

143 lines
3.3 KiB
Go

package nip34
import (
"fmt"
"fiatjaf.com/nostr"
)
type Repository struct {
nostr.Event
ID string
Name string
Description string
Web []string
Clone []string
Relays []string
EarliestUniqueCommitID string
Maintainers []nostr.PubKey
}
func ParseRepository(event nostr.Event) Repository {
repo := Repository{
Event: event,
}
for _, tag := range event.Tags {
if len(tag) < 2 {
continue
}
switch tag[0] {
case "d":
repo.ID = tag[1]
case "name":
repo.Name = tag[1]
case "description":
repo.Description = tag[1]
case "web":
repo.Web = append(repo.Web, tag[1:]...)
case "clone":
repo.Clone = append(repo.Clone, tag[1:]...)
case "relays":
repo.Relays = append(repo.Relays, tag[1:]...)
case "r":
repo.EarliestUniqueCommitID = tag[1]
case "maintainers":
for _, pkh := range tag[1:] {
if pk, err := nostr.PubKeyFromHex(pkh); err == nil {
repo.Maintainers = append(repo.Maintainers, pk)
}
}
}
}
return repo
}
func (r Repository) ToEvent() nostr.Event {
tags := make(nostr.Tags, 0, 10)
tags = append(tags, nostr.Tag{"d", r.ID})
if r.Name != "" {
tags = append(tags, nostr.Tag{"name", r.Name})
}
if r.Description != "" {
tags = append(tags, nostr.Tag{"description", r.Description})
}
if r.EarliestUniqueCommitID != "" {
tags = append(tags, nostr.Tag{"r", r.EarliestUniqueCommitID, "euc"})
}
if len(r.Maintainers) > 0 {
tag := make(nostr.Tag, 1, 1+len(r.Maintainers))
tag[0] = "maintainers"
for _, pk := range r.Maintainers {
tag = append(tag, pk.Hex())
}
tags = append(tags, tag)
}
if len(r.Web) > 0 {
tag := make(nostr.Tag, 1, 1+len(r.Web))
tag[0] = "web"
tag = append(tag, r.Web...)
tags = append(tags, tag)
}
if len(r.Clone) > 0 {
tag := make(nostr.Tag, 1, 1+len(r.Clone))
tag[0] = "clone"
tag = append(tag, r.Clone...)
tags = append(tags, tag)
}
if len(r.Relays) > 0 {
tag := make(nostr.Tag, 1, 1+len(r.Relays))
tag[0] = "relays"
tag = append(tag, r.Relays...)
tags = append(tags, tag)
}
return nostr.Event{
Kind: nostr.KindRepositoryAnnouncement,
Tags: tags,
CreatedAt: nostr.Now(),
}
}
func (r Repository) String() string {
return fmt.Sprintf("Repository{ID: %s, Name: %s, Description: %s, Web: %v, Clone: %v, Relays: %v, EarliestUniqueCommitID: %s, Maintainers: %v}", r.ID, r.Name, r.Description, r.Web, r.Clone, r.Relays, r.EarliestUniqueCommitID, r.Maintainers)
}
func (r Repository) Equals(other Repository) bool {
if r.ID != other.ID || r.Name != other.Name || r.Description != other.Description {
return false
}
if r.EarliestUniqueCommitID != other.EarliestUniqueCommitID {
return false
}
if len(r.Web) != len(other.Web) || len(r.Clone) != len(other.Clone) ||
len(r.Relays) != len(other.Relays) || len(r.Maintainers) != len(other.Maintainers) {
return false
}
for i := range r.Web {
if r.Web[i] != other.Web[i] {
return false
}
}
for i := range r.Clone {
if r.Clone[i] != other.Clone[i] {
return false
}
}
for i := range r.Relays {
if r.Relays[i] != other.Relays[i] {
return false
}
}
for i := range r.Maintainers {
if r.Maintainers[i] != other.Maintainers[i] {
return false
}
}
return true
}