Skip to content

Commit 4b43134

Browse files
committed
[Core] Highway Stage 2 - NTV2RichMedia
1 parent 32359d7 commit 4b43134

8 files changed

Lines changed: 527 additions & 36 deletions

File tree

Lagrange.Core/Internal/Context/HighwayContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public void OnSocketError(Exception e, ReadOnlyMemory<byte> data = default)
7575
_context.LogError(Tag, $"Highway Socket error: {e.Message}");
7676
}
7777

78-
public async Task<bool> UploadFile(Stream stream, int commandId, byte[] extendInfo)
78+
public async Task<bool> UploadFile(Stream stream, int commandId, ReadOnlyMemory<byte> extendInfo)
7979
{
8080
if (_ticket == null || _url == null || DateTime.Now - _ticket.Value.Item2 > TimeSpan.FromDays(0.5))
8181
{
Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,63 @@
1-
namespace Lagrange.Core.Internal.Events.Message;
1+
using Lagrange.Core.Internal.Packets.Service;
2+
using Lagrange.Core.Message;
3+
using Lagrange.Core.Message.Entities;
4+
5+
namespace Lagrange.Core.Internal.Events.Message;
6+
7+
internal class NTV2RichMediaUploadEventReq(BotMessage message, RichMediaEntityBase entity) : ProtocolEvent
8+
{
9+
public BotMessage Message { get; } = message;
10+
11+
public RichMediaEntityBase Entity { get; } = entity;
12+
}
13+
14+
internal class NTV2RichMediaUploadEventResp(MsgInfo info, byte[] compat, NTV2RichMediaHighwayExt? ext) : ProtocolEvent
15+
{
16+
public MsgInfo Info { get; } = info;
17+
18+
public byte[] Compat { get; } = compat;
19+
20+
public NTV2RichMediaHighwayExt? Ext { get; } = ext;
21+
}
22+
23+
internal class ImageUploadEventReq(BotMessage message, RichMediaEntityBase entity)
24+
: NTV2RichMediaUploadEventReq(message, entity);
25+
26+
internal class ImageUploadEventResp(MsgInfo info, byte[] compat, NTV2RichMediaHighwayExt? ext)
27+
: NTV2RichMediaUploadEventResp(info, compat, ext);
28+
29+
internal class ImageGroupUploadEventReq(BotMessage message, RichMediaEntityBase entity)
30+
: NTV2RichMediaUploadEventReq(message, entity);
31+
32+
internal class ImageGroupUploadEventResp(MsgInfo info, byte[] compat, NTV2RichMediaHighwayExt? ext)
33+
: NTV2RichMediaUploadEventResp(info, compat, ext);
34+
35+
internal class RecordUploadEventReq(BotMessage message, RichMediaEntityBase entity)
36+
: NTV2RichMediaUploadEventReq(message, entity);
37+
38+
internal class RecordUploadEventResp(MsgInfo info, byte[] compat, NTV2RichMediaHighwayExt? ext)
39+
: NTV2RichMediaUploadEventResp(info, compat, ext);
40+
41+
internal class RecordGroupUploadEventReq(BotMessage message, RichMediaEntityBase entity)
42+
: NTV2RichMediaUploadEventReq(message, entity);
43+
44+
internal class RecordGroupUploadEventResp(MsgInfo info, byte[] compat, NTV2RichMediaHighwayExt? ext)
45+
: NTV2RichMediaUploadEventResp(info, compat, ext);
46+
47+
internal class VideoUploadEventReq(BotMessage message, RichMediaEntityBase entity)
48+
: NTV2RichMediaUploadEventReq(message, entity);
49+
50+
internal class VideoUploadEventResp(MsgInfo info, byte[] compat, NTV2RichMediaHighwayExt? ext, NTV2RichMediaHighwayExt? subExt)
51+
: NTV2RichMediaUploadEventResp(info, compat, ext)
52+
{
53+
public NTV2RichMediaHighwayExt? SubExt { get; } = subExt;
54+
}
55+
56+
internal class VideoGroupUploadEventReq(BotMessage message, RichMediaEntityBase entity)
57+
: NTV2RichMediaUploadEventReq(message, entity);
58+
59+
internal class VideoGroupUploadEventResp(MsgInfo info, byte[] compat, NTV2RichMediaHighwayExt? ext, NTV2RichMediaHighwayExt? subExt)
60+
: NTV2RichMediaUploadEventResp(info, compat, ext)
61+
{
62+
public NTV2RichMediaHighwayExt? SubExt { get; } = subExt;
63+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ internal partial class ReqDataHighwayHead
1111

1212
[ProtoMember(2)] public SegHead MsgSegHead { get; set; }
1313

14-
[ProtoMember(3)] public byte[] BytesReqExtendInfo { get; set; }
14+
[ProtoMember(3)] public ReadOnlyMemory<byte> BytesReqExtendInfo { get; set; }
1515

1616
[ProtoMember(4)] public ulong Timestamp { get; set; }
1717

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

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,21 @@
11
using Lagrange.Core.Common.Entity;
22
using Lagrange.Core.Message;
33
using Lagrange.Core.Message.Entities;
4+
using Lagrange.Core.Utility;
45
using Lagrange.Core.Utility.Extension;
56

67
namespace Lagrange.Core.Internal.Packets.Service;
78

8-
internal class NTV2RichMedia
9+
internal static class NTV2RichMedia
910
{
1011
public static NTV2RichMediaReq BuildDownloadReq(BotMessage @struct, RichMediaEntityBase entity, DownloadExt ext)
1112
{
1213
if (entity.MsgInfo == null) throw new InvalidOperationException("MsgInfo is null");
13-
14+
1415
return new NTV2RichMediaReq
1516
{
1617
ReqHead = BuildHead(@struct, entity, 200),
17-
Download = new DownloadReq
18-
{
19-
Node = entity.MsgInfo.MsgInfoBody[0].Index,
20-
Download = ext
21-
}
18+
Download = new DownloadReq { Node = entity.MsgInfo.MsgInfoBody[0].Index, Download = ext }
2219
};
2320
}
2421

@@ -31,7 +28,7 @@ public static NTV2RichMediaReq BuildUploadReq(
3128

3229
return new NTV2RichMediaReq
3330
{
34-
ReqHead = BuildHead(@struct, entity, 201),
31+
ReqHead = BuildHead(@struct, entity, 100),
3532
Upload = new UploadReq
3633
{
3734
UploadInfo =
@@ -70,16 +67,9 @@ private static MultiMediaReqHead BuildHead(BotMessage @struct, RichMediaEntityBa
7067

7168
return new MultiMediaReqHead
7269
{
73-
Common = new CommonHead
74-
{
75-
RequestId = 1,
76-
Command = cmd
77-
},
70+
Common = new CommonHead { RequestId = 1, Command = cmd },
7871
Scene = BuildSceneInfo(@struct.Contact, request, business),
79-
Client = new ClientMeta
80-
{
81-
AgentType = 2
82-
}
72+
Client = new ClientMeta { AgentType = 2 }
8373
};
8474
}
8575

@@ -94,19 +84,12 @@ private static SceneInfo BuildSceneInfo(BotContact contact, uint requestType, ui
9484
if (contact is BotGroupMember member)
9585
{
9686
sceneInfo.SceneType = 2;
97-
sceneInfo.Group = new GroupInfo
98-
{
99-
GroupUin = member.Group.GroupUin,
100-
};
87+
sceneInfo.Group = new GroupInfo { GroupUin = member.Group.GroupUin, };
10188
}
10289
else
10390
{
10491
sceneInfo.SceneType = 1;
105-
sceneInfo.C2C = new C2CUserInfo
106-
{
107-
TargetUid = contact.Uid,
108-
AccountType = 2
109-
};
92+
sceneInfo.C2C = new C2CUserInfo { TargetUid = contact.Uid, AccountType = 2 };
11093
}
11194
return sceneInfo;
11295
}
@@ -127,17 +110,39 @@ private static FileInfo BuildFileInfo(RichMediaEntityBase entity)
127110

128111
switch (entity)
129112
{
130-
case ImageEntity image:
113+
case ImageEntity:
131114
{
115+
Span<byte> fileHead = stackalloc byte[10240];
116+
stream.Seek(0, SeekOrigin.Begin);
117+
_ = stream.Read(fileHead);
118+
stream.Seek(0, SeekOrigin.Begin);
119+
120+
var type = ImageHelper.Resolve(fileHead, out var size);
121+
info.Type = new FileType { Type = 2, PicFormat = (uint)type };
122+
info.Width = (uint)size.X;
123+
info.Height = (uint)size.Y;
132124
break;
133125
}
134-
case RecordEntity record:
126+
case RecordEntity:
135127
{
128+
var payload = GC.AllocateUninitializedArray<byte>((int)entity.Stream.Value.Length);
129+
stream.Seek(0, SeekOrigin.Begin);
130+
_ = stream.Read(payload);
131+
stream.Seek(0, SeekOrigin.Begin);
132+
133+
var type = AudioHelper.DetectAudio(payload);
134+
info.Type = new FileType { Type = 1, VoiceFormat = 1 };
135+
info.Time = type switch
136+
{
137+
AudioFormat.TenSilkV3 => (uint)AudioHelper.GetTenSilkTime(payload),
138+
AudioFormat.SilkV3 => (uint)AudioHelper.GetSilkTime(payload),
139+
_ => 0
140+
};
136141
break;
137142
}
138143
case VideoEntity video:
139144
{
140-
break;
145+
throw new NotImplementedException();
141146
}
142147
}
143148

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
using Lagrange.Proto;
2+
3+
#pragma warning disable CS8618
4+
5+
namespace Lagrange.Core.Internal.Packets.Service;
6+
7+
[ProtoPackable]
8+
internal partial class NTV2RichMediaHighwayExt
9+
{
10+
[ProtoMember(1)] public string FileUuid { get; set; }
11+
12+
[ProtoMember(2)] public string UKey { get; set; }
13+
14+
[ProtoMember(5)] public NTHighwayNetwork Network { get; set; }
15+
16+
[ProtoMember(6)] public List<MsgInfoBody> MsgInfoBody { get; set; }
17+
18+
[ProtoMember(10)] public uint BlockSize { get; set; }
19+
20+
[ProtoMember(11)] public NTHighwayHash Hash { get; set; }
21+
}
22+
23+
[ProtoPackable]
24+
internal partial class NTHighwayHash
25+
{
26+
[ProtoMember(1)] public List<byte[]> FileSha1 { get; set; }
27+
}
28+
29+
[ProtoPackable]
30+
internal partial class NTHighwayNetwork
31+
{
32+
[ProtoMember(1)] public List<NTHighwayIPv4> IPv4s { get; set; }
33+
}
34+
35+
36+
[ProtoPackable]
37+
internal partial class NTHighwayIPv4
38+
{
39+
[ProtoMember(1)] public NTHighwayDomain Domain { get; set; }
40+
41+
[ProtoMember(2)] public uint Port { get; set; }
42+
}
43+
44+
[ProtoPackable]
45+
internal partial class NTHighwayDomain
46+
{
47+
[ProtoMember(1)] public bool IsEnable { get; set; } // true
48+
49+
[ProtoMember(2)] public string IP { get; set; }
50+
}

0 commit comments

Comments
 (0)