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 ; }
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 ; }
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 . 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
}
}