Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Oct 12, 2025. It is now read-only.

[All] feat: recived fake forward message with reply element #858

Closed
LXY1226 wants to merge 1 commit into LagrangeDev:master from LXY1226:lxy1226-work
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;
Expand Down
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -583,6 +583,19 @@ public async Task<bool> SetFriendRequest(string targetUid, bool accept)

if (results.Count == 0) return (-9999, null);
var result = (MultiMsgDownloadEvent)results[0];

var tasks = new List<Task>();

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);
}
Expand Down
7 changes: 5 additions & 2 deletions Lagrange.Core/Internal/Event/Message/MultiMsgDownloadEvent.cs
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,22 @@ internal class MultiMsgDownloadEvent : ProtocolEvent
public string? ResId { get; }

public List<MessageChain>? Chains { get; }

public List<MessageChain>? OtherMessages { get; }

private MultiMsgDownloadEvent(string uid, string resId) : base(true)
{
Uid = uid;
ResId = resId;
}

private MultiMsgDownloadEvent(int resultCode, List<MessageChain> chains) : base(resultCode)
private MultiMsgDownloadEvent(int resultCode, List<MessageChain> chains, List<MessageChain> 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<MessageChain> chains) => new(resultCode, chains);
public static MultiMsgDownloadEvent Result(int resultCode, List<MessageChain> chains, List<MessageChain> otherMessages) => new(resultCode, chains, otherMessages);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 } 图片尺寸
}
21 changes: 18 additions & 3 deletions Lagrange.Core/Internal/Service/Message/MultiMsgDownloadService.cs
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,25 @@ protected override bool Parse(Span<byte> input, BotKeystore keystore, BotAppInfo
var packet = Serializer.Deserialize<RecvLongMsgResp>(input);
var inflate = GZip.Inflate(packet.Result.Payload);
var result = Serializer.Deserialize<LongMsgResult>(inflate.AsSpan());
var mainChains = new List<MessageChain>();
var otherChains = new List<MessageChain>();

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;
}
Expand Down
8 changes: 6 additions & 2 deletions Lagrange.OneBot/Message/Entity/ReplySegment.cs
View file Open in desktop
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -10,7 +11,9 @@
{
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<OneBotSegment> Elem { get; set; } = new List<OneBotSegment>();
}

[SegmentSubscriber(typeof(ForwardEntity), "reply")]
Expand Down Expand Up @@ -54,6 +57,7 @@
.Id);
}

return new ReplySegment { MessageId = (id ?? 0).ToString() };

return new ReplySegment { MessageId = (id ?? 0).ToString(), Elem = MessageService.Convert(forward.Chain) };

Check warning on line 61 in Lagrange.OneBot/Message/Entity/ReplySegment.cs

View workflow job for this annotation

GitHub Actions / build (linux-arm)

Dereference of a possibly null reference.

Check warning on line 61 in Lagrange.OneBot/Message/Entity/ReplySegment.cs

View workflow job for this annotation

GitHub Actions / build (linux-arm)

Dereference of a possibly null reference.

Check warning on line 61 in Lagrange.OneBot/Message/Entity/ReplySegment.cs

View workflow job for this annotation

GitHub Actions / build (win-x86)

Dereference of a possibly null reference.

Check warning on line 61 in Lagrange.OneBot/Message/Entity/ReplySegment.cs

View workflow job for this annotation

GitHub Actions / build (win-x86)

Dereference of a possibly null reference.

Check warning on line 61 in Lagrange.OneBot/Message/Entity/ReplySegment.cs

View workflow job for this annotation

GitHub Actions / build (linux-x64)

Dereference of a possibly null reference.

Check warning on line 61 in Lagrange.OneBot/Message/Entity/ReplySegment.cs

View workflow job for this annotation

GitHub Actions / build (linux-x64)

Dereference of a possibly null reference.

Check warning on line 61 in Lagrange.OneBot/Message/Entity/ReplySegment.cs

View workflow job for this annotation

GitHub Actions / build (linux-arm64)

Dereference of a possibly null reference.

Check warning on line 61 in Lagrange.OneBot/Message/Entity/ReplySegment.cs

View workflow job for this annotation

GitHub Actions / build (linux-arm64)

Dereference of a possibly null reference.

Check warning on line 61 in Lagrange.OneBot/Message/Entity/ReplySegment.cs

View workflow job for this annotation

GitHub Actions / build (osx-arm64)

Dereference of a possibly null reference.

Check warning on line 61 in Lagrange.OneBot/Message/Entity/ReplySegment.cs

View workflow job for this annotation

GitHub Actions / build (osx-arm64)

Dereference of a possibly null reference.

Check warning on line 61 in Lagrange.OneBot/Message/Entity/ReplySegment.cs

View workflow job for this annotation

GitHub Actions / build (osx-x64)

Dereference of a possibly null reference.

Check warning on line 61 in Lagrange.OneBot/Message/Entity/ReplySegment.cs

View workflow job for this annotation

GitHub Actions / build (osx-x64)

Dereference of a possibly null reference.

Check warning on line 61 in Lagrange.OneBot/Message/Entity/ReplySegment.cs

View workflow job for this annotation

GitHub Actions / build (win-x64)

Dereference of a possibly null reference.

Check warning on line 61 in Lagrange.OneBot/Message/Entity/ReplySegment.cs

View workflow job for this annotation

GitHub Actions / build (win-x64)

Dereference of a possibly null reference.
}
}
1 change: 1 addition & 0 deletions Lagrange.OneBot/Message/MessageService.cs
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -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)];
Expand Down
2 changes: 2 additions & 0 deletions Lagrange.OneBot/Message/SegmentBase.cs
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

AltStyle によって変換されたページ (->オリジナル) /