using MongoDB.Entities; using PrivaPub.Infrastructure.Ids; 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 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 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 PublishedOn { get; set; } = PrivacyIds.PublishedDay(DateTime.UtcNow);//the actor's published: a few days before CreatedAt, so same-day personas differ public DateTime? SilencedAt { get; set; } public DateTime? SuspendedAt { get; set; } public DateTime? BannedAt { get; set; } public DateTime? DeletionAt { get; set; } public override object GenerateNewID() => PrivacyIds.ForDay(PublishedOn); } 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 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 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 bool IsIndexable { get; set; } public bool IsLocked { get; set; }//manuallyApprovesFollowers public bool IsMemorial { get; set; } public List Emojis { get; set; } = new(); public string PictureDescription { get; set; } public string HeaderDescription { get; set; } public DateTime? Published { get; set; }//the actor's own published 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 bool IsLocked { get; set; } public bool IsBot { get; set; } public bool IsDiscoverable { get; set; } = true; public bool IsIndexable { get; set; } public bool HideCollections { get; set; } = true; public string DefaultVisibility { get; set; } = "public"; public bool DefaultSensitive { get; set; } public string DefaultLanguage { get; set; } public string QuotePolicy { get; set; } = QuotePolicies.Public;//owner decision: anyone may quote a public post, automatically } public static class QuotePolicies { public const string Public = "public"; public const string Followers = "followers"; public const string Nobody = "nobody"; public static bool IsKnown(string value) => value is Public or Followers or Nobody; } 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 } }