twink/vendor/sourcery.dny.nu/pana/activity.go

269 lines
6.6 KiB
Go
Raw Normal View History

2025-12-05 12:20:05 +01:00
package pana
import (
"encoding/json"
"iter"
ld "sourcery.dny.nu/longdistance"
"sourcery.dny.nu/pana/vocab/litepub"
as "sourcery.dny.nu/pana/vocab/w3/activitystreams"
)
// IntransitiveActivity is the ActivityStreams Intransitive Activity type.
//
// It's aliassed to [Object] because that's basically what it is. In practice
// this is rarely if ever used. Polls are modelled as Create Question, even
// though Question is intransitive.
type IntransitiveActivity = Object
// Activity is the ActivityStreams Activity type.
//
// This is a more limited view of [Object] with property getters and setters for
// the properties that are commonly set on the toplevel activity.
type Activity Object
// NewActivity initialises a new activity.
//
// It's initialised with [as.TypeCreate]. Use [Activity.SetType] to override it.
func NewActivity() *Activity {
return &Activity{
Properties: make(ld.Properties),
Type: []string{as.TypeCreate},
}
}
// Accept is the Accept activity.
type Accept = Activity
// NewAccept initialises a new Accept activity with [as.TypeAccept].
func NewAccept() *Accept {
return (*Accept)(NewActivity().SetType(as.TypeAccept))
}
type Add = Activity
// NewAdd initialises a new Add activity with [as.TypeAdd].
func NewAdd() *Add {
return (*Add)(NewActivity().SetType(as.TypeAdd))
}
type Announce = Activity
// NewAnnounce initialises a new Announce activity with [as.TypeAnnounce].
func NewAnnounce() *Announce {
return (*Announce)(NewActivity().SetType(as.TypeAnnounce))
}
type Block = Activity
// NewBlock initialises a new Block activity with [as.TypeBlock].
func NewBlock() *Block {
return (*Block)(NewActivity().SetType(as.TypeBlock))
}
type Create = Activity
// NewCreate initialises a new Create activity with [as.TypeCreate].
func NewCreate() *Create {
return NewActivity()
}
type Delete = Activity
// NewDelete initialises a new Delete activity with [as.TypeDelete].
func NewDelete() *Delete {
return (*Delete)(NewActivity().SetType(as.TypeDelete))
}
type EmojiReact = Activity
// NewEmojiReact initialises a new EmojiReact activity with
// [litepub.TypeEmojiReact].
func NewEmojiReact() *EmojiReact {
return (*EmojiReact)(NewActivity().SetType(litepub.TypeEmojiReact))
}
type Follow = Activity
// NewFollow initialises a new Follow activity with [as.TypeFollow].
func NewFollow() *Follow {
return (*Follow)(NewActivity().SetType(as.TypeFollow))
}
type Like = Activity
// NewLike initialises a new Like activity with [as.TypeLike].
func NewLike() *Like {
return (*Like)(NewActivity().SetType(as.TypeLike))
}
type Move = Activity
// NewMove initialises a new Move activity with [as.TypeMove].
func NewMove() *Move {
return (*Move)(NewActivity().SetType(as.TypeMove))
}
type Remove = Activity
// NewRemove initialises a new Remove activity with [as.TypeRemove].
func NewRemove() *Remove {
return (*Remove)(NewActivity().SetType(as.TypeRemove))
}
type Undo = Activity
// NewUndo initialises a new Undo activity with [as.TypeUndo].
func NewUndo() *Undo {
return (*Undo)(NewActivity().SetType(as.TypeUndo))
}
type Update = Activity
// NewUpdate initialises a new Update activity with [as.TypeUpdate].
func NewUpdate() *Update {
return (*Update)(NewActivity().SetType(as.TypeUpdate))
}
// Build finalises the Activity.
func (a *Activity) Build() Activity {
return *a
}
// IsIntransitive returns true if the activity has no object.
func (a *Activity) IsIntransitive() bool {
return !Has(a, as.Object)
}
// See [Object.GetID].
func (a *Activity) GetID() string {
return (*Object)(a).GetID()
}
// See [Object.SetID].
func (a *Activity) SetID(id string) *Activity {
(*Object)(a).SetID(id)
return a
}
// See [Object.GetType].
func (a *Activity) GetType() string {
return (*Object)(a).GetType()
}
// See [Object.SetType].
func (a *Activity) SetType(typ string) *Activity {
(*Object)(a).SetType(typ)
return a
}
// GetActor returns the actor IDs from [as.Actor].
//
// See https://www.w3.org/TR/activitystreams-vocabulary/#dfn-actor.
func (a *Activity) GetActor() iter.Seq[string] {
return func(yield func(string) bool) {
for _, n := range (*ld.Node)(a).GetNodes(as.Actor) {
if !yield(n.ID) {
return
}
}
}
}
// AddActor appends actor IDs to [as.Actor].
func (a *Activity) AddActor(ids ...string) *Activity {
(*ld.Node)(a).AddNodes(as.Actor, toReference(ids...)...)
return a
}
// GetInstrument returns the instrument in [as.Instrument].
//
// See https://www.w3.org/TR/activitystreams-vocabulary/#dfn-instrument.
func (a *Activity) GetInstrument() *Instrument {
if nodes := (*ld.Node)(a).GetNodes(as.Instrument); len(nodes) == 1 {
return (*Instrument)(&nodes[0])
}
return nil
}
// SetInstrument sets the instrument in [as.Instrument].
func (a *Activity) SetInstrument(in Instrument) *Activity {
(*ld.Node)(a).SetNodes(as.Instrument, ld.Node(in))
return a
}
// GetObject returns the object in [as.Object].
//
// This returns [as.Any] because it can be of many different types. If the
// [Any.GetType] doesn't match any known type you can cast it to [Object].
//
// https://www.w3.org/TR/activitystreams-vocabulary/#dfn-object.
func (a *Activity) GetObject() *Any {
if nodes := (*ld.Node)(a).GetNodes(as.Object); len(nodes) == 1 {
return (*Any)(&nodes[0])
}
return nil
}
// SetObject sets the object in [as.Object].
//
// It is possible to have more than one object. However, except for JSON-LD
// aware processors, nobody understands this. If you want to send multiple
// objects, send multiple activities instead.
func (a *Activity) SetObject(obj Any) *Activity {
(*ld.Node)(a).SetNodes(as.Object, ld.Node(obj))
return a
}
// GetTarget returns the ID in [as.Target].
//
// See https://www.w3.org/TR/activitystreams-vocabulary/#dfn-target.
func (a *Activity) GetTarget() string {
if nodes := (*ld.Node)(a).GetNodes(as.Target); len(nodes) == 1 {
return nodes[0].ID
}
return ""
}
// SetTarget sets the ID in [as.Target].
func (a *Activity) SetTarget(id string) *Activity {
(*ld.Node)(a).SetNodes(as.Target, ld.Node{ID: id})
return a
}
// See [Object.GetCc].
func (a *Activity) GetCc() iter.Seq[string] {
return (*Object)(a).GetCc()
}
// See [Object.AddCc].
func (a *Activity) AddCc(ids ...string) *Activity {
(*Object)(a).AddCc(ids...)
return a
}
// See [Object.GetTo].
func (a *Activity) GetTo() iter.Seq[string] {
return (*Object)(a).GetTo()
}
// See [Object.AddTo].
func (a *Activity) AddTo(ids ...string) *Activity {
(*Object)(a).AddTo(ids...)
return a
}
// See [Object.GetPublished].
func (a *Activity) GetPublished() json.RawMessage {
return (*Object)(a).GetPublished()
}
// See [Object.SetPublished].
func (a *Activity) SetPublished(v json.RawMessage) *Activity {
(*Object)(a).SetPublished(v)
return a
}