Files
decePubClient/Models/Mastodon/InstanceV2.cs
T
thepraandClaude Opus 5.5 d33697e3fc R8 the Mastodon API made real in decePub: featured tags, notify, languages, recommendations, notes, suggestions, the direct stream
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
2026-10-18 08:58:30 +02:00

90 lines
3.0 KiB
C#

namespace decePubClient.Models.Mastodon;
/// <summary>/api/v2/instance, the part the client reads: what the server calls itself and says of itself, its contact,
/// its rules, and what an upload may be.</summary>
public class InstanceV2
{
public string Domain { get; set; }
public string Title { get; set; }
/// <summary>The short description, as plain text.</summary>
public string Description { get; set; }
public InstanceThumbnail Thumbnail { get; set; } = new();
public InstanceContact Contact { get; set; } = new();
public List<InstanceRule> Rules { get; set; } = [];
public InstanceConfiguration Configuration { get; set; } = new();
}
public class InstanceThumbnail
{
public string Url { get; set; }
}
/// <summary>Who answers for the server: an address, and the persona its administrator named (null when none).</summary>
public class InstanceContact
{
public string Email { get; set; }
public Account Account { get; set; }
}
/// <summary>One of the server's rules (/api/v1/instance/rules and the instance's own), in their order.</summary>
public class InstanceRule
{
public string Id { get; set; }
public string Text { get; set; }
public string Hint { get; set; }
}
public class InstanceConfiguration
{
public MediaConfiguration MediaAttachments { get; set; } = new();
public AccountsConfiguration Accounts { get; set; } = new();
}
/// <summary>What an account may hold: how many hashtags it features on its profile (PrivaPub's 10).</summary>
public class AccountsConfiguration
{
public int MaxFeaturedTags { get; set; }
}
/// <summary>The types an upload may have and how big it may be, as the server enforces them.</summary>
public class MediaConfiguration
{
public List<string> SupportedMimeTypes { get; set; } = [];
public long ImageSizeLimit { get; set; }
public long VideoSizeLimit { get; set; }
public long ImageMatrixLimit { get; set; }
public long VideoMatrixLimit { get; set; }
public int VideoFrameRateLimit { get; set; }
}
/// <summary>/api/v1/instance/extended_description and /privacy_policy: the server's text as sanitized HTML, and when it
/// last changed.</summary>
public class InstanceDocument
{
public DateTime? UpdatedAt { get; set; }
public string Content { get; set; }
}
/// <summary>/api/v1/instance/terms_of_service (Mastodon 4.4): the one version PrivaPub keeps; none while it has none
/// (404).</summary>
public class TermsOfService
{
/// <summary>yyyy-MM-dd.</summary>
public string EffectiveDate { get; set; }
/// <summary>Whether they apply already (false while their date is ahead).</summary>
public bool Effective { get; set; }
public string Content { get; set; }
public string SucceededBy { get; set; }
}
/// <summary>/api/v1/instance/domain_blocks: a block the administrator published; its domain partly starred when it is
/// obfuscated, its digest the SHA-256 of the whole name.</summary>
public class PublicDomainBlock
{
public string Domain { get; set; }
public string Digest { get; set; }
/// <summary>suspend, silence or noop.</summary>
public string Severity { get; set; }
public string Comment { get; set; }
}