using System.Text.Json; using System.Text.Json.Serialization; namespace WindowsGotify.Models; public sealed class GotifyMessage { [JsonPropertyName("id")] public long Id { get; set; } [JsonPropertyName("appid")] public long AppId { get; set; } [JsonPropertyName("message")] public string Message { get; set; } = ""; [JsonPropertyName("title")] public string? Title { get; set; } [JsonPropertyName("priority")] public int Priority { get; set; } [JsonPropertyName("date")] public DateTimeOffset Date { get; set; } [JsonPropertyName("extras")] public Dictionary? Extras { get; set; } [JsonIgnore] public string TitleDisplay => string.IsNullOrWhiteSpace(Title) ? $"(App {AppId})" : Title!; [JsonIgnore] public string DateDisplay => Date.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"); [JsonIgnore] public string PriorityDisplay => $"P{Priority}"; /// /// 提取 Gotify extras 中的 client::notification.click.url(用于点击跳转)。 /// [JsonIgnore] public string? ClickUrl { get { if (Extras is null) return null; try { if (!Extras.TryGetValue("client::notification", out var notif)) return null; if (notif.ValueKind != JsonValueKind.Object) return null; if (!notif.TryGetProperty("click", out var click)) return null; if (click.ValueKind != JsonValueKind.Object) return null; if (!click.TryGetProperty("url", out var url)) return null; if (url.ValueKind != JsonValueKind.String) return null; return url.GetString(); } catch { return null; } } } } public sealed class GotifyMessagePage { [JsonPropertyName("messages")] public List Messages { get; set; } = new(); [JsonPropertyName("paging")] public PagingInfo? Paging { get; set; } } public sealed class PagingInfo { [JsonPropertyName("size")] public int Size { get; set; } [JsonPropertyName("limit")] public int Limit { get; set; } [JsonPropertyName("next")] public string? Next { get; set; } }