A profile shows the hashtags an account features as chips opening their feed; under another account's header is what the persona keeps of it for itself alone: for one it follows, a bell (follow with notify), the languages of its posts that reach the home feed (follow with languages[]) and Recommend (endorsements, private here), and for any account a private note saved on blur or with Save. Settings edits the persona's featured hashtags (added by name or from those used lately, 10 at most) and its reading preferences (/clientapi/avatar/private/preferences), which CascadingState keeps per persona and the card applies to sensitive media and content warnings. A hashtag's tab features it on the profile. Explore has Who to follow (/api/v2/suggestions, dismissed for good after asking); Administration has Staff picks. The Direct tab follows the direct stream's conversation events; status notifications show the post. The follows CSV carries notify and languages. Verified: Release build, 0 errors (the 3 warnings were there before). Not run against PrivaPub or in the pasture. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WpVCoDeM1qUTRp4fXQdfof
122 lines
5.3 KiB
C#
122 lines
5.3 KiB
C#
namespace decePubClient.Models.Mastodon;
|
|
|
|
/// <summary>A persona, a remote account or a community, as PrivaPub's Mastodon API sends it.</summary>
|
|
public class Account
|
|
{
|
|
public string Id { get; set; }
|
|
public string Username { get; set; }
|
|
/// <summary>username for a local account, username@host for a remote one.</summary>
|
|
public string Acct { get; set; }
|
|
public string DisplayName { get; set; }
|
|
public bool Locked { get; set; }
|
|
public bool Bot { get; set; }
|
|
public bool Group { get; set; }
|
|
public DateTime? 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 List<CustomEmoji> Emojis { get; set; } = [];
|
|
public List<AccountField> Fields { get; set; } = [];
|
|
/// <summary>The account it moved to (PrivaPub shows it once the new account names this one among its aliases).</summary>
|
|
public Account Moved { get; set; }
|
|
/// <summary>Whether it is listed in the directory and suggested; null when its server does not say.</summary>
|
|
public bool? Discoverable { get; set; }
|
|
/// <summary>Whether its public posts may be found by full-text search.</summary>
|
|
public bool? Indexable { get; set; }
|
|
/// <summary>Silenced by this server's staff, or its server is (Mastodon's `limited`): kept out of public timelines,
|
|
/// trends and search, still read by its followers and by whoever opens it. Null otherwise.</summary>
|
|
public bool? Limited { get; set; }
|
|
/// <summary>The persona's own account only (verify_credentials, update_credentials): its profile as written and its
|
|
/// posting defaults.</summary>
|
|
public AccountSource Source { get; set; }
|
|
|
|
/// <summary>The account's server: the host of its ActivityPub id.</summary>
|
|
public string Host => System.Uri.TryCreate(Uri, UriKind.Absolute, out var uri) ? uri.Host.ToLowerInvariant() : default;
|
|
|
|
/// <summary>The name to show: the display name, or the username when there is none.</summary>
|
|
public string Name => string.IsNullOrWhiteSpace(DisplayName) ? Username : DisplayName;
|
|
}
|
|
|
|
public class AccountSource
|
|
{
|
|
/// <summary>The biography as written, before PrivaPub renders it.</summary>
|
|
public string Note { get; set; }
|
|
public List<AccountField> Fields { get; set; } = [];
|
|
/// <summary>The default visibility of a new post: public, unlisted or private.</summary>
|
|
public string Privacy { get; set; }
|
|
public bool Sensitive { get; set; }
|
|
public string Language { get; set; }
|
|
/// <summary>Who may quote the persona's posts: public, followers or nobody.</summary>
|
|
public string QuotePolicy { get; set; }
|
|
public int FollowRequestsCount { get; set; }
|
|
}
|
|
|
|
/// <summary>A page of accounts (mutes, blocks), and the cursor of the next one: null at the end.</summary>
|
|
public class AccountPage
|
|
{
|
|
public List<Account> Accounts { get; set; } = [];
|
|
public string MaxId { get; set; }
|
|
}
|
|
|
|
public class AccountField
|
|
{
|
|
public string Name { get; set; }
|
|
public string Value { get; set; }
|
|
public DateTime? VerifiedAt { get; set; }
|
|
}
|
|
|
|
/// <summary>A custom emoji: one a post or an account names (its server's), or one of this server's own as
|
|
/// /api/v1/custom_emojis lists them for the picker, with its category.</summary>
|
|
public class CustomEmoji
|
|
{
|
|
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 Relationship
|
|
{
|
|
public string Id { get; set; }
|
|
public bool Following { 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 ShowingReblogs { get; set; }
|
|
/// <summary>The persona is told of each of the account's new posts (a `status` notification): the follow's notify.</summary>
|
|
public bool Notifying { get; set; }
|
|
/// <summary>The languages of its posts that reach the persona's home feed (primary subtags, as PrivaPub keeps them).
|
|
/// PrivaPub sends null for every language, which the client reads as an empty list does.</summary>
|
|
public List<string> Languages { get; set; } = [];
|
|
public bool Requested { get; set; }
|
|
public bool RequestedBy { get; set; }
|
|
public bool DomainBlocking { get; set; }
|
|
/// <summary>In the persona's recommendations (Mastodon's endorsements): private here, listed to the persona alone and
|
|
/// never federated; only while it follows the account.</summary>
|
|
public bool Endorsed { get; set; }
|
|
/// <summary>The persona's own private note on the account (never its login's, never federated); empty for none.</summary>
|
|
public string Note { get; set; }
|
|
|
|
/// <summary>The languages chosen, none meaning every language.</summary>
|
|
public IReadOnlyList<string> WantedLanguages => Languages ?? [];
|
|
}
|
|
|
|
/// <summary>/api/v2/search: what matched, a remote handle or URL resolved by PrivaPub.</summary>
|
|
public class SearchResults
|
|
{
|
|
public List<Account> Accounts { get; set; } = [];
|
|
public List<Status> Statuses { get; set; } = [];
|
|
public List<StatusTag> Hashtags { get; set; } = [];
|
|
}
|