Iceshrimp.NET/Iceshrimp.Backend/Controllers/Mastodon/Schemas/Entities/Status.cs
Laura Hausmann 67d1d776c8
[backend/federation] Basic mentions handling (ISH-38)
This implementation adds handling of incoming mentions, including rewriting non-canonical mentions of split domain users into their canonical form when inserting notes into the database.
2024-02-11 18:50:28 +01:00

77 lines
No EOL
3.9 KiB
C#

using System.Text.Json.Serialization;
using Iceshrimp.Backend.Core.Database;
using Iceshrimp.Backend.Core.Database.Tables;
using Iceshrimp.Backend.Core.Middleware;
using J = System.Text.Json.Serialization.JsonPropertyNameAttribute;
using JI = System.Text.Json.Serialization.JsonIgnoreAttribute;
namespace Iceshrimp.Backend.Controllers.Mastodon.Schemas.Entities;
public class Status : IEntity {
[J("text")] [JI(Condition = JsonIgnoreCondition.WhenWritingNull)]
public required string? Text;
[J("uri")] public required string Uri { get; set; }
[J("url")] public required string Url { get; set; }
[J("account")] public required Account Account { get; set; }
[J("in_reply_to_id")] public required string? ReplyId { get; set; }
[J("in_reply_to_account_id")] public required string? ReplyUserId { get; set; }
[J("reblog")] public required Status? Renote { get; set; }
[J("quote")] public required Status? Quote { get; set; }
[J("content_type")] public required string ContentType { get; set; }
[J("created_at")] public required string CreatedAt { get; set; }
[J("edited_at")] public required string? EditedAt { get; set; }
[J("replies_count")] public required long RepliesCount { get; set; }
[J("reblogs_count")] public required long RenoteCount { get; set; }
[J("favourites_count")] public required long FavoriteCount { get; set; }
[J("reblogged")] public required bool? IsRenoted { get; set; }
[J("favourited")] public required bool? IsFavorited { get; set; }
[J("bookmarked")] public required bool? IsBookmarked { get; set; }
[J("muted")] public required bool? IsMuted { get; set; }
[J("sensitive")] public required bool IsSensitive { get; set; }
[J("spoiler_text")] public required string ContentWarning { get; set; }
[J("visibility")] public required string Visibility { get; set; }
[J("content")]
[JI(Condition = JsonIgnoreCondition.WhenWritingNull)]
public required string? Content { get; set; }
[J("pinned")]
[JI(Condition = JsonIgnoreCondition.WhenWritingNull)]
public required bool? IsPinned { get; set; }
[J("mentions")] public required List<Mention> Mentions { get; set; }
[J("emojis")] public object[] Emojis => []; //FIXME
[J("media_attachments")] public object[] Media => []; //FIXME
[J("tags")] public object[] Tags => []; //FIXME
[J("reactions")] public object[] Reactions => []; //FIXME
[J("filtered")] public object[] Filtered => []; //FIXME
[J("card")] public object? Card => null; //FIXME
[J("poll")] public object? Poll => null; //FIXME
[J("application")] public object? Application => null; //FIXME
[J("language")] public string? Language => null; //FIXME
[J("id")] public required string Id { get; set; }
public static string EncodeVisibility(Note.NoteVisibility visibility) {
return visibility switch {
Note.NoteVisibility.Public => "public",
Note.NoteVisibility.Home => "unlisted",
Note.NoteVisibility.Followers => "private",
Note.NoteVisibility.Specified => "direct",
_ => throw new GracefulException($"Unknown visibility: {visibility}")
};
}
public static Note.NoteVisibility DecodeVisibility(string visibility) {
return visibility switch {
"public" => Note.NoteVisibility.Public,
"unlisted" => Note.NoteVisibility.Home,
"private" => Note.NoteVisibility.Followers,
"direct" => Note.NoteVisibility.Specified,
_ => throw GracefulException.BadRequest($"Unknown visibility: {visibility}")
};
}
}