2026-10-01 08:05:56 +02:00
using MongoDB.Entities ;
2023-02-18 08:52:17 +01:00
2026-10-01 11:25:48 +02:00
using PrivaPub.Infrastructure.Ids ;
2023-02-19 00:43:43 +01:00
namespace PrivaPub.Models.User
2023-02-18 08:52:17 +01:00
{
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 ; }
2026-10-06 09:01:21 +02:00
public string SigningKey { get ; set ; } //the seed of its Ed25519 key (FEP-521a), which signs its activities' proofs (FEP-8b32)
2023-02-18 08:52:17 +01:00
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 ; }
2023-02-19 00:43:43 +01:00
public string PersonalNote { get ; set ; }
public string ModerationNote { get ; set ; }
2023-02-18 08:52:17 +01:00
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 ;
2023-02-19 00:43:43 +01:00
public AvatarServer AvatarServer { get ; set ; } = AvatarServer . PrivaPub ;
2023-02-18 08:52:17 +01:00
public DateTime UpdatedAt { get ; set ; } = DateTime . UtcNow ;
public DateTime CreatedAt { get ; set ; } = DateTime . UtcNow ;
2026-10-01 17:39:58 +02:00
public DateTime PublishedOn { get ; set ; } = PrivacyIds . PublishedDay ( DateTime . UtcNow ); //the actor's published: a few days before CreatedAt, so same-day personas differ
2023-02-18 08:52:17 +01:00
public DateTime ? SilencedAt { get ; set ; }
public DateTime ? SuspendedAt { get ; set ; }
public DateTime ? BannedAt { get ; set ; }
public DateTime ? DeletionAt { get ; set ; }
2026-10-01 11:25:48 +02:00
2026-10-01 17:39:58 +02:00
public override object GenerateNewID () => PrivacyIds . ForDay ( PublishedOn );
2023-02-18 08:52:17 +01:00
}
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 ; }
2023-02-19 00:43:43 +01:00
public AvatarAccountState AccountState { get ; set ; } = AvatarAccountState . Normal ;
2023-02-18 08:52:17 +01:00
public AvatarSettings Settings { get ; set ; } = new ();
public Dictionary < string , string > Fields { get ; set ; } = new ();
public string Domain { get ; set ; }
2023-02-19 00:43:43 +01:00
public string PersonalNote { get ; set ; }
public string ModerationNote { get ; set ; }
2023-02-18 08:52:17 +01:00
public bool IsDiscoverable { get ; set ; } = true ;
2026-10-01 18:35:20 +02:00
public bool IsIndexable { get ; set ; }
public bool IsLocked { get ; set ; } //manuallyApprovesFollowers
public bool IsMemorial { get ; set ; }
public List < PrivaPub . Models . Post . CustomEmoji > Emojis { get ; set ; } = new ();
public string PictureDescription { get ; set ; }
public string HeaderDescription { get ; set ; }
public DateTime ? Published { get ; set ; } //the actor's own published
2026-10-03 11:15:21 +02:00
public List < string > Features { get ; set ; } //protocol extensions its document uses, for statistics (ActorFeatures)
2023-02-18 08:52:17 +01:00
2026-10-01 08:05:56 +02:00
public string ActorURI { get ; set ; } //id
public string PublicKeyId { get ; set ; }
2026-10-01 11:17:14 +02:00
public string FollowersURL { get ; set ; }
public string FollowingURL { get ; set ; }
2026-10-01 08:05:56 +02:00
public string SharedInboxURL { get ; set ; }
2023-02-18 08:52:17 +01:00
public string InboxURL { get ; set ; }
public string OutboxURL { get ; set ; }
2026-10-05 22:48:57 +02:00
public string FeaturedURL { get ; set ; } //featured: the posts it pins
2026-10-07 21:14:32 +02:00
public List < PrivaPub . Models . Post . PostFlair > Flairs { get ; set ; } = new (); //a community's labels for its posts
2026-10-07 21:17:36 +02:00
public List < string > SearchableBy { get ; set ; } //FEP-268d, when the account states it: outranks IsIndexable
2026-10-07 21:10:58 +02:00
public string ModeratorsURL { get ; set ; } //a community's attributedTo (Lemmy, PieFed, Mbin): the collection of its moderators
2026-10-06 09:01:21 +02:00
public List < AssertionKey > AssertionKeys { get ; set ; } = new (); //its Ed25519 keys (FEP-521a), which prove what it sends (FEP-8b32)
2026-10-06 08:17:10 +02:00
public string WallURL { get ; set ; } //sm:wall (FEP-400e): where others write to it, Smithereen's walls
2023-02-18 08:52:17 +01:00
public string MovedToURL { get ; set ; }
2026-10-05 18:39:46 +02:00
public List < string > AlsoKnownAs { get ; set ; } = new (); //alsoKnownAs: the accounts it says it also is
2023-02-18 08:52:17 +01:00
public string PictureURL { get ; set ; } //icon
public string ThumbnailURL { get ; set ; } //image
public AvatarType AvatarType { get ; set ; } = AvatarType . Person ;
2023-02-19 00:43:43 +01:00
public AvatarServer AvatarServer { get ; set ; } = AvatarServer . Unknown ;
2023-02-18 08:52:17 +01:00
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 ; }
2026-10-04 03:48:32 +02:00
public DateTime ? ForgottenAt { get ; set ; } //its likes, votes, boosts and replies were taken out of our counts (GoneActors)
2026-10-04 03:56:18 +02:00
public int? FollowersCount { get ; set ; } //its own collections' totalItems, read at most daily (AccountCountsJob)
public int? FollowingCount { get ; set ; }
public int? StatusesCount { get ; set ; }
public DateTime ? CountedAt { get ; set ; }
2023-02-18 08:52:17 +01:00
}
public class AvatarSettings
{
public string LanguageCode { get ; set ; } = "en-GB" ;
2023-02-19 00:43:43 +01:00
public bool IsDefault { get ; set ; } = true ;
2023-02-18 08:52:17 +01:00
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 ;
2026-10-01 12:05:58 +02:00
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 ; }
2026-10-01 19:53:13 +02:00
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 ;
2023-02-18 08:52:17 +01:00
}
2023-02-19 00:43:43 +01:00
public enum AvatarServer
{
Unknown ,
Pleroma ,
Mastodon ,
Akkoma ,
Misskey ,
PrivaPub
}
2023-02-18 08:52:17 +01:00
public enum AvatarType
{
Application ,
Group ,
Organization ,
Person ,
Service
}
public enum AvatarAccountState
{
Normal ,
Silenced ,
Suspended ,
Banned ,
Deleted
}
2026-10-06 09:01:21 +02:00
public class AssertionKey
{
public string Id { get ; set ; }
public string PublicKey { get ; set ; } //the raw Ed25519 key, base64
}
2023-02-18 08:52:17 +01:00
}