Skip to content

Commit 61a709f

Browse files
committed
[Core] Highway Stage 3 - Entities
1 parent 4b43134 commit 61a709f

6 files changed

Lines changed: 429 additions & 19 deletions

File tree

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

Lines changed: 163 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ internal partial class Elem
1010

1111
[ProtoMember(4)] public NotOnlineImage? NotOnlineImage { get; set; }
1212

13+
[ProtoMember(8)] public CustomFace? CustomFace { get; set; }
14+
15+
[ProtoMember(19)] public VideoFile? VideoFile { get; set; }
16+
1317
[ProtoMember(53)] public CommonElem? CommonElem { get; set; }
1418
}
1519

@@ -91,12 +95,170 @@ internal partial class NotOnlineImage
9195
[ProtoMember(29)] public byte[] PbReserve { get; set; }
9296
}
9397

98+
[ProtoPackable]
99+
internal partial class CustomFace
100+
{
101+
[ProtoMember(1)] public byte[] Guid { get; set; }
102+
103+
[ProtoMember(2)] public string FilePath { get; set; }
104+
105+
[ProtoMember(3)] public string Shortcut { get; set; }
106+
107+
[ProtoMember(4)] public byte[] Buffer { get; set; }
108+
109+
[ProtoMember(5)] public byte[] Flag { get; set; }
110+
111+
[ProtoMember(6)] public byte[]? OldData { get; set; }
112+
113+
[ProtoMember(7)] public uint FileId { get; set; }
114+
115+
[ProtoMember(8)] public int? ServerIp { get; set; }
116+
117+
[ProtoMember(9)] public int? ServerPort { get; set; }
118+
119+
[ProtoMember(10)] public int FileType { get; set; }
120+
121+
[ProtoMember(11)] public byte[] Signature { get; set; }
122+
123+
[ProtoMember(12)] public int Useful { get; set; }
124+
125+
[ProtoMember(13)] public byte[] Md5 { get; set; }
126+
127+
[ProtoMember(14)] public string ThumbUrl { get; set; }
128+
129+
[ProtoMember(15)] public string BigUrl { get; set; }
130+
131+
[ProtoMember(16)] public string OrigUrl { get; set; }
132+
133+
[ProtoMember(17)] public int BizType { get; set; }
134+
135+
[ProtoMember(18)] public int RepeatIndex { get; set; }
136+
137+
[ProtoMember(19)] public int RepeatImage { get; set; }
138+
139+
[ProtoMember(20)] public int ImageType { get; set; }
140+
141+
[ProtoMember(21)] public int Index { get; set; }
142+
143+
[ProtoMember(22)] public int Width { get; set; }
144+
145+
[ProtoMember(23)] public int Height { get; set; }
146+
147+
[ProtoMember(24)] public int Source { get; set; }
148+
149+
[ProtoMember(25)] public uint Size { get; set; }
150+
151+
[ProtoMember(26)] public int Origin { get; set; }
152+
153+
[ProtoMember(27)] public int? ThumbWidth { get; set; }
154+
155+
[ProtoMember(28)] public int? ThumbHeight { get; set; }
156+
157+
[ProtoMember(29)] public int ShowLen { get; set; }
158+
159+
[ProtoMember(30)] public int DownloadLen { get; set; }
160+
161+
[ProtoMember(31)] public string? X400Url { get; set; }
162+
163+
[ProtoMember(32)] public int X400Width { get; set; }
164+
165+
[ProtoMember(33)] public int X400Height { get; set; }
166+
167+
[ProtoMember(34)] public PbReserve1? PbReserve { get; set; }
168+
169+
[ProtoPackable]
170+
public partial class PbReserve1
171+
{
172+
[ProtoMember(1)] public int SubType { get; set; }
173+
174+
[ProtoMember(3)] public int Field3 { get; set; }
175+
176+
[ProtoMember(4)] public int Field4 { get; set; }
177+
178+
[ProtoMember(9)] public string Summary { get; set; }
179+
180+
[ProtoMember(10)] public int Field10 { get; set; }
181+
182+
[ProtoMember(21)] public PbReserve2 Field21 { get; set; }
183+
184+
[ProtoMember(31)] public string Field31 { get; set; }
185+
}
186+
187+
[ProtoPackable]
188+
public partial class PbReserve2
189+
{
190+
[ProtoMember(1)] public int Field1 { get; set; }
191+
192+
[ProtoMember(2)] public string Field2 { get; set; }
193+
194+
[ProtoMember(3)] public int Field3 { get; set; }
195+
196+
[ProtoMember(4)] public int Field4 { get; set; }
197+
198+
[ProtoMember(5)] public int Field5 { get; set; }
199+
200+
[ProtoMember(7)] public string Md5Str { get; set; }
201+
}
202+
}
203+
204+
[ProtoPackable]
205+
internal partial class VideoFile
206+
{
207+
[ProtoMember(1)] public string FileUuid { get; set; }
208+
209+
[ProtoMember(2)] public byte[] FileMd5 { get; set; }
210+
211+
[ProtoMember(3)] public string FileName { get; set; }
212+
213+
[ProtoMember(4)] public int FileFormat { get; set; }
214+
215+
[ProtoMember(5)] public int FileTime { get; set; }
216+
217+
[ProtoMember(6)] public int FileSize { get; set; }
218+
219+
[ProtoMember(7)] public int ThumbWidth { get; set; }
220+
221+
[ProtoMember(8)] public int ThumbHeight { get; set; }
222+
223+
[ProtoMember(9)] public byte[] ThumbFileMd5 { get; set; }
224+
225+
[ProtoMember(10)] public byte[] Source { get; set; }
226+
227+
[ProtoMember(11)] public int ThumbFileSize { get; set; }
228+
229+
[ProtoMember(12)] public int BusiType { get; set; }
230+
231+
[ProtoMember(13)] public int FromChatType { get; set; }
232+
233+
[ProtoMember(14)] public int ToChatType { get; set; }
234+
235+
[ProtoMember(15)] public bool BoolSupportProgressive { get; set; }
236+
237+
[ProtoMember(16)] public int FileWidth { get; set; }
238+
239+
[ProtoMember(17)] public int FileHeight { get; set; }
240+
241+
[ProtoMember(18)] public int SubBusiType { get; set; }
242+
243+
[ProtoMember(19)] public int VideoAttr { get; set; }
244+
245+
[ProtoMember(20)] public byte[][] BytesThumbFileUrls { get; set; }
246+
247+
[ProtoMember(21)] public byte[][] BytesVideoFileUrls { get; set; }
248+
249+
[ProtoMember(22)] public int ThumbDownloadFlag { get; set; }
250+
251+
[ProtoMember(23)] public int VideoDownloadFlag { get; set; }
252+
253+
[ProtoMember(24)] public byte[] PbReserve { get; set; }
254+
}
255+
94256
[ProtoPackable]
95257
internal partial class CommonElem
96258
{
97259
[ProtoMember(1)] public uint ServiceType { get; set; }
98260

99-
[ProtoMember(2)] public byte[] PbElem { get; set; }
261+
[ProtoMember(2)] public ReadOnlyMemory<byte> PbElem { get; set; }
100262

101263
[ProtoMember(3)] public uint BusinessType { get; set; }
102264
}

Lagrange.Core/Message/Entities/ImageEntity.cs

Lines changed: 60 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,31 @@ public class ImageEntity : RichMediaEntityBase
1616
public int SubType { get; set; }
1717

1818
public string Summary { get; internal set; } = "[图片]";
19+
20+
public ImageEntity() { }
1921

20-
public override Task Preprocess(BotContext context, BotMessage message)
22+
public ImageEntity(Stream stream)
2123
{
22-
throw new NotImplementedException();
24+
Stream = new Lazy<Stream>(() => stream);
25+
}
26+
27+
public override async Task Preprocess(BotContext context, BotMessage message)
28+
{
29+
ArgumentNullException.ThrowIfNull(Stream);
30+
31+
IsGroup = message.IsGroup();
32+
NTV2RichMediaUploadEventResp result = IsGroup
33+
? await context.EventContext.SendEvent<ImageGroupUploadEventResp>(new ImageGroupUploadEventReq(message, this))
34+
: await context.EventContext.SendEvent<ImageUploadEventResp>(new ImageUploadEventReq(message, this));
35+
36+
_compat = result.Compat;
37+
MsgInfo = result.Info;
38+
39+
if (result.Ext != null)
40+
{
41+
await context.HighwayContext.UploadFile(Stream.Value, message.IsGroup() ? 1004 : 1003, ProtoHelper.Serialize(result.Ext));
42+
}
43+
await Stream.Value.DisposeAsync();
2344
}
2445

2546
public override async Task Postprocess(BotContext context, BotMessage message)
@@ -30,17 +51,51 @@ public override async Task Postprocess(BotContext context, BotMessage message)
3051

3152
FileUrl = result.Url;
3253
}
33-
54+
3455
internal override Elem[] Build()
3556
{
36-
throw new NotImplementedException();
57+
if (_compat == null)
58+
{
59+
var compatElem = IsGroup
60+
? new Elem { NotOnlineImage = ProtoHelper.Deserialize<NotOnlineImage>(_compat) }
61+
: new Elem { CustomFace = ProtoHelper.Deserialize<CustomFace>(_compat) };
62+
63+
return
64+
[
65+
compatElem,
66+
new Elem()
67+
{
68+
CommonElem = new CommonElem
69+
{
70+
ServiceType = 48,
71+
PbElem = ProtoHelper.Serialize(MsgInfo ?? throw new ArgumentNullException(nameof(MsgInfo))),
72+
BusinessType = IsGroup ? 20u : 10u,
73+
}
74+
}
75+
];
76+
}
77+
else
78+
{
79+
return
80+
[
81+
new Elem()
82+
{
83+
CommonElem = new CommonElem
84+
{
85+
ServiceType = 48,
86+
PbElem = ProtoHelper.Serialize(MsgInfo ?? throw new ArgumentNullException(nameof(MsgInfo))),
87+
BusinessType = IsGroup ? 20u : 10u,
88+
}
89+
}
90+
];
91+
}
3792
}
3893

3994
internal override IMessageEntity? Parse(List<Elem> elements, Elem target)
4095
{
4196
if (target.CommonElem is { BusinessType: 10 or 20 } commonElem)
4297
{
43-
var msgInfo = ProtoHelper.Deserialize<MsgInfo>(commonElem.PbElem);
98+
var msgInfo = ProtoHelper.Deserialize<MsgInfo>(commonElem.PbElem.Span);
4499
var info = msgInfo.MsgInfoBody[0].Index.Info;
45100

46101
return new ImageEntity

Lagrange.Core/Message/Entities/RecordEntity.cs

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,30 @@ public class RecordEntity : RichMediaEntityBase
1212

1313
public uint RecordLength { get; set; }
1414

15-
public override Task Preprocess(BotContext context, BotMessage message)
15+
public RecordEntity() { }
16+
17+
public RecordEntity(Stream stream)
18+
{
19+
Stream = new Lazy<Stream>(() => stream);
20+
}
21+
22+
public override async Task Preprocess(BotContext context, BotMessage message)
1623
{
17-
throw new NotImplementedException();
24+
ArgumentNullException.ThrowIfNull(Stream);
25+
26+
IsGroup = message.IsGroup();
27+
NTV2RichMediaUploadEventResp result = IsGroup
28+
? await context.EventContext.SendEvent<RecordGroupUploadEventResp>(new RecordGroupUploadEventReq(message, this))
29+
: await context.EventContext.SendEvent<RecordUploadEventResp>(new RecordUploadEventReq(message, this));
30+
31+
_compat = result.Compat;
32+
MsgInfo = result.Info;
33+
34+
if (result.Ext != null)
35+
{
36+
await context.HighwayContext.UploadFile(Stream.Value, message.IsGroup() ? 1008 : 1007, ProtoHelper.Serialize(result.Ext));
37+
}
38+
await Stream.Value.DisposeAsync();
1839
}
1940

2041
public override async Task Postprocess(BotContext context, BotMessage message)
@@ -25,22 +46,30 @@ public override async Task Postprocess(BotContext context, BotMessage message)
2546

2647
FileUrl = result.Url;
2748
}
28-
29-
internal override Elem[] Build()
30-
{
31-
throw new NotImplementedException();
32-
}
49+
50+
internal override Elem[] Build() =>
51+
[
52+
new()
53+
{
54+
CommonElem = new CommonElem
55+
{
56+
ServiceType = 48,
57+
PbElem = ProtoHelper.Serialize(MsgInfo ?? throw new ArgumentNullException(nameof(MsgInfo))),
58+
BusinessType = IsGroup ? 22u : 12u,
59+
}
60+
}
61+
];
3362

3463
internal override IMessageEntity? Parse(List<Elem> elements, Elem target)
3564
{
3665
if (target.CommonElem is { BusinessType: 12 or 22 } commonElem)
3766
{
38-
var msgInfo = ProtoHelper.Deserialize<MsgInfo>(commonElem.PbElem);
67+
var msgInfo = ProtoHelper.Deserialize<MsgInfo>(commonElem.PbElem.Span);
3968
var info = msgInfo.MsgInfoBody[0].Index.Info;
4069

4170
return new RecordEntity
4271
{
43-
MsgInfo = msgInfo,
72+
MsgInfo = msgInfo,
4473
RecordLength = info.Time
4574
};
4675
}

Lagrange.Core/Message/Entities/RichMediaEntityBase.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ namespace Lagrange.Core.Message.Entities;
77
public abstract class RichMediaEntityBase : IMessageEntity
88
{
99
private MsgInfo? _msgInfo;
10+
11+
protected byte[]? _compat;
12+
13+
private protected bool IsGroup;
1014

1115
internal MsgInfo? MsgInfo
1216
{

0 commit comments

Comments
 (0)