Owner decision of 2026-10-06 (G-0009, FEP-400e). A persona's actor names its wall (…/graffiti, sm:wall) and, in
Smithereen's privacySettings, that its followers may write on it. A public post that is not a reply, sent with the wall
as its target by an account following the persona, is hosted: the persona is notified, it reaches the persona's and its
followers' homes, and the followers' servers and the author's are told with Add{Note}. The persona deletes it with
DELETE /api/v1/statuses/:id, which sends Remove{Note}; Smithereen deletes the post then. The wall lists the persona's
public posts that start a thread and what was written on it.
Elsewhere: an account's Add{Note} on its own wall shows the post to its followers here as on that wall (privapub.wall on
the status), and its Remove takes it away. An Add or Remove naming a collection of the account's own server PrivaPub
does not know has its document read again first, at most hourly: accounts kept before walls were read had none.
Checked live: Smithereen 40 checks (G-0009 closed); GoToSocial and Mastodon unchanged (121).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LsXgEaXee4GCU1hwYgPJXw
456 lines
14 KiB
C#
456 lines
14 KiB
C#
namespace PrivaPub.Api.Mastodon.Entities
|
|
{
|
|
public class Account
|
|
{
|
|
public string Id { get; set; }
|
|
public string Username { get; set; }
|
|
public string Acct { get; set; }
|
|
public string DisplayName { get; set; }
|
|
public bool Locked { get; set; }
|
|
public bool Bot { get; set; }
|
|
public bool? Discoverable { get; set; }
|
|
public bool Indexable { get; set; }
|
|
public bool Group { get; set; }
|
|
public string CreatedAt { get; set; }
|
|
public string Note { get; set; }
|
|
public string Url { get; set; }
|
|
public string Uri { get; set; }
|
|
public string Avatar { get; set; }
|
|
public string AvatarStatic { get; set; }
|
|
public string Header { get; set; }
|
|
public string HeaderStatic { get; set; }
|
|
public int FollowersCount { get; set; }
|
|
public int FollowingCount { get; set; }
|
|
public int StatusesCount { get; set; }
|
|
public string LastStatusAt { get; set; }
|
|
public bool? HideCollections { get; set; }
|
|
public bool Noindex { get; set; } = true;
|
|
public List<CustomEmojiEntity> Emojis { get; set; } = new();
|
|
public List<object> Roles { get; set; } = new();
|
|
public bool? Memorial { get; set; }
|
|
public string AvatarDescription { get; set; } = string.Empty;
|
|
public string HeaderDescription { get; set; } = string.Empty;
|
|
public List<Field> Fields { get; set; } = new();
|
|
public Source Source { get; set; }
|
|
public Account Moved { get; set; }//the account it moved to, when that account names it among its aliases
|
|
}
|
|
|
|
public class CustomEmojiEntity
|
|
{
|
|
public string Shortcode { get; set; }
|
|
public string Url { get; set; }
|
|
public string StaticUrl { get; set; }
|
|
public bool VisibleInPicker { get; set; }
|
|
public string Category { get; set; }
|
|
}
|
|
|
|
public class Field
|
|
{
|
|
public string Name { get; set; }
|
|
public string Value { get; set; }
|
|
public string VerifiedAt { get; set; }
|
|
}
|
|
|
|
public class Source
|
|
{
|
|
public string Privacy { get; set; } = "public";
|
|
public bool Sensitive { get; set; }
|
|
public string Language { get; set; }
|
|
public string Note { get; set; } = string.Empty;
|
|
public List<Field> Fields { get; set; } = new();
|
|
public int FollowRequestsCount { get; set; }
|
|
public string AttributionDomains { get; set; }
|
|
public string QuotePolicy { get; set; } = "public";
|
|
}
|
|
|
|
public class PrivaPubStatus
|
|
{
|
|
public string ObjectType { get; set; }
|
|
public bool Locked { get; set; }//its community's moderators locked it: a reply is refused
|
|
public string Approval { get; set; }//our reply or boost its target's author must approve: "pending", "rejected"
|
|
public string Title { get; set; }
|
|
public string Excerpt { get; set; }
|
|
public string Cover { get; set; }
|
|
public PrivaPubSource Source { get; set; }
|
|
public PrivaPubLink Link { get; set; }
|
|
public PrivaPubVideo Video { get; set; }
|
|
public PrivaPubAudio Audio { get; set; }
|
|
public PrivaPubEvent Event { get; set; }
|
|
public PrivaPubPlace Place { get; set; }//a remote post's own place (Pixelfed), shown only
|
|
public Account Wall { get; set; }//whose wall it was written on (FEP-400e), when not its author's
|
|
public PrivaPubVotes Votes { get; set; } = new();
|
|
}
|
|
|
|
public class PrivaPubSource
|
|
{
|
|
public string Content { get; set; }
|
|
public string MediaType { get; set; }
|
|
}
|
|
|
|
public class PrivaPubLink
|
|
{
|
|
public string Url { get; set; }
|
|
public string Title { get; set; }
|
|
public string Description { get; set; }
|
|
public string Image { get; set; }
|
|
public bool FromPublisher { get; set; }
|
|
}
|
|
|
|
public class PrivaPubVariant
|
|
{
|
|
public string Url { get; set; }
|
|
public string MediaType { get; set; }
|
|
public int? Width { get; set; }
|
|
public int? Height { get; set; }
|
|
public double? Fps { get; set; }
|
|
public long? Size { get; set; }
|
|
public List<string> Streams { get; set; } = new();
|
|
}
|
|
|
|
public class PrivaPubVideo
|
|
{
|
|
public double? Duration { get; set; }
|
|
public List<PrivaPubVariant> Variants { get; set; } = new();
|
|
public bool IsLive { get; set; }
|
|
public int? State { get; set; }
|
|
public long? Views { get; set; }
|
|
public int? CommentsPolicy { get; set; }
|
|
public bool? DownloadEnabled { get; set; }
|
|
public string Licence { get; set; }
|
|
public string Category { get; set; }
|
|
public string Channel { get; set; }
|
|
public List<PrivaPubCaption> Captions { get; set; } = new();
|
|
}
|
|
|
|
public class PrivaPubCaption
|
|
{
|
|
public string Language { get; set; }
|
|
public string Url { get; set; }
|
|
}
|
|
|
|
public class PrivaPubAudio
|
|
{
|
|
public double? Duration { get; set; }
|
|
public List<PrivaPubVariant> Variants { get; set; } = new();
|
|
public string Album { get; set; }
|
|
public int? Position { get; set; }
|
|
public string Licence { get; set; }
|
|
}
|
|
|
|
public class PrivaPubEvent
|
|
{
|
|
public string Start { get; set; }
|
|
public string End { get; set; }
|
|
public string TimeZone { get; set; }
|
|
public bool Floating { get; set; }
|
|
public List<PrivaPubPlace> Places { get; set; } = new();
|
|
public string OnlineUrl { get; set; }
|
|
public string JoinMode { get; set; }
|
|
public int? Participants { get; set; }
|
|
public int? Capacity { get; set; }
|
|
public string Status { get; set; }
|
|
public string Category { get; set; }
|
|
public string Participation { get; set; }//the viewer's: "pending", "accepted" or "rejected"
|
|
}
|
|
|
|
public class PrivaPubPlace
|
|
{
|
|
public string Name { get; set; }
|
|
public string Address { get; set; }
|
|
public string Country { get; set; }//a post's own place only
|
|
public double? Latitude { get; set; }
|
|
public double? Longitude { get; set; }
|
|
public string Url { get; set; }
|
|
}
|
|
|
|
public class PrivaPubVotes
|
|
{
|
|
public int Up { get; set; }
|
|
public int Down { get; set; }
|
|
}
|
|
|
|
public class QuoteEntity
|
|
{
|
|
public string State { get; set; }
|
|
public Status QuotedStatus { get; set; }
|
|
public string QuotedStatusId { get; set; }
|
|
}
|
|
|
|
public class QuoteApprovalEntity
|
|
{
|
|
public List<string> Automatic { get; set; } = new();
|
|
public List<string> Manual { get; set; } = new();
|
|
public string CurrentUser { get; set; } = "denied";
|
|
}
|
|
|
|
public class FilterEntity
|
|
{
|
|
public string Id { get; set; }
|
|
public string Title { get; set; }
|
|
public List<string> Context { get; set; } = new();
|
|
public string ExpiresAt { get; set; }
|
|
public string FilterAction { get; set; }
|
|
public List<FilterKeywordEntity> Keywords { get; set; } = new();
|
|
public List<FilterStatusEntity> Statuses { get; set; } = new();
|
|
}
|
|
|
|
public class FilterKeywordEntity
|
|
{
|
|
public string Id { get; set; }
|
|
public string Keyword { get; set; }
|
|
public bool WholeWord { get; set; }
|
|
}
|
|
|
|
public class FilterStatusEntity
|
|
{
|
|
public string Id { get; set; }
|
|
public string StatusId { get; set; }
|
|
}
|
|
|
|
public class FilterResultEntity
|
|
{
|
|
public FilterEntity Filter { get; set; }
|
|
public List<string> KeywordMatches { get; set; }
|
|
public List<string> StatusMatches { get; set; }
|
|
}
|
|
|
|
// the v1 filter, which is one keyword of a v2 filter
|
|
public class FilterV1Entity
|
|
{
|
|
public string Id { get; set; }
|
|
public string Phrase { get; set; }
|
|
public List<string> Context { get; set; } = new();
|
|
public bool WholeWord { get; set; }
|
|
public string ExpiresAt { get; set; }
|
|
public bool Irreversible { get; set; }
|
|
}
|
|
|
|
public class EmojiReactionEntity
|
|
{
|
|
public string Name { get; set; }
|
|
public int Count { get; set; }
|
|
public bool Me { get; set; }
|
|
public string Url { get; set; }
|
|
public string StaticUrl { get; set; }
|
|
}
|
|
|
|
public class PleromaStatus
|
|
{
|
|
public List<EmojiReactionEntity> EmojiReactions { get; set; } = new();
|
|
}
|
|
|
|
public class PollEntity
|
|
{
|
|
public string Id { get; set; }
|
|
public string ExpiresAt { get; set; }
|
|
public bool Expired { get; set; }
|
|
public bool Multiple { get; set; }
|
|
public int VotesCount { get; set; }
|
|
public int? VotersCount { get; set; }
|
|
public bool? Voted { get; set; }
|
|
public List<int> OwnVotes { get; set; }
|
|
public List<PollOptionEntity> Options { get; set; } = new();
|
|
public List<CustomEmojiEntity> Emojis { get; set; } = new();
|
|
}
|
|
|
|
public class PollOptionEntity
|
|
{
|
|
public string Title { get; set; }
|
|
public int? VotesCount { get; set; }
|
|
}
|
|
|
|
public class PreviewCard
|
|
{
|
|
public string Url { get; set; }
|
|
public string Title { get; set; } = string.Empty;
|
|
public string Description { get; set; } = string.Empty;
|
|
public string Type { get; set; } = "link";
|
|
public string AuthorName { get; set; } = string.Empty;
|
|
public string AuthorUrl { get; set; } = string.Empty;
|
|
public string ProviderName { get; set; } = string.Empty;
|
|
public string ProviderUrl { get; set; } = string.Empty;
|
|
public string Html { get; set; } = string.Empty;
|
|
public int Width { get; set; }
|
|
public int Height { get; set; }
|
|
public string Image { get; set; }
|
|
public string ImageDescription { get; set; } = string.Empty;
|
|
public string EmbedUrl { get; set; } = string.Empty;
|
|
public string Blurhash { get; set; }
|
|
public string Language { get; set; }
|
|
public string PublishedAt { get; set; }
|
|
public List<object> Authors { get; set; } = new();
|
|
}
|
|
|
|
public class Status
|
|
{
|
|
public string Id { get; set; }
|
|
public string Uri { get; set; }
|
|
public string Url { get; set; }
|
|
public Account Account { get; set; }
|
|
public string InReplyToId { get; set; }
|
|
public string InReplyToAccountId { get; set; }
|
|
public Status Reblog { get; set; }
|
|
public string Content { get; set; } = string.Empty;
|
|
public string CreatedAt { get; set; }
|
|
public string EditedAt { get; set; }
|
|
public List<CustomEmojiEntity> Emojis { get; set; } = new();
|
|
public int RepliesCount { get; set; }
|
|
public int ReblogsCount { get; set; }
|
|
public int FavouritesCount { get; set; }
|
|
public bool Reblogged { get; set; }
|
|
public bool Favourited { get; set; }
|
|
public bool Muted { get; set; }
|
|
public bool Bookmarked { get; set; }
|
|
public bool Pinned { get; set; }
|
|
public bool Sensitive { get; set; }
|
|
public string SpoilerText { get; set; } = string.Empty;
|
|
public string Visibility { get; set; }
|
|
public List<MediaAttachment> MediaAttachments { get; set; } = new();
|
|
public List<StatusMention> Mentions { get; set; } = new();
|
|
public List<StatusTag> Tags { get; set; } = new();
|
|
public PreviewCard Card { get; set; }
|
|
public PollEntity Poll { get; set; }
|
|
public Application Application { get; set; }
|
|
public string Language { get; set; }
|
|
public string Text { get; set; }
|
|
public List<FilterResultEntity> Filtered { get; set; } = new();
|
|
public PrivaPubStatus Privapub { get; set; }
|
|
public List<EmojiReactionEntity> EmojiReactions { get; set; } = new();
|
|
public PleromaStatus Pleroma { get; set; }
|
|
public QuoteEntity Quote { get; set; }
|
|
public int QuotesCount { get; set; }
|
|
public QuoteApprovalEntity QuoteApproval { get; set; }
|
|
public InteractionPolicyEntity InteractionPolicy { get; set; }//GoToSocial's: who may like, reply to and boost a remote post
|
|
}
|
|
|
|
// GoToSocial's interaction_policy: "public", "followers", "following", "author", "me", or an account's URI
|
|
public class InteractionPolicyEntity
|
|
{
|
|
public InteractionRuleEntity CanFavourite { get; set; }
|
|
public InteractionRuleEntity CanReply { get; set; }
|
|
public InteractionRuleEntity CanReblog { get; set; }
|
|
}
|
|
|
|
public class InteractionRuleEntity
|
|
{
|
|
public List<string> AutomaticApproval { get; set; } = new();
|
|
public List<string> ManualApproval { get; set; } = new();
|
|
}
|
|
|
|
public class MediaAttachment
|
|
{
|
|
public string Id { get; set; }
|
|
public string Type { get; set; }
|
|
public string Url { get; set; }
|
|
public string PreviewUrl { get; set; }
|
|
public string RemoteUrl { get; set; }
|
|
public object Meta { get; set; }
|
|
public string Description { get; set; }
|
|
public string Blurhash { get; set; }
|
|
}
|
|
|
|
public class StatusMention
|
|
{
|
|
public string Id { get; set; }
|
|
public string Username { get; set; }
|
|
public string Url { get; set; }
|
|
public string Acct { get; set; }
|
|
}
|
|
|
|
public class StatusTag
|
|
{
|
|
public string Name { get; set; }
|
|
public string Url { get; set; }
|
|
}
|
|
|
|
public class Application
|
|
{
|
|
public string Id { get; set; }
|
|
public string Name { get; set; }
|
|
public string Website { get; set; }
|
|
public List<string> Scopes { get; set; } = new();
|
|
public List<string> RedirectUris { get; set; } = new();
|
|
public string RedirectUri { get; set; }
|
|
public string ClientId { get; set; }
|
|
public string ClientSecret { get; set; }
|
|
public string VapidKey { get; set; } = string.Empty;
|
|
}
|
|
|
|
public class Relationship
|
|
{
|
|
public string Id { get; set; }
|
|
public bool Following { get; set; }
|
|
public bool ShowingReblogs { get; set; }
|
|
public bool Notifying { get; set; }
|
|
public List<string> Languages { get; set; }
|
|
public bool FollowedBy { get; set; }
|
|
public bool Blocking { get; set; }
|
|
public bool BlockedBy { get; set; }
|
|
public bool Muting { get; set; }
|
|
public bool MutingNotifications { get; set; }
|
|
public bool Requested { get; set; }
|
|
public bool RequestedBy { get; set; }
|
|
public bool DomainBlocking { get; set; }
|
|
public bool Endorsed { get; set; }
|
|
public string Note { get; set; } = string.Empty;
|
|
}
|
|
|
|
public class Notification
|
|
{
|
|
public string Id { get; set; }
|
|
public string Type { get; set; }
|
|
public string CreatedAt { get; set; }
|
|
public string GroupKey { get; set; }
|
|
public Account Account { get; set; }
|
|
public Status Status { get; set; }
|
|
public string Emoji { get; set; }
|
|
public string EmojiUrl { get; set; }
|
|
}
|
|
|
|
public class Context
|
|
{
|
|
public List<Status> Ancestors { get; set; } = new();
|
|
public List<Status> Descendants { get; set; } = new();
|
|
}
|
|
|
|
public class StatusEdit
|
|
{
|
|
public string Content { get; set; }
|
|
public string SpoilerText { get; set; }
|
|
public bool Sensitive { get; set; }
|
|
public string CreatedAt { get; set; }
|
|
public Account Account { get; set; }
|
|
public List<MediaAttachment> MediaAttachments { get; set; } = new();
|
|
public List<CustomEmojiEntity> Emojis { get; set; } = new();
|
|
}
|
|
|
|
public class StatusSource
|
|
{
|
|
public string Id { get; set; }
|
|
public string Text { get; set; }
|
|
public string SpoilerText { get; set; }
|
|
}
|
|
|
|
public class SearchResults
|
|
{
|
|
public List<Account> Accounts { get; set; } = new();
|
|
public List<Status> Statuses { get; set; } = new();
|
|
public List<object> Hashtags { get; set; } = new();
|
|
}
|
|
|
|
public class Conversation
|
|
{
|
|
public string Id { get; set; }
|
|
public bool Unread { get; set; }
|
|
public List<Account> Accounts { get; set; } = new();
|
|
public Status LastStatus { get; set; }
|
|
}
|
|
|
|
public class Marker
|
|
{
|
|
public string LastReadId { get; set; }
|
|
public int Version { get; set; }
|
|
public string UpdatedAt { get; set; }
|
|
}
|
|
}
|