diff options
Diffstat (limited to 'internal/processing/workers/federate.go')
-rw-r--r-- | internal/processing/workers/federate.go | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/internal/processing/workers/federate.go b/internal/processing/workers/federate.go index aacb8dcc8..9fdb8f662 100644 --- a/internal/processing/workers/federate.go +++ b/internal/processing/workers/federate.go @@ -23,6 +23,7 @@ import ( "github.com/superseriousbusiness/activity/pub" "github.com/superseriousbusiness/activity/streams" + "github.com/superseriousbusiness/gotosocial/internal/ap" "github.com/superseriousbusiness/gotosocial/internal/federation" "github.com/superseriousbusiness/gotosocial/internal/gtserror" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" @@ -954,3 +955,68 @@ func (f *federate) Flag(ctx context.Context, report *gtsmodel.Report) error { return nil } + +func (f *federate) MoveAccount(ctx context.Context, account *gtsmodel.Account) error { + // Do nothing if it's not our + // account that's been moved. + if !account.IsLocal() { + return nil + } + + // Parse relevant URI(s). + outboxIRI, err := parseURI(account.OutboxURI) + if err != nil { + return err + } + + // Actor doing the Move. + actorIRI := account.Move.Origin + + // Destination Actor of the Move. + targetIRI := account.Move.Target + + followersIRI, err := parseURI(account.FollowersURI) + if err != nil { + return err + } + + publicIRI, err := parseURI(pub.PublicActivityPubIRI) + if err != nil { + return err + } + + // Create a new move. + move := streams.NewActivityStreamsMove() + + // Set the Move ID. + if err := ap.SetJSONLDIdStr(move, account.Move.URI); err != nil { + return err + } + + // Set the Actor for the Move. + ap.AppendActorIRIs(move, actorIRI) + + // Set the account's IRI as the 'object' property. + ap.AppendObjectIRIs(move, actorIRI) + + // Set the target's IRI as the 'target' property. + ap.AppendTargetIRIs(move, targetIRI) + + // Address the move To followers. + ap.AppendTo(move, followersIRI) + + // Address the move CC public. + ap.AppendCc(move, publicIRI) + + // Send the Move via the Actor's outbox. + if _, err := f.FederatingActor().Send( + ctx, outboxIRI, move, + ); err != nil { + return gtserror.Newf( + "error sending activity %T via outbox %s: %w", + move, outboxIRI, err, + ) + } + + return nil +} |