Files
decePubClient/Models/Mastodon/Status.cs
T
thepraandClaude Opus 5.5 9a752d9288 Filters: made on /filters, applied by each card where it is
The persona's filters (PrivaPub's /api/v2/filters): made, given words and
whole-word rules, contexts, an action and an expiry on /filters (linked from
Settings), and deleted; posts filtered one by one can be taken out. Every
status says which filters it matches; each page tells its cards where they
are (home and lists, notifications, public feeds, the thread around the
opened post, profiles), and a card leaves its post out (hide), folds it
behind the filter's title with a way to show it anyway (warn), or blurs its
media (blur). The e2e test folds and then hides a post of the persona's own.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LsXgEaXee4GCU1hwYgPJXw
2026-10-05 03:10:27 +02:00

133 lines
4.1 KiB
C#

namespace decePubClient.Models.Mastodon;
/// <summary>
/// A post as PrivaPub's Mastodon API sends it (snake_case JSON, MastodonJsonContext). PrivaPub-only details are in
/// Privapub; ids are opaque strings.
/// </summary>
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; }
public DateTime CreatedAt { get; set; }
public DateTime? EditedAt { get; set; }
public List<CustomEmoji> Emojis { get; set; } = [];
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; }
/// <summary>public, unlisted, private (followers and circles) or direct.</summary>
public string Visibility { get; set; }
public List<MediaAttachment> MediaAttachments { get; set; } = [];
public List<StatusMention> Mentions { get; set; } = [];
public List<StatusTag> Tags { get; set; } = [];
public PreviewCard Card { get; set; }
public Poll Poll { get; set; }
public StatusApplication Application { get; set; }
public string Language { get; set; }
/// <summary>The plain text source, only on the author's own deleted or edited post.</summary>
public string Text { get; set; }
public PrivaPubStatus Privapub { get; set; }
public Quote Quote { get; set; }
/// <summary>Emoji reactions (PrivaPub sends Pleroma's and Misskey's forms as one list).</summary>
public List<EmojiReaction> EmojiReactions { get; set; } = [];
/// <summary>The persona's filters this post matches, whatever their context (the card picks those of where it is).</summary>
public List<FilterResult> Filtered { get; set; } = [];
public int QuotesCount { 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 StatusApplication
{
public string Name { get; set; }
public string Website { get; set; }
}
public class Quote
{
public string State { get; set; }
public Status QuotedStatus { get; set; }
public string QuotedStatusId { get; set; }
}
public class StatusContext
{
public List<Status> Ancestors { get; set; } = [];
public List<Status> Descendants { get; set; } = [];
}
public class Poll
{
public string Id { get; set; }
public DateTime? 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; }
/// <summary>The options the current persona chose (indexes).</summary>
public List<int> OwnVotes { get; set; } = [];
public List<PollOption> Options { get; set; } = [];
}
public class EmojiReaction
{
/// <summary>The emoji itself, or a custom emoji's shortcode.</summary>
public string Name { get; set; }
public int Count { get; set; }
/// <summary>Whether the current persona reacted with it.</summary>
public bool Me { get; set; }
/// <summary>A custom emoji's image, through PrivaPub's proxy.</summary>
public string Url { get; set; }
}
/// <summary>POST /api/v1/polls/{id}/votes.</summary>
public class PollVoteForm
{
public List<int> Choices { get; set; } = [];
}
public class PollOption
{
public string Title { get; set; }
public int? VotesCount { get; set; }
}
public class PreviewCard
{
public string Url { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Type { get; set; }
public string ProviderName { get; set; }
public string Image { get; set; }
public string ImageDescription { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public string Blurhash { get; set; }
}