Post gains what federation and the Mastodon API need: Visibility (Public, Unlisted, FollowersOnly, Direct, Circle, LocalGeo), the author's account id, to/cc, the Create's id, url, context, quote, InReplyToURI and the parent's author, a separate SpoilerText next to the title, language, mentions, hashtags, remote attachments (alt text, blurhash, focus, size), reply/favourite/reblog counters, revisions, EditedAt and DeletedAt. Direct messages are Posts with Visibility Direct and a ConversationId; migration _005 copies DmPost rows across with their ids and fills the new fields of existing posts. DmPost is left in place so a rollback still sees the old messages. Inbound: - NoteParser reads Note, Article, Page, Question and media types: content, then contentMap, then _misskey_content; summary as the spoiler and name as the title; Mention and Hashtag tags; attachments; a PeerTube-style list attribution prefers the person over the channel; quote URIs. - Addressing classifies like Mastodon, finding followers-only by the author's own followers URL (now stored on ForeignAvatar), not by a "/followers" suffix. - Create keeps a post when a local persona is addressed or mentioned, when it replies to a local post (the parent's reply count goes up) or when a community it follows is addressed; an unsolicited public post is not stored. Update keeps the previous version as a revision. The outbox and object endpoints serve only Public and Unlisted posts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012CzABvBkbcFqoHdmi8b9WB
122 lines
3.8 KiB
C#
122 lines
3.8 KiB
C#
using MongoDB.Entities;
|
|
|
|
namespace PrivaPub.Models.User
|
|
{
|
|
public class Avatar : Entity
|
|
{
|
|
public string Url { get; set; }//url
|
|
public string Name { get; set; }//name
|
|
public string UserName { get; set; }//preferredUsername
|
|
public string Biography { get; set; }//summary
|
|
|
|
public Dictionary<string, string> SharedPersonalContacts { get; set; } = new();
|
|
public string PrivateKey { get; set; }
|
|
public string PublicKey { get; set; }
|
|
public AvatarAccountState AccountState { get; set; } = AvatarAccountState.Normal;
|
|
public AvatarSettings Settings { get; set; } = new();
|
|
public Dictionary<string, string> Fields { get; set; } = new();
|
|
|
|
public string Domain { get; set; }
|
|
public string PersonalNote { get; set; }
|
|
public string ModerationNote { get; set; }
|
|
|
|
public string InboxURL { get; set; }
|
|
public string OutboxURL { get; set; }
|
|
public string MovedToURL { get; set; }
|
|
public string PictureURL { get; set; }//icon
|
|
public string ThumbnailURL { get; set; }//image
|
|
public AvatarType AvatarType { get; set; } = AvatarType.Person;
|
|
public AvatarServer AvatarServer { get; set; } = AvatarServer.PrivaPub;
|
|
|
|
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
|
|
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
|
|
public DateTime? SilencedAt { get; set; }
|
|
public DateTime? SuspendedAt { get; set; }
|
|
public DateTime? BannedAt { get; set; }
|
|
public DateTime? DeletionAt { get; set; }
|
|
}
|
|
|
|
public class ForeignAvatar : Entity
|
|
{
|
|
public string Url { get; set; }//url
|
|
public string Name { get; set; }//name
|
|
public string UserName { get; set; }//preferredUsername
|
|
public string Biography { get; set; }//summary
|
|
|
|
public Dictionary<string, string> SharedPersonalContacts { get; set; } = new();
|
|
public string PrivateKey { get; set; }
|
|
public string PublicKey { get; set; }
|
|
public AvatarAccountState AccountState { get; set; } = AvatarAccountState.Normal;
|
|
public AvatarSettings Settings { get; set; } = new();
|
|
public Dictionary<string, string> Fields { get; set; } = new();
|
|
|
|
public string Domain { get; set; }
|
|
public string PersonalNote { get; set; }
|
|
public string ModerationNote { get; set; }
|
|
public bool IsDiscoverable { get; set; } = true;
|
|
|
|
public string ActorURI { get; set; }//id
|
|
public string PublicKeyId { get; set; }
|
|
public string FollowersURL { get; set; }
|
|
public string FollowingURL { get; set; }
|
|
public string SharedInboxURL { get; set; }
|
|
public string InboxURL { get; set; }
|
|
public string OutboxURL { get; set; }
|
|
public string MovedToURL { get; set; }
|
|
public string PictureURL { get; set; }//icon
|
|
public string ThumbnailURL { get; set; }//image
|
|
public AvatarType AvatarType { get; set; } = AvatarType.Person;
|
|
public AvatarServer AvatarServer { get; set; } = AvatarServer.Unknown;
|
|
|
|
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
|
|
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
|
|
public DateTime? SilencedAt { get; set; }
|
|
public DateTime? SuspendedAt { get; set; }
|
|
public DateTime? BannedAt { get; set; }
|
|
public DateTime? DeletionAt { get; set; }
|
|
}
|
|
|
|
public class AvatarSettings
|
|
{
|
|
public string LanguageCode { get; set; } = "en-GB";
|
|
|
|
public bool IsDefault { get; set; } = true;
|
|
|
|
public short IconsThemeIndexColour { get; set; } = 25;
|
|
public short LightThemeIndexColour { get; set; } = 25;
|
|
public short DarkThemeIndexColour { get; set; } = 215;
|
|
public bool PreferSystemTheming { get; set; } = true;
|
|
public bool ThemeIsDarkMode { get; set; } = false;
|
|
public bool ThemeIsDarkGray { get; set; } = false;
|
|
public bool ThemeIsLightGray { get; set; } = true;
|
|
}
|
|
|
|
public enum AvatarServer
|
|
{
|
|
Unknown,
|
|
Pleroma,
|
|
Mastodon,
|
|
Akkoma,
|
|
Misskey,
|
|
PrivaPub
|
|
}
|
|
|
|
public enum AvatarType
|
|
{
|
|
Application,
|
|
Group,
|
|
Organization,
|
|
Person,
|
|
Service
|
|
}
|
|
|
|
public enum AvatarAccountState
|
|
{
|
|
Normal,
|
|
Silenced,
|
|
Suspended,
|
|
Banned,
|
|
Deleted
|
|
}
|
|
}
|