Skip to content
This repository was archived by the owner on Oct 12, 2025. It is now read-only.

Commit 03e2112

Browse files
committed
[Core+Onebot] feat: recived fake forward message with reply element in a single request
1 parent 8ba45e4 commit 03e2112

File tree

8 files changed

+81
-34
lines changed

8 files changed

+81
-34
lines changed

Lagrange.Core/Internal/Context/Logic/Implementation/MessagingLogic.cs

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ public override async Task Outgoing(ProtocolEvent e)
373373
}
374374
}
375375

376-
private async Task ResolveIncomingChain(MessageChain chain)
376+
public async Task ResolveIncomingChain(MessageChain chain)
377377
{
378378
foreach (var entity in chain)
379379
{
@@ -494,35 +494,42 @@ private async Task ResolveIncomingChain(MessageChain chain)
494494
}
495495
case ForwardEntity forward:
496496
{
497-
if (chain is { GroupUin: not null })
497+
MessageChain? newChain = null;
498+
if (forward.Sequence != 0)
498499
{
499-
var events = await Collection.Business.SendEvent(GetGroupMessageEvent.Create(
500-
chain.GroupUin.Value,
501-
forward.Sequence,
502-
forward.Sequence
503-
));
504-
505-
if (events.Count < 1) break;
506-
if (events[0] is not GetGroupMessageEvent @event) break;
507-
if (@event.ResultCode != 0) break;
508-
if (@event.Chains.Count < 1) break;
509-
510-
forward.Chain = @event.Chains[0];
500+
if (chain is { GroupUin: not null })
501+
{
502+
var events = await Collection.Business.SendEvent(GetGroupMessageEvent.Create(
503+
chain.GroupUin.Value,
504+
forward.Sequence,
505+
forward.Sequence
506+
));
507+
if (events.Count != 0 &&
508+
events[0] is GetGroupMessageEvent @event &&
509+
@event.ResultCode == 0)
510+
{
511+
newChain = @event.Chains[0];
512+
}
513+
}
514+
else
515+
{
516+
var events = await Collection.Business.SendEvent(GetC2cMessageEvent.Create(
517+
chain.Uid ?? "",
518+
forward.Sequence,
519+
forward.Sequence
520+
));
521+
if (events.Count != 0 &&
522+
events[0] is GetC2cMessageEvent @event &&
523+
@event.ResultCode == 0)
524+
{
525+
newChain = @event.Chains[0];
526+
}
527+
528+
}
511529
}
512-
else
530+
if (newChain == null || newChain.Count == 0)
513531
{
514-
var events = await Collection.Business.SendEvent(GetC2cMessageEvent.Create(
515-
chain.Uid ?? "",
516-
forward.Sequence,
517-
forward.Sequence
518-
));
519-
520-
if (events.Count < 1) break;
521-
if (events[0] is not GetC2cMessageEvent @event) break;
522-
if (@event.ResultCode != 0) break;
523-
if (@event.Chains.Count < 1) break;
524-
525-
forward.Chain = @event.Chains[0];
532+
await ResolveIncomingChain(forward.Chain);
526533
}
527534

528535
break;

Lagrange.Core/Internal/Context/Logic/Implementation/OperationLogic.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,19 @@ public async Task<bool> SetFriendRequest(string targetUid, bool accept)
583583

584584
if (results.Count == 0) return (-9999, null);
585585
var result = (MultiMsgDownloadEvent)results[0];
586+
587+
var tasks = new List<Task>();
588+
589+
if (result.Chains != null)
590+
{
591+
tasks.AddRange(result.Chains.Select(chain =>
592+
Collection.Business.MessagingLogic.ResolveIncomingChain(chain)));
593+
}
594+
595+
if (tasks.Count > 0)
596+
{
597+
await Task.WhenAll(tasks);
598+
}
586599

587600
return (result.ResultCode, result.Chains);
588601
}

Lagrange.Core/Internal/Event/Message/MultiMsgDownloadEvent.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,22 @@ internal class MultiMsgDownloadEvent : ProtocolEvent
99
public string? ResId { get; }
1010

1111
public List<MessageChain>? Chains { get; }
12+
13+
public List<MessageChain>? OtherMessages { get; }
1214

1315
private MultiMsgDownloadEvent(string uid, string resId) : base(true)
1416
{
1517
Uid = uid;
1618
ResId = resId;
1719
}
1820

19-
private MultiMsgDownloadEvent(int resultCode, List<MessageChain> chains) : base(resultCode)
21+
private MultiMsgDownloadEvent(int resultCode, List<MessageChain> chains, List<MessageChain> otherMessages) : base(resultCode)
2022
{
2123
Chains = chains;
24+
OtherMessages = otherMessages;
2225
}
2326

2427
public static MultiMsgDownloadEvent Create(string uid, string resId) => new(uid, resId);
2528

26-
public static MultiMsgDownloadEvent Result(int resultCode, List<MessageChain> chains) => new(resultCode, chains);
29+
public static MultiMsgDownloadEvent Result(int resultCode, List<MessageChain> chains, List<MessageChain> otherMessages) => new(resultCode, chains, otherMessages);
2730
}

Lagrange.Core/Internal/Packets/Message/Element/Implementation/RichMsg.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,6 @@ internal class RichMsg
1717
[ProtoMember(4)] public int? Rand { get; set; }
1818

1919
[ProtoMember(5)] public int? Seq { get; set; }
20+
21+
// [ProtoMember(13)] public // "13": { "1": 1200, "2": 1200 } 图片尺寸
2022
}

Lagrange.Core/Internal/Service/Message/MultiMsgDownloadService.cs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,25 @@ protected override bool Parse(Span<byte> input, BotKeystore keystore, BotAppInfo
4444
var packet = Serializer.Deserialize<RecvLongMsgResp>(input);
4545
var inflate = GZip.Inflate(packet.Result.Payload);
4646
var result = Serializer.Deserialize<LongMsgResult>(inflate.AsSpan());
47+
var mainChains = new List<MessageChain>();
48+
var otherChains = new List<MessageChain>();
4749

48-
var main = result.Action.First(a => a.ActionCommand == "MultiMsg");
49-
var chains = main.ActionData.MsgBody.Select(x => MessagePacker.Parse(x, true)).ToList();
50-
output = MultiMsgDownloadEvent.Result(0, chains);
50+
foreach (var longMsgAction in result.Action)
51+
{
52+
if (longMsgAction.ActionCommand == "MultiMsg")
53+
{
54+
longMsgAction.ActionData.MsgBody.ForEach(x => mainChains.Add(
55+
MessagePacker.Parse(x, true)
56+
));
57+
}
58+
else
59+
{
60+
longMsgAction.ActionData.MsgBody.ForEach(x => otherChains.Add(MessagePacker.Parse(x, true)));
61+
}
62+
}
63+
64+
65+
output = MultiMsgDownloadEvent.Result(0, mainChains, otherChains);
5166
extraEvents = null;
5267
return true;
5368
}

Lagrange.OneBot/Message/Entity/ReplySegment.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Text.Json.Serialization;
22
using Lagrange.Core.Message;
33
using Lagrange.Core.Message.Entity;
4+
using Lagrange.OneBot.Core.Entity.Message;
45
using Lagrange.OneBot.Database;
56

67
namespace Lagrange.OneBot.Message.Entity;
@@ -10,7 +11,9 @@ public partial class ReplySegment(uint messageId)
1011
{
1112
public ReplySegment() : this(0) { }
1213

13-
[JsonPropertyName("id")][CQProperty] public string MessageId { get; set; } = messageId.ToString();
14+
[JsonPropertyName("id")] [CQProperty] public string MessageId { get; set; } = messageId.ToString();
15+
16+
[JsonPropertyName("elem")] public List<OneBotSegment> Elem { get; set; } = new List<OneBotSegment>();
1417
}
1518

1619
[SegmentSubscriber(typeof(ForwardEntity), "reply")]
@@ -54,6 +57,7 @@ public override SegmentBase FromEntity(MessageChain chain, IMessageEntity entity
5457
.Id);
5558
}
5659

57-
return new ReplySegment { MessageId = (id ?? 0).ToString() };
60+
61+
return new ReplySegment { MessageId = (id ?? 0).ToString(), Elem = MessageService.Convert(forward.Chain) };
5862
}
5963
}

Lagrange.OneBot/Message/MessageService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public MessageService(BotContext bot, LagrangeWebSvcCollection service, RealmHel
5757
{
5858
var instance = (SegmentBase)type.CreateInstance(false);
5959
instance.Realm = _realm;
60+
instance.MessageService = this;
6061

6162
if (_entityToFactory.TryGetValue(attribute.Entity, out var factories)) factories.Add((attribute.Type, instance));
6263
else _entityToFactory[attribute.Entity] = [(attribute.Type, instance)];

Lagrange.OneBot/Message/SegmentBase.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ public abstract class SegmentBase
77
{
88
public RealmHelper? Realm { protected get; set; }
99

10+
public MessageService? MessageService { protected get; set; } // just for reply segment inflat
11+
1012
public abstract void Build(MessageBuilder builder, SegmentBase segment);
1113

1214
public abstract SegmentBase? FromEntity(MessageChain chain, IMessageEntity entity);

0 commit comments

Comments
 (0)