// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. #nullable disable using System; using System.Collections.Generic; using Newtonsoft.Json; using osu.Game.Online.API.Requests.Responses; namespace osu.Game.Online.Chat { public class Message : IComparable, IEquatable { [JsonProperty(@"message_id")] public readonly long? Id; [JsonProperty(@"channel_id")] public long ChannelId; [JsonProperty(@"is_action")] public bool IsAction; [JsonProperty(@"timestamp")] public DateTimeOffset Timestamp; [JsonProperty(@"content")] public string Content; [JsonProperty(@"sender")] public APIUser Sender; [JsonProperty(@"sender_id")] public int SenderId { get => Sender?.Id ?? 0; set => Sender = new APIUser { Id = value }; } /// /// A unique identifier for this message. Sent to and from osu!web to use for deduplication. /// [JsonProperty(@"uuid")] public string Uuid { get; set; } = string.Empty; [JsonConstructor] public Message() { } /// /// The text that is displayed in chat. /// public string DisplayContent { get; set; } /// /// The links found in this message. /// /// The s' and s are according to public List Links; public Message(long? id) { Id = id; } public int CompareTo(Message other) { if (!Id.HasValue) return other.Id.HasValue ? 1 : Timestamp.CompareTo(other.Timestamp); if (!other.Id.HasValue) return -1; return Id.Value.CompareTo(other.Id.Value); } public virtual bool Equals(Message other) { if (ReferenceEquals(null, other)) return false; if (ReferenceEquals(this, other)) return true; return Id.HasValue && Id == other.Id; } // ReSharper disable once ImpureMethodCallOnReadonlyValueField public override int GetHashCode() => Id.GetHashCode(); public override string ToString() => $"({(Id?.ToString() ?? "null")}) {Timestamp} {Sender}: {Content}"; } }