Skip to content

Commit b2a00c0

Browse files
committed
[Core] Implemented MultiMsgEntity
1 parent ae065ee commit b2a00c0

File tree

18 files changed

+212
-40
lines changed

18 files changed

+212
-40
lines changed

Lagrange.Core/Internal/Context/CacheContext.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ public async Task<List<BotFriendCategory>> GetCategories(bool refresh = false)
6767
if (_groups == null) Interlocked.Exchange(ref _groups, await FetchGroups());
6868
var groups = _groups;
6969

70-
var group = groups.First(g => g.GroupUin == groupUin);
70+
var group = groups.FirstOrDefault(g => g.GroupUin == groupUin);
71+
if (group == null) return null;
7172

7273
if (!_members.TryGetValue(groupUin, out var members))
7374
{

Lagrange.Core/Internal/Events/Message/LongMsgSendEvent.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@
33

44
namespace Lagrange.Core.Internal.Events.Message;
55

6-
internal class LongMsgSendEventReq(BotContact contact, long? groupUin, List<BotMessage> messages) : ProtocolEvent
6+
internal class LongMsgSendEventReq(BotContact receiver, List<BotMessage> messages) : ProtocolEvent
77
{
8-
public BotContact Contact { get; } = contact;
9-
10-
public long? GroupUin { get; } = groupUin;
8+
public BotContact Receiver { get; } = receiver;
119

1210
public List<BotMessage> Messages { get; } = messages;
1311
}

Lagrange.Core/Internal/Packets/Message/Elem.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,14 @@ internal partial class Elem
1212

1313
[ProtoMember(8)] public CustomFace? CustomFace { get; set; }
1414

15+
[ProtoMember(12)] public RichMsg? RichMsg { get; set; }
16+
1517
[ProtoMember(19)] public VideoFile? VideoFile { get; set; }
1618

1719
[ProtoMember(45)] public SourceMsg? SrcMsg { get; set; }
1820

21+
[ProtoMember(51)] public LightAppElem? LightAppElem { get; set; }
22+
1923
[ProtoMember(53)] public CommonElem? CommonElem { get; set; }
2024
}
2125

@@ -203,6 +207,22 @@ public partial class PbReserve2
203207
}
204208
}
205209

210+
[ProtoPackable]
211+
internal partial class RichMsg
212+
{
213+
[ProtoMember(1)] public ReadOnlyMemory<byte> BytesTemplate1 { get; set; } // Xml模板一
214+
215+
[ProtoMember(2)] public uint ServiceId { get; set; } // 对应的业务标识
216+
217+
[ProtoMember(3)] public ReadOnlyMemory<byte> BytesMsgResid { get; set; } // 长消息resid
218+
219+
[ProtoMember(4)] public uint Rand { get; set; } // 需要删除的消息 rand 值
220+
221+
[ProtoMember(5)] public uint Seq { get; set; } // 需要删除的消息 seq
222+
223+
[ProtoMember(6)] public uint Flags { get; set; } // bit 0:消息是否来自UrlCache; bit 1:是否包含video标签; bit 2:来自公众帐号的video结构化消息; bit 3:消息在urlencode模块从url转成richmsg
224+
}
225+
206226
[ProtoPackable]
207227
internal partial class VideoFile
208228
{
@@ -281,6 +301,14 @@ internal partial class SourceMsg
281301
[ProtoMember(11)] public ReadOnlyMemory<byte> TroopName { get; set; } // 单独回复原消息群名
282302
}
283303

304+
[ProtoPackable]
305+
internal partial class LightAppElem
306+
{
307+
[ProtoMember(1)] public ReadOnlyMemory<byte> BytesData { get; set; } // LightApp数据
308+
309+
[ProtoMember(2)] public byte[] BytesMsgResid { get; set; } // 长消息resid
310+
}
311+
284312
[ProtoPackable]
285313
internal partial class CommonElem
286314
{

Lagrange.Core/Internal/Packets/Message/NTMessageCommon.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ internal partial class MessageBody
105105
{
106106
[ProtoMember(1)] public RichText RichText { get; set; } = new();
107107

108-
[ProtoMember(2)] public ReadOnlyMemory<byte> MsgContent { get; set; }
108+
[ProtoMember(2)] public ReadOnlyMemory<byte>? MsgContent { get; set; }
109109

110110
[ProtoMember(3)] public byte[]? MsgEncryptContent { get; set; }
111111
}

Lagrange.Core/Internal/Packets/Service/LightApp.cs

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class LightApp
1818

1919
[JsonPropertyName("meta")] public JsonObject Meta { get; set; }
2020

21-
[JsonPropertyName("extra")] public Extra? Extra { get; set; }
21+
[JsonPropertyName("extra")] public string? Extra { get; set; }
2222

2323
[JsonPropertyName("prompt")] public string Prompt { get; set; }
2424

@@ -32,29 +32,21 @@ public class LightApp
3232
[Serializable]
3333
public class Config
3434
{
35-
[JsonPropertyName("autosize")] public bool Autosize { get; set; }
35+
[JsonPropertyName("autosize")] public int Autosize { get; set; }
3636

37-
[JsonPropertyName("ctime")] public long Ctime { get; set; }
37+
// [JsonPropertyName("ctime")] public long Ctime { get; set; }
3838

3939
[JsonPropertyName("token")] public string Token { get; set; }
4040

4141
[JsonPropertyName("type")] public string Type { get; set; }
4242

4343
[JsonPropertyName("forward")] public int Forward { get; set; }
4444

45-
[JsonPropertyName("height")] public int Height { get; set; }
45+
[JsonPropertyName("round")] public int Round { get; set; }
46+
47+
// [JsonPropertyName("height")] public int Height { get; set; }
4648

4749
[JsonPropertyName("width")] public int Width { get; set; }
4850

49-
[JsonPropertyName("showsender")] public int ShowSender { get; set; }
50-
}
51-
52-
[Serializable]
53-
public class Extra
54-
{
55-
[JsonPropertyName("app_type")] public int AppType { get; set; }
56-
57-
[JsonPropertyName("appid")] public int AppId { get; set; }
58-
59-
[JsonPropertyName("uin")] public uint Uin { get; set; }
51+
// [JsonPropertyName("showsender")] public int ShowSender { get; set; }
6052
}

Lagrange.Core/Internal/Services/Message/LongMsgRecvService.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ protected override ValueTask<ReadOnlyMemory<byte>> Build(LongMsgRecvEventReq inp
2626
},
2727
Attr = new LongMsgAttr
2828
{
29-
SubCmd = context.Config.Protocol.IsAndroid() ? 3u : 4u, // 1 -> Android 2 -> NTPC 0 -> Undefined
29+
SubCmd = context.Config.Protocol.IsAndroid() ? 3u : 2u, // 1 -> Android 2 -> NTPC 0 -> Undefined
3030
ClientType = context.Config.Protocol switch
3131
{
3232
Protocols.Windows or Protocols.MacOs or Protocols.Linux => 1u,
@@ -56,10 +56,10 @@ protected override async ValueTask<LongMsgRecvEventResp> Parse(ReadOnlyMemory<by
5656
{
5757
var rsp = ProtoHelper.Deserialize<LongMsgInterfaceRsp>(input.Span);
5858

59+
await using var src = new MemoryStream(rsp.RecvRsp.Payload);
5960
await using var dest = new MemoryStream();
60-
await using var gzip = new GZipStream(dest, CompressionMode.Compress);
61-
gzip.Write(rsp.RecvRsp.Payload);
62-
gzip.Close();
61+
await using var gzip = new GZipStream(src, CompressionMode.Decompress);
62+
await gzip.CopyToAsync(dest);
6363
var decompressedContent = dest.ToArray();
6464

6565
var logic = context.EventContext.GetLogic<MessagingLogic>();

Lagrange.Core/Internal/Services/Message/LongMsgSendService.cs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.IO.Compression;
22
using Lagrange.Core.Common;
3+
using Lagrange.Core.Common.Entity;
34
using Lagrange.Core.Internal.Events;
45
using Lagrange.Core.Internal.Events.Message;
56
using Lagrange.Core.Internal.Logic;
@@ -22,17 +23,10 @@ protected override async ValueTask<ReadOnlyMemory<byte>> Build(LongMsgSendEventR
2223
var fakeMsg = await context.EventContext.GetLogic<MessagingLogic>().BuildFake(msg);
2324
messages.Add(fakeMsg);
2425
}
25-
26+
2627
var content = new PbMultiMsgTransmit
2728
{
28-
Items =
29-
[
30-
new PbMultiMsgItem
31-
{
32-
FileName = "MultiMsg",
33-
Buffer = new PbMultiMsgNew { Msg = messages }
34-
}
35-
]
29+
Items = [new PbMultiMsgItem { FileName = "MultiMsg", Buffer = new PbMultiMsgNew { Msg = messages } }]
3630
};
3731

3832
await using var dest = new MemoryStream();
@@ -45,9 +39,9 @@ protected override async ValueTask<ReadOnlyMemory<byte>> Build(LongMsgSendEventR
4539
{
4640
SendReq = new LongMsgSendReq
4741
{
48-
MsgType = input.GroupUin is null ? 1u : 3u, // 4 for wpamsg, 5 for grpmsg temp
49-
PeerInfo = new LongMsgPeerInfo { PeerUid = input.Contact.Uid },
50-
GroupUin = input.GroupUin ?? 0,
42+
MsgType = input.Receiver is not BotGroup ? 1u : 3u, // 4 for wpamsg, 5 for grpmsg temp
43+
PeerInfo = new LongMsgPeerInfo { PeerUid = input.Receiver.Uid },
44+
GroupUin = input.Receiver is BotGroup group ? group.Uin : 0,
5145
Payload = compressedContent
5246
},
5347
Attr = new LongMsgAttr

Lagrange.Core/Message/Entities/IMessageEntity.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,6 @@ public interface IMessageEntity
1111
internal Elem[] Build();
1212

1313
internal IMessageEntity? Parse(List<Elem> elements, Elem target);
14+
15+
internal string ToPreviewString();
1416
}

Lagrange.Core/Message/Entities/ImageEntity.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ public override async Task Postprocess(BotContext context, BotMessage message)
5353

5454
FileUrl = result.Url;
5555
}
56-
56+
57+
public override string ToPreviewString() => Summary;
5758
internal override Elem[] Build()
5859
{
5960
if (_compat == null)

Lagrange.Core/Message/Entities/MentionEntity.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ async Task IMessageEntity.Preprocess(BotContext context, BotMessage message)
4141
Uid = contact.Uid;
4242
}
4343
}
44+
45+
string IMessageEntity.ToPreviewString() => Display;
4446

4547
Elem[] IMessageEntity.Build()
4648
{

0 commit comments

Comments
 (0)