Skip to content

Commit f4e5fe0

Browse files
committed
[Core] Changed the way of Disposing Streams
1 parent b0ea793 commit f4e5fe0

5 files changed

Lines changed: 100 additions & 68 deletions

File tree

Lagrange.Core/Message/Entities/ImageEntity.cs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,29 +19,37 @@ public class ImageEntity : RichMediaEntityBase
1919

2020
public ImageEntity() { }
2121

22-
public ImageEntity(Stream stream, string? summary = "[图片]", int subType = 0)
22+
public ImageEntity(Stream stream, string? summary = "[图片]", int subType = 0, bool disposeOnCompletion = false)
2323
{
2424
Stream = new Lazy<Stream>(() => stream);
2525
Summary = summary ?? "[图片]";
2626
SubType = subType;
27+
DisposeOnCompletion = disposeOnCompletion;
2728
}
2829

2930
public override async Task Preprocess(BotContext context, BotMessage message)
3031
{
3132
ArgumentNullException.ThrowIfNull(Stream);
3233

33-
IsGroup = message.IsGroup();
34-
NTV2RichMediaUploadEventResp result = IsGroup
35-
? await context.EventContext.SendEvent<ImageGroupUploadEventResp>(new ImageGroupUploadEventReq(message, this))
36-
: await context.EventContext.SendEvent<ImageUploadEventResp>(new ImageUploadEventReq(message, this));
34+
try
35+
{
36+
IsGroup = message.IsGroup();
37+
NTV2RichMediaUploadEventResp result = IsGroup
38+
? await context.EventContext.SendEvent<ImageGroupUploadEventResp>(new ImageGroupUploadEventReq(message, this))
39+
: await context.EventContext.SendEvent<ImageUploadEventResp>(new ImageUploadEventReq(message, this));
3740

38-
_compat = result.Compat;
39-
MsgInfo = result.Info;
41+
_compat = result.Compat;
42+
MsgInfo = result.Info;
4043

41-
if (result.Ext != null)
44+
if (result.Ext != null)
45+
{
46+
await context.HighwayContext.UploadFile(Stream.Value, message.IsGroup() ? 1004 : 1003, ProtoHelper.Serialize(result.Ext));
47+
}
48+
}
49+
finally
4250
{
43-
await context.HighwayContext.UploadFile(Stream.Value, message.IsGroup() ? 1004 : 1003, ProtoHelper.Serialize(result.Ext));
44-
}
51+
if (DisposeOnCompletion) await Stream.Value.DisposeAsync();
52+
}
4553
}
4654

4755
public override async Task Postprocess(BotContext context, BotMessage message)

Lagrange.Core/Message/Entities/RecordEntity.cs

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,27 +14,35 @@ public class RecordEntity : RichMediaEntityBase
1414

1515
public RecordEntity() { }
1616

17-
public RecordEntity(Stream stream)
17+
public RecordEntity(Stream stream, bool disposeOnCompletion = false)
1818
{
19-
Stream = new Lazy<Stream>(() => stream);
19+
Stream = new Lazy<Stream>(() => stream, disposeOnCompletion);
20+
DisposeOnCompletion = disposeOnCompletion;
2021
}
2122

2223
public override async Task Preprocess(BotContext context, BotMessage message)
2324
{
2425
ArgumentNullException.ThrowIfNull(Stream);
2526

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));
27+
try
28+
{
29+
IsGroup = message.IsGroup();
30+
NTV2RichMediaUploadEventResp result = IsGroup
31+
? await context.EventContext.SendEvent<RecordGroupUploadEventResp>(new RecordGroupUploadEventReq(message, this))
32+
: await context.EventContext.SendEvent<RecordUploadEventResp>(new RecordUploadEventReq(message, this));
3033

31-
_compat = result.Compat;
32-
MsgInfo = result.Info;
34+
_compat = result.Compat;
35+
MsgInfo = result.Info;
3336

34-
if (result.Ext != null)
37+
if (result.Ext != null)
38+
{
39+
await context.HighwayContext.UploadFile(Stream.Value, message.IsGroup() ? 1008 : 1007, ProtoHelper.Serialize(result.Ext));
40+
}
41+
}
42+
finally
3543
{
36-
await context.HighwayContext.UploadFile(Stream.Value, message.IsGroup() ? 1008 : 1007, ProtoHelper.Serialize(result.Ext));
37-
}
44+
if (DisposeOnCompletion) await Stream.Value.DisposeAsync();
45+
}
3846
}
3947

4048
public override async Task Postprocess(BotContext context, BotMessage message)

Lagrange.Core/Message/Entities/RichMediaEntityBase.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ private protected set
2929
}
3030
}
3131

32+
private protected bool DisposeOnCompletion;
33+
3234
internal abstract Lazy<Stream>? Stream { get; }
3335

3436
public string FileUuid { get; internal set; } = string.Empty;

Lagrange.Core/Message/Entities/VideoEntity.cs

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@ public class VideoEntity : RichMediaEntityBase
1919

2020
public VideoEntity() { }
2121

22-
public VideoEntity(Stream stream, Stream? thumbnailStream = null)
22+
public VideoEntity(Stream stream, Stream? thumbnailStream = null, bool disposeOnCompletion = false)
2323
{
2424
Stream = new Lazy<Stream>(() => stream);
2525
ThumbnailStream = new Lazy<Stream>(() => thumbnailStream ?? new MemoryStream(DefaultThumbnail));
26+
DisposeOnCompletion = disposeOnCompletion;
2627
}
2728

2829
public override async Task Preprocess(BotContext context, BotMessage message)
@@ -32,38 +33,51 @@ public override async Task Preprocess(BotContext context, BotMessage message)
3233

3334
ThumbnailEntity = new ImageEntity(ThumbnailStream.Value);
3435

35-
if (message.IsGroup())
36+
try
3637
{
37-
IsGroup = true;
38-
39-
var result = await context.EventContext.SendEvent<VideoGroupUploadEventResp>(new VideoGroupUploadEventReq(message, this));
40-
_compat = result.Compat;
41-
MsgInfo = result.Info;
42-
43-
if (result.Ext != null)
38+
if (message.IsGroup())
4439
{
45-
result.Ext.Hash.FileSha1 = CalculateStreamBytes(Stream.Value);
46-
await context.HighwayContext.UploadFile(Stream.Value, 1001, ProtoHelper.Serialize(result.Ext));
40+
IsGroup = true;
41+
42+
var result = await context.EventContext.SendEvent<VideoGroupUploadEventResp>(new VideoGroupUploadEventReq(message, this));
43+
_compat = result.Compat;
44+
MsgInfo = result.Info;
45+
46+
if (result.Ext != null)
47+
{
48+
result.Ext.Hash.FileSha1 = CalculateStreamBytes(Stream.Value);
49+
await context.HighwayContext.UploadFile(Stream.Value, 1001, ProtoHelper.Serialize(result.Ext));
50+
}
51+
52+
if (result.SubExt != null)
53+
{
54+
await context.HighwayContext.UploadFile(ThumbnailStream.Value, 1002, ProtoHelper.Serialize(result.SubExt));
55+
}
4756
}
48-
if (result.SubExt != null)
49-
{
50-
await context.HighwayContext.UploadFile(ThumbnailStream.Value, 1002, ProtoHelper.Serialize(result.SubExt));
57+
else
58+
{
59+
var result = await context.EventContext.SendEvent<VideoUploadEventResp>(new VideoUploadEventReq(message, this));
60+
_compat = result.Compat;
61+
MsgInfo = result.Info;
62+
63+
if (result.Ext != null)
64+
{
65+
result.Ext.Hash.FileSha1 = CalculateStreamBytes(Stream.Value);
66+
await context.HighwayContext.UploadFile(Stream.Value, 1005, ProtoHelper.Serialize(result.Ext));
67+
}
68+
69+
if (result.SubExt != null)
70+
{
71+
await context.HighwayContext.UploadFile(ThumbnailStream.Value, 1006, ProtoHelper.Serialize(result.SubExt));
72+
}
5173
}
5274
}
53-
else
75+
finally
5476
{
55-
var result = await context.EventContext.SendEvent<VideoUploadEventResp>(new VideoUploadEventReq(message, this));
56-
_compat = result.Compat;
57-
MsgInfo = result.Info;
58-
59-
if (result.Ext != null)
60-
{
61-
result.Ext.Hash.FileSha1 = CalculateStreamBytes(Stream.Value);
62-
await context.HighwayContext.UploadFile(Stream.Value, 1005, ProtoHelper.Serialize(result.Ext));
63-
}
64-
if (result.SubExt != null)
77+
if (DisposeOnCompletion)
6578
{
66-
await context.HighwayContext.UploadFile(ThumbnailStream.Value, 1006, ProtoHelper.Serialize(result.SubExt));
79+
await Stream.Value.DisposeAsync();
80+
await ThumbnailStream.Value.DisposeAsync();
6781
}
6882
}
6983
}

Lagrange.Core/Message/MessageBuilder.cs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -40,57 +40,57 @@ public MessageBuilder MultiMsg(string resId)
4040

4141
public MessageBuilder Image(string path, string? summary = "[图片]", int subType = 0)
4242
{
43-
using var fs = new FileStream(path, FileMode.Open, FileAccess.Read);
44-
return Image(fs, summary, subType);
43+
var fs = new FileStream(path, FileMode.Open, FileAccess.Read);
44+
return Image(fs, summary, subType, true);
4545
}
4646

4747
public MessageBuilder Image(byte[] image, string? summary = "[图片]", int subType = 0)
4848
{
49-
using var ms = new MemoryStream(image);
50-
return Image(ms, summary, subType);
49+
var ms = new MemoryStream(image);
50+
return Image(ms, summary, subType, true);
5151
}
5252

53-
public MessageBuilder Image(Stream stream, string? summary = "[图片]", int subType = 0)
53+
public MessageBuilder Image(Stream stream, string? summary = "[图片]", int subType = 0, bool disposeOnCompletion = false)
5454
{
55-
_entities.Add(new ImageEntity(stream, summary, subType));
55+
_entities.Add(new ImageEntity(stream, summary, subType, disposeOnCompletion));
5656
return this;
5757
}
5858

5959
public MessageBuilder Record(string path)
6060
{
61-
using var fs = new FileStream(path, FileMode.Open, FileAccess.Read);
62-
return Record(fs);
61+
var fs = new FileStream(path, FileMode.Open, FileAccess.Read);
62+
return Record(fs, true);
6363
}
6464

6565
public MessageBuilder Record(byte[] record)
6666
{
67-
using var ms = new MemoryStream(record);
68-
return Record(ms);
67+
var ms = new MemoryStream(record);
68+
return Record(ms, true);
6969
}
7070

71-
public MessageBuilder Record(Stream stream)
71+
public MessageBuilder Record(Stream stream, bool disposeOnCompletion = false)
7272
{
73-
_entities.Add(new RecordEntity(stream));
73+
_entities.Add(new RecordEntity(stream, disposeOnCompletion));
7474
return this;
7575
}
7676

7777
public MessageBuilder Video(string path, string? thumbnail)
78-
{
79-
using var videoFs = new FileStream(path, FileMode.Open, FileAccess.Read);
80-
using var thumbnailFs = thumbnail != null ? new FileStream(thumbnail, FileMode.Open, FileAccess.Read) : null;
81-
return Video(videoFs, thumbnailFs);
78+
{
79+
var videoFs = new FileStream(path, FileMode.Open, FileAccess.Read);
80+
var thumbnailFs = thumbnail != null ? new FileStream(thumbnail, FileMode.Open, FileAccess.Read) : null;
81+
return Video(videoFs, thumbnailFs, true);
8282
}
8383

8484
public MessageBuilder Video(byte[] video, byte[]? thumbnail)
8585
{
86-
using var videoStream = new MemoryStream(video);
87-
using var thumbnailStream = thumbnail != null ? new MemoryStream(thumbnail) : null;
88-
return Video(videoStream, thumbnailStream);
86+
var videoStream = new MemoryStream(video);
87+
var thumbnailStream = thumbnail != null ? new MemoryStream(thumbnail) : null;
88+
return Video(videoStream, thumbnailStream, true);
8989
}
9090

91-
public MessageBuilder Video(Stream video, Stream? thumbnail)
91+
public MessageBuilder Video(Stream video, Stream? thumbnail = null, bool disposeOnCompletion = false)
9292
{
93-
_entities.Add(new VideoEntity(video, thumbnail));
93+
_entities.Add(new VideoEntity(video, thumbnail, disposeOnCompletion));
9494
return this;
9595
}
9696

0 commit comments

Comments
 (0)