An account elsewhere that pins or unpins one of its posts (Add or Remove on its `featured`) now shows those pins on its profile here (`pinned=true`), in its order and its public posts only; a community's announce of a moderator's Add does the same for the community. The `featured` collection itself is read with the account's counts, at most once a day, so pins made before PrivaPub ever saw an account show too. Any other target (Smithereen's wall, a community's moderators) is dropped. A persona's pin and unpin go to the post's audience as Add and Remove on /trophies, as Mastodon sends them. Checked live against Mastodon (scenarios/pins.sh, 8 checks). The town's checker learnt three peer rules from the village: Misskey and Sharkey keep a forwarded reply only with its author's LD signature (only Mastodon signs), they count no renote by a bot, and Mastodon never sees a Lemmy vote on a post in a community. The village of 2026-10-05 checks clean, 2454 of 2454. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LsXgEaXee4GCU1hwYgPJXw
27 lines
847 B
C#
27 lines
847 B
C#
using PrivaPub.Federation.Actors;
|
|
using PrivaPub.Models.User;
|
|
|
|
using System.Text.Json.Nodes;
|
|
|
|
namespace PrivaPub.Federation.Inbox.Handlers
|
|
{
|
|
// An account pins one of its posts (Add to its `featured` collection) or unpins it (Remove), as Mastodon and Akkoma
|
|
// send it; inside a community's announce, the community features a post made in it. Any other target (Smithereen's
|
|
// wall, a community's moderators) is not ours to keep.
|
|
public class FeaturedHandler : IActivityHandler
|
|
{
|
|
readonly IFeaturedPosts _featured;
|
|
readonly bool _add;
|
|
|
|
public FeaturedHandler(IFeaturedPosts featured, bool add)
|
|
{
|
|
_featured = featured;
|
|
_add = add;
|
|
}
|
|
|
|
public string Type => _add ? "Add" : "Remove";
|
|
|
|
public Task Handle(JsonNode activity, ForeignAvatar actor, CancellationToken token) => _featured.Receive(activity, actor, _add, token);
|
|
}
|
|
}
|