diff --git a/Mirai-CSharp.HttpApi/Builder/ForwardMessageBuilder.cs b/Mirai-CSharp.HttpApi/Builder/ForwardMessageBuilder.cs index 21257b4..413e033 100644 --- a/Mirai-CSharp.HttpApi/Builder/ForwardMessageBuilder.cs +++ b/Mirai-CSharp.HttpApi/Builder/ForwardMessageBuilder.cs @@ -78,6 +78,12 @@ public override ISharedForwardMessageBuilder AddNode(string name, long qqNumber, _nodes.Add(new ForwardMessageNode(name, qqNumber, time, converted)); return this; } + + public override ISharedForwardMessageBuilder AddNode(int messageId, long target) + { + _nodes.Add(new ForwardMessageNode(new ForwardMessageNodeReference(messageId, target))); + return this; + } } public class ImmutableForwardMessageBuilder : ForwardMessageBuilder diff --git a/Mirai-CSharp.HttpApi/Models/ChatMessages/ForwardMessage.cs b/Mirai-CSharp.HttpApi/Models/ChatMessages/ForwardMessage.cs index f224774..ee0772a 100644 --- a/Mirai-CSharp.HttpApi/Models/ChatMessages/ForwardMessage.cs +++ b/Mirai-CSharp.HttpApi/Models/ChatMessages/ForwardMessage.cs @@ -4,10 +4,13 @@ using Mirai.CSharp.HttpApi.Parsers.Attributes; using Mirai.CSharp.HttpApi.Utility.JsonConverters; using ISharedForwardMessage = Mirai.CSharp.Models.ChatMessages.IForwardMessage; +using ISharedForwardMessageDisplay = Mirai.CSharp.Models.ChatMessages.IForwardMessageDisplay; using ISharedForwardMessageNode = Mirai.CSharp.Models.ChatMessages.IForwardMessageNode; +#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. namespace Mirai.CSharp.HttpApi.Models.ChatMessages { + [MappableMiraiChatMessageKey("Forward")] [ResolveJsonConverter(typeof(ChatMessageJsonConverter))] public interface IForwardMessage : ISharedForwardMessage, IChatMessage @@ -16,10 +19,18 @@ public interface IForwardMessage : ISharedForwardMessage, IChatMessage [JsonConverter(typeof(ChangeTypeJsonConverter))] new IForwardMessageNode[] Nodes { get; } + [JsonPropertyName("display")] + [JsonConverter(typeof(ChangeTypeJsonConverter))] + new IForwardMessageDisplay? Display { get; } + #if !NETSTANDARD2_0 [JsonConverter(typeof(ChangeTypeJsonConverter))] [JsonPropertyName("nodeList")] ISharedForwardMessageNode[] ISharedForwardMessage.Nodes => Nodes; + + [JsonPropertyName("display")] + [JsonConverter(typeof(ChangeTypeJsonConverter))] + ISharedForwardMessageDisplay? ISharedForwardMessage.Display => Display; #endif } @@ -38,10 +49,17 @@ public class ForwardMessage : ChatMessage, IForwardMessage /// [JsonConverter(typeof(ChangeTypeJsonConverter))] [JsonPropertyName("nodeList")] - public IForwardMessageNode[] Nodes { get; set; } = null!; + public IForwardMessageNode[] Nodes { get; set; } + + /// + /// 转发消息展示行为 + /// + [JsonPropertyName("display")] + [JsonConverter(typeof(ChangeTypeJsonConverter))] + public IForwardMessageDisplay? Display { get; set; } /// - [Obsolete("请使用 ForwardMessage(IForwardMessageNode[]) 初始化本类实例。")] + [Obsolete("请使用 ForwardMessage(IForwardMessageNode[]), ForwardMessage(IForwardMessageNode[], IForwardMessageDisplay?) 初始化本类实例。")] public ForwardMessage() { @@ -56,10 +74,25 @@ public ForwardMessage(IForwardMessageNode[] nodes) Nodes = nodes; } + /// + /// 初始化 类的新实例 + /// + /// 转发的消息数组 + /// 转发消息的展示行为 + public ForwardMessage(IForwardMessageNode[] nodes, IForwardMessageDisplay? display) + { + Nodes = nodes; + Display = display; + } + #if NETSTANDARD2_0 [JsonConverter(typeof(ChangeTypeJsonConverter))] [JsonPropertyName("nodeList")] ISharedForwardMessageNode[] ISharedForwardMessage.Nodes => Nodes; + + [JsonPropertyName("display")] + [JsonConverter(typeof(ChangeTypeJsonConverter))] + ISharedForwardMessageDisplay? ISharedForwardMessage.Display => Display; #endif } } diff --git a/Mirai-CSharp.HttpApi/Models/ChatMessages/ForwardMessageDisplay.cs b/Mirai-CSharp.HttpApi/Models/ChatMessages/ForwardMessageDisplay.cs new file mode 100644 index 0000000..eb3749e --- /dev/null +++ b/Mirai-CSharp.HttpApi/Models/ChatMessages/ForwardMessageDisplay.cs @@ -0,0 +1,90 @@ +using System.Text.Json.Serialization; +using ISharedForwardMessageDisplay = Mirai.CSharp.Models.ChatMessages.IForwardMessageDisplay; + +#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. +namespace Mirai.CSharp.HttpApi.Models.ChatMessages +{ + public interface IForwardMessageDisplay : ISharedForwardMessageDisplay + { +#if !NETSTANDARD2_0 + [JsonPropertyName("title")] + abstract string ISharedForwardMessageDisplay.Title { get; } + + [JsonPropertyName("brief")] + abstract string ISharedForwardMessageDisplay.Brief { get; } + + [JsonPropertyName("source")] + abstract string ISharedForwardMessageDisplay.Source { get; } + + [JsonPropertyName("preview")] + abstract string[] ISharedForwardMessageDisplay.Preview { get; } + + [JsonPropertyName("summary")] + abstract string ISharedForwardMessageDisplay.Summary { get; } +#else + [JsonPropertyName("title")] + new string Title { get; } + + [JsonPropertyName("brief")] + new string Brief { get; } + + [JsonPropertyName("source")] + new string Source { get; } + + [JsonPropertyName("preview")] + new string[] Preview { get; } + + [JsonPropertyName("summary")] + new string Summary { get; } +#endif + } + + public class ForwardMessageDisplay : IForwardMessageDisplay + { + [JsonPropertyName("title")] + public string Title { get; set; } + + [JsonPropertyName("brief")] + public string Brief { get; set; } + + [JsonPropertyName("source")] + public string Source { get; set; } + + [JsonPropertyName("preview")] + public string[] Preview { get; set; } + + [JsonPropertyName("summary")] + public string Summary { get; set; } + + public ForwardMessageDisplay() + { + + } + + public ForwardMessageDisplay(string title, string brief, string source, string[] preview, string summary) + { + Title = title; + Brief = brief; + Source = source; + Preview = preview; + Summary = summary; + } + +#if NETSTANDARD2_0 + [JsonPropertyName("title")] + string ISharedForwardMessageDisplay.Title => Title; + + [JsonPropertyName("brief")] + string ISharedForwardMessageDisplay.Brief => Brief; + + [JsonPropertyName("source")] + string ISharedForwardMessageDisplay.Source => Source; + + [JsonPropertyName("preview")] + string[] ISharedForwardMessageDisplay.Preview => Preview; + + [JsonPropertyName("summary")] + string ISharedForwardMessageDisplay.Summary => Summary; +#endif + } +} diff --git a/Mirai-CSharp.HttpApi/Models/ChatMessages/ForwardMessageNode.cs b/Mirai-CSharp.HttpApi/Models/ChatMessages/ForwardMessageNode.cs index c07fced..f95bbd7 100644 --- a/Mirai-CSharp.HttpApi/Models/ChatMessages/ForwardMessageNode.cs +++ b/Mirai-CSharp.HttpApi/Models/ChatMessages/ForwardMessageNode.cs @@ -3,6 +3,7 @@ using Mirai.CSharp.HttpApi.Utility.JsonConverters; using ISharedChatMessage = Mirai.CSharp.Models.ChatMessages.IChatMessage; using ISharedForwardMessageNode = Mirai.CSharp.Models.ChatMessages.IForwardMessageNode; +using ISharedForwardMessageReference = Mirai.CSharp.Models.ChatMessages.IForwardMessageNodeReference; namespace Mirai.CSharp.HttpApi.Models.ChatMessages { @@ -10,56 +11,68 @@ public interface IForwardMessageNode : ISharedForwardMessageNode { #if !NETSTANDARD2_0 [JsonPropertyName("sourceId")] - abstract int ISharedForwardMessageNode.Id { get; } + abstract int? ISharedForwardMessageNode.Id { get; } [JsonPropertyName("senderName")] - abstract string ISharedForwardMessageNode.Name { get; } + abstract string? ISharedForwardMessageNode.Name { get; } [JsonPropertyName("senderId")] - abstract long ISharedForwardMessageNode.QQNumber { get; } + abstract long? ISharedForwardMessageNode.QQNumber { get; } [JsonConverter(typeof(UnixTimeStampJsonConverter))] [JsonPropertyName("time")] - abstract DateTime ISharedForwardMessageNode.Time { get; } + abstract DateTime? ISharedForwardMessageNode.Time { get; } [JsonPropertyName("messageChain")] - ISharedChatMessage[] ISharedForwardMessageNode.Chain => Chain; + ISharedChatMessage[]? ISharedForwardMessageNode.Chain => Chain; + + [JsonPropertyName("messageRef")] + [JsonConverter(typeof(ChangeTypeJsonConverter))] + ISharedForwardMessageReference? ISharedForwardMessageNode.Reference => Reference; #else [JsonPropertyName("sourceId")] - new int Id { get; } + new int? Id { get; } [JsonPropertyName("senderName")] - new string Name { get; } + new string? Name { get; } [JsonPropertyName("senderId")] - new long QQNumber { get; } + new long? QQNumber { get; } [JsonConverter(typeof(UnixTimeStampJsonConverter))] [JsonPropertyName("time")] - new DateTime Time { get; } + new DateTime? Time { get; } #endif [JsonPropertyName("messageChain")] - new IChatMessage[] Chain { get; } + new IChatMessage[]? Chain { get; } + + [JsonPropertyName("messageRef")] + [JsonConverter(typeof(ChangeTypeJsonConverter))] + new IForwardMessageNodeReference? Reference { get; } } public class ForwardMessageNode : IForwardMessageNode { [JsonPropertyName("sourceId")] - public int Id { get; set; } + public int? Id { get; set; } [JsonPropertyName("senderName")] - public string Name { get; set; } = null!; + public string? Name { get; set; } [JsonPropertyName("senderId")] - public long QQNumber { get; set; } + public long? QQNumber { get; set; } [JsonConverter(typeof(UnixTimeStampJsonConverter))] [JsonPropertyName("time")] - public DateTime Time { get; set; } + public DateTime? Time { get; set; } [JsonPropertyName("messageChain")] - public IChatMessage[] Chain { get; set; } = null!; + public IChatMessage[]? Chain { get; set; } + + [JsonPropertyName("messageRef")] + [JsonConverter(typeof(ChangeTypeJsonConverter))] + public IForwardMessageNodeReference? Reference { get; set; } public ForwardMessageNode() { @@ -71,22 +84,31 @@ public ForwardMessageNode(int id) Id = id; } - public ForwardMessageNode(string name, long qQNumber, DateTime time, IChatMessage[] chain) + public ForwardMessageNode(string name, long qqNumber, DateTime time, IChatMessage[] chain) { Name = name; - QQNumber = qQNumber; + QQNumber = qqNumber; Time = time; Chain = chain; } + public ForwardMessageNode(IForwardMessageNodeReference reference) + { + Reference = reference; + } + public override string ToString() { - return $"[mirai:forward:{Chain.Length} nodes]"; + return $"[mirai:forward:{Chain?.Length ?? 0} nodes]"; } #if NETSTANDARD2_0 [JsonPropertyName("messageChain")] - ISharedChatMessage[] ISharedForwardMessageNode.Chain => Chain; + ISharedChatMessage[]? ISharedForwardMessageNode.Chain => Chain; + + [JsonPropertyName("messageRef")] + [JsonConverter(typeof(ChangeTypeJsonConverter))] + ISharedForwardMessageReference? ISharedForwardMessageNode.Reference => Reference; #endif } } diff --git a/Mirai-CSharp.HttpApi/Models/ChatMessages/ForwardMessageNodeReference.cs b/Mirai-CSharp.HttpApi/Models/ChatMessages/ForwardMessageNodeReference.cs new file mode 100644 index 0000000..3fe2d29 --- /dev/null +++ b/Mirai-CSharp.HttpApi/Models/ChatMessages/ForwardMessageNodeReference.cs @@ -0,0 +1,50 @@ +using System.Text.Json.Serialization; +using ISharedForwardMessageReference = Mirai.CSharp.Models.ChatMessages.IForwardMessageNodeReference; + +namespace Mirai.CSharp.HttpApi.Models.ChatMessages +{ + public interface IForwardMessageNodeReference : ISharedForwardMessageReference + { +#if !NETSTANDARD2_0 + [JsonPropertyName("messageId")] + abstract int ISharedForwardMessageReference.MessageId { get; } + + [JsonPropertyName("target")] + abstract long ISharedForwardMessageReference.Target { get; } +#else + [JsonPropertyName("messageId")] + new int MessageId { get; } + + [JsonPropertyName("target")] + new long Target { get; } +#endif + } + + public class ForwardMessageNodeReference : IForwardMessageNodeReference + { + [JsonPropertyName("messageId")] + public int MessageId { get; set; } + + [JsonPropertyName("target")] + public long Target { get; set; } + + public ForwardMessageNodeReference() + { + + } + + public ForwardMessageNodeReference(int messageId, long target) + { + MessageId = messageId; + Target = target; + } + +#if NETSTANDARD2_0 + [JsonPropertyName("messageId")] + int ISharedForwardMessageReference.MessageId => MessageId; + + [JsonPropertyName("target")] + long ISharedForwardMessageReference.Target => Target; +#endif + } +} diff --git a/Mirai-CSharp/Builders/ForwardMessageBuilder.cs b/Mirai-CSharp/Builders/ForwardMessageBuilder.cs index fec2ecf..81d1a92 100644 --- a/Mirai-CSharp/Builders/ForwardMessageBuilder.cs +++ b/Mirai-CSharp/Builders/ForwardMessageBuilder.cs @@ -61,6 +61,14 @@ public interface IForwardMessageBuilder : IEnumerable /// 一系列的具体消息 /// 传入的 实例, 可继续用于链式调用 IForwardMessageBuilder AddNode(string name, long qqNumber, DateTime time, params IChatMessage[] messages); + + /// + /// 为当前的 添加一条消息 + /// + /// 将引用的消息唯一标识符 + /// 将引用的消息上下文目标, 好友QQ号/群号 + /// 传入的 实例, 可继续用于链式调用 + public abstract IForwardMessageBuilder AddNode(int messageId, long target); } /// @@ -105,6 +113,9 @@ public virtual IEnumerator GetEnumerator() /// public abstract IForwardMessageBuilder AddNode(string name, long qqNumber, DateTime time, params IChatMessage[] messages); + /// + public abstract IForwardMessageBuilder AddNode(int messageId, long target); + /// IEnumerator IEnumerable.GetEnumerator() { diff --git a/Mirai-CSharp/Models/ChatMessages/IForwardMessage.cs b/Mirai-CSharp/Models/ChatMessages/IForwardMessage.cs index 79923ab..32c351b 100644 --- a/Mirai-CSharp/Models/ChatMessages/IForwardMessage.cs +++ b/Mirai-CSharp/Models/ChatMessages/IForwardMessage.cs @@ -3,5 +3,7 @@ namespace Mirai.CSharp.Models.ChatMessages public interface IForwardMessage : IChatMessage { IForwardMessageNode[] Nodes { get; } + + IForwardMessageDisplay? Display { get; } } } diff --git a/Mirai-CSharp/Models/ChatMessages/IForwardMessageDisplay.cs b/Mirai-CSharp/Models/ChatMessages/IForwardMessageDisplay.cs new file mode 100644 index 0000000..68cd8d4 --- /dev/null +++ b/Mirai-CSharp/Models/ChatMessages/IForwardMessageDisplay.cs @@ -0,0 +1,15 @@ +namespace Mirai.CSharp.Models.ChatMessages +{ + public interface IForwardMessageDisplay + { + string Title { get; } + + string Brief { get; } + + string Source { get; } + + string[] Preview { get; } + + string Summary { get; } + } +} diff --git a/Mirai-CSharp/Models/ChatMessages/IForwardMessageNode.cs b/Mirai-CSharp/Models/ChatMessages/IForwardMessageNode.cs index a248ea3..d3e1d47 100644 --- a/Mirai-CSharp/Models/ChatMessages/IForwardMessageNode.cs +++ b/Mirai-CSharp/Models/ChatMessages/IForwardMessageNode.cs @@ -4,14 +4,16 @@ namespace Mirai.CSharp.Models.ChatMessages { public interface IForwardMessageNode { - int Id { get; } + int? Id { get; } - string Name { get; } + string? Name { get; } - long QQNumber { get; } + long? QQNumber { get; } - DateTime Time { get; } + DateTime? Time { get; } - IChatMessage[] Chain { get; } + IChatMessage[]? Chain { get; } + + IForwardMessageNodeReference? Reference { get; } } } diff --git a/Mirai-CSharp/Models/ChatMessages/IForwardMessageNodeReference.cs b/Mirai-CSharp/Models/ChatMessages/IForwardMessageNodeReference.cs new file mode 100644 index 0000000..29dd8ea --- /dev/null +++ b/Mirai-CSharp/Models/ChatMessages/IForwardMessageNodeReference.cs @@ -0,0 +1,9 @@ +namespace Mirai.CSharp.Models.ChatMessages +{ + public interface IForwardMessageNodeReference + { + int MessageId { get; } + + long Target { get; } + } +}