diff --git a/Lagrange.Core/Internal/Context/Logic/Implementation/MessagingLogic.cs b/Lagrange.Core/Internal/Context/Logic/Implementation/MessagingLogic.cs index 34e0dedb9..f03051873 100644 --- a/Lagrange.Core/Internal/Context/Logic/Implementation/MessagingLogic.cs +++ b/Lagrange.Core/Internal/Context/Logic/Implementation/MessagingLogic.cs @@ -373,7 +373,7 @@ public override async Task Outgoing(ProtocolEvent e) } } - private async Task ResolveIncomingChain(MessageChain chain) + public async Task ResolveIncomingChain(MessageChain chain) { foreach (var entity in chain) { @@ -494,35 +494,42 @@ private async Task ResolveIncomingChain(MessageChain chain) } case ForwardEntity forward: { - if (chain is { GroupUin: not null }) + MessageChain? newChain = null; + if (forward.Sequence != 0) { - var events = await Collection.Business.SendEvent(GetGroupMessageEvent.Create( - chain.GroupUin.Value, - forward.Sequence, - forward.Sequence - )); - - if (events.Count < 1) break; - if (events[0] is not GetGroupMessageEvent @event) break; - if (@event.ResultCode != 0) break; - if (@event.Chains.Count < 1) break; - - forward.Chain = @event.Chains[0]; + if (chain is { GroupUin: not null }) + { + var events = await Collection.Business.SendEvent(GetGroupMessageEvent.Create( + chain.GroupUin.Value, + forward.Sequence, + forward.Sequence + )); + if (events.Count != 0 && + events[0] is GetGroupMessageEvent @event && + @event.ResultCode == 0) + { + newChain = @event.Chains[0]; + } + } + else + { + var events = await Collection.Business.SendEvent(GetC2cMessageEvent.Create( + chain.Uid ?? "", + forward.Sequence, + forward.Sequence + )); + if (events.Count != 0 && + events[0] is GetC2cMessageEvent @event && + @event.ResultCode == 0) + { + newChain = @event.Chains[0]; + } + + } } - else + if (newChain == null || newChain.Count == 0) { - var events = await Collection.Business.SendEvent(GetC2cMessageEvent.Create( - chain.Uid ?? "", - forward.Sequence, - forward.Sequence - )); - - if (events.Count < 1) break; - if (events[0] is not GetC2cMessageEvent @event) break; - if (@event.ResultCode != 0) break; - if (@event.Chains.Count < 1) break; - - forward.Chain = @event.Chains[0]; + await ResolveIncomingChain(forward.Chain); } break; diff --git a/Lagrange.Core/Internal/Context/Logic/Implementation/OperationLogic.cs b/Lagrange.Core/Internal/Context/Logic/Implementation/OperationLogic.cs index c299c4783..98634c1c4 100644 --- a/Lagrange.Core/Internal/Context/Logic/Implementation/OperationLogic.cs +++ b/Lagrange.Core/Internal/Context/Logic/Implementation/OperationLogic.cs @@ -583,6 +583,19 @@ public async Task SetFriendRequest(string targetUid, bool accept) if (results.Count == 0) return (-9999, null); var result = (MultiMsgDownloadEvent)results[0]; + + var tasks = new List(); + + if (result.Chains != null) + { + tasks.AddRange(result.Chains.Select(chain => + Collection.Business.MessagingLogic.ResolveIncomingChain(chain))); + } + + if (tasks.Count > 0) + { + await Task.WhenAll(tasks); + } return (result.ResultCode, result.Chains); } diff --git a/Lagrange.Core/Internal/Event/Message/MultiMsgDownloadEvent.cs b/Lagrange.Core/Internal/Event/Message/MultiMsgDownloadEvent.cs index f58a52494..6eeef72bb 100644 --- a/Lagrange.Core/Internal/Event/Message/MultiMsgDownloadEvent.cs +++ b/Lagrange.Core/Internal/Event/Message/MultiMsgDownloadEvent.cs @@ -9,6 +9,8 @@ internal class MultiMsgDownloadEvent : ProtocolEvent public string? ResId { get; } public List? Chains { get; } + + public List? OtherMessages { get; } private MultiMsgDownloadEvent(string uid, string resId) : base(true) { @@ -16,12 +18,13 @@ private MultiMsgDownloadEvent(string uid, string resId) : base(true) ResId = resId; } - private MultiMsgDownloadEvent(int resultCode, List chains) : base(resultCode) + private MultiMsgDownloadEvent(int resultCode, List chains, List otherMessages) : base(resultCode) { Chains = chains; + OtherMessages = otherMessages; } public static MultiMsgDownloadEvent Create(string uid, string resId) => new(uid, resId); - public static MultiMsgDownloadEvent Result(int resultCode, List chains) => new(resultCode, chains); + public static MultiMsgDownloadEvent Result(int resultCode, List chains, List otherMessages) => new(resultCode, chains, otherMessages); } \ No newline at end of file diff --git a/Lagrange.Core/Internal/Packets/Message/Element/Implementation/RichMsg.cs b/Lagrange.Core/Internal/Packets/Message/Element/Implementation/RichMsg.cs index ba45519d4..1b9f7d601 100644 --- a/Lagrange.Core/Internal/Packets/Message/Element/Implementation/RichMsg.cs +++ b/Lagrange.Core/Internal/Packets/Message/Element/Implementation/RichMsg.cs @@ -17,4 +17,6 @@ internal class RichMsg [ProtoMember(4)] public int? Rand { get; set; } [ProtoMember(5)] public int? Seq { get; set; } + + // [ProtoMember(13)] public // "13": { "1": 1200, "2": 1200 } 图片尺寸 } \ No newline at end of file diff --git a/Lagrange.Core/Internal/Service/Message/MultiMsgDownloadService.cs b/Lagrange.Core/Internal/Service/Message/MultiMsgDownloadService.cs index 2d2ab6c50..902d62136 100644 --- a/Lagrange.Core/Internal/Service/Message/MultiMsgDownloadService.cs +++ b/Lagrange.Core/Internal/Service/Message/MultiMsgDownloadService.cs @@ -44,10 +44,25 @@ protected override bool Parse(Span input, BotKeystore keystore, BotAppInfo var packet = Serializer.Deserialize(input); var inflate = GZip.Inflate(packet.Result.Payload); var result = Serializer.Deserialize(inflate.AsSpan()); + var mainChains = new List(); + var otherChains = new List(); - var main = result.Action.First(a => a.ActionCommand == "MultiMsg"); - var chains = main.ActionData.MsgBody.Select(x => MessagePacker.Parse(x, true)).ToList(); - output = MultiMsgDownloadEvent.Result(0, chains); + foreach (var longMsgAction in result.Action) + { + if (longMsgAction.ActionCommand == "MultiMsg") + { + longMsgAction.ActionData.MsgBody.ForEach(x => mainChains.Add( + MessagePacker.Parse(x, true) + )); + } + else + { + longMsgAction.ActionData.MsgBody.ForEach(x => otherChains.Add(MessagePacker.Parse(x, true))); + } + } + + + output = MultiMsgDownloadEvent.Result(0, mainChains, otherChains); extraEvents = null; return true; } diff --git a/Lagrange.OneBot/Message/Entity/ReplySegment.cs b/Lagrange.OneBot/Message/Entity/ReplySegment.cs index 7f62b64ef..b5a2a047c 100644 --- a/Lagrange.OneBot/Message/Entity/ReplySegment.cs +++ b/Lagrange.OneBot/Message/Entity/ReplySegment.cs @@ -1,6 +1,7 @@ using System.Text.Json.Serialization; using Lagrange.Core.Message; using Lagrange.Core.Message.Entity; +using Lagrange.OneBot.Core.Entity.Message; using Lagrange.OneBot.Database; namespace Lagrange.OneBot.Message.Entity; @@ -10,7 +11,9 @@ public partial class ReplySegment(uint messageId) { public ReplySegment() : this(0) { } - [JsonPropertyName("id")][CQProperty] public string MessageId { get; set; } = messageId.ToString(); + [JsonPropertyName("id")] [CQProperty] public string MessageId { get; set; } = messageId.ToString(); + + [JsonPropertyName("elem")] public List Elem { get; set; } = new List(); } [SegmentSubscriber(typeof(ForwardEntity), "reply")] @@ -54,6 +57,7 @@ public override SegmentBase FromEntity(MessageChain chain, IMessageEntity entity .Id); } - return new ReplySegment { MessageId = (id ?? 0).ToString() }; + + return new ReplySegment { MessageId = (id ?? 0).ToString(), Elem = MessageService.Convert(forward.Chain) }; } } \ No newline at end of file diff --git a/Lagrange.OneBot/Message/MessageService.cs b/Lagrange.OneBot/Message/MessageService.cs index a3b4a5c8e..33398d516 100644 --- a/Lagrange.OneBot/Message/MessageService.cs +++ b/Lagrange.OneBot/Message/MessageService.cs @@ -57,6 +57,7 @@ public MessageService(BotContext bot, LagrangeWebSvcCollection service, RealmHel { var instance = (SegmentBase)type.CreateInstance(false); instance.Realm = _realm; + instance.MessageService = this; if (_entityToFactory.TryGetValue(attribute.Entity, out var factories)) factories.Add((attribute.Type, instance)); else _entityToFactory[attribute.Entity] = [(attribute.Type, instance)]; diff --git a/Lagrange.OneBot/Message/SegmentBase.cs b/Lagrange.OneBot/Message/SegmentBase.cs index ec802aec5..70d4c6f07 100644 --- a/Lagrange.OneBot/Message/SegmentBase.cs +++ b/Lagrange.OneBot/Message/SegmentBase.cs @@ -7,6 +7,8 @@ public abstract class SegmentBase { public RealmHelper? Realm { protected get; set; } + public MessageService? MessageService { protected get; set; } // just for reply segment inflat + public abstract void Build(MessageBuilder builder, SegmentBase segment); public abstract SegmentBase? FromEntity(MessageChain chain, IMessageEntity entity);