Skip to content
This repository was archived by the owner on Oct 12, 2025. It is now read-only.

Commit 225e1f0

Browse files
authored
[OneBot] Fix ForwardEntity cannot be serialized (#824)
1 parent e5db4df commit 225e1f0

File tree

3 files changed

+31
-6
lines changed

3 files changed

+31
-6
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using Lagrange.Core.Message;
2+
using Lagrange.Core.Message.Entity;
3+
using MessagePack;
4+
using MessagePack.Formatters;
5+
6+
namespace Lagrange.OneBot.Database;
7+
8+
public class MessageChainFormatter : IMessagePackFormatter<MessageChain?>
9+
{
10+
public MessageChain? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options)
11+
{
12+
return MessagePackSerializer.Deserialize<MessageRecord>(ref reader, options);
13+
}
14+
15+
public void Serialize(ref MessagePackWriter writer, MessageChain? value, MessagePackSerializerOptions options)
16+
{
17+
MessagePackSerializer.Serialize(ref writer, (MessageRecord?)value, options);
18+
}
19+
}

Lagrange.OneBot/Database/MessageEntityResolver.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,15 @@ namespace Lagrange.OneBot.Database;
66

77
public class MessageEntityResolver : IFormatterResolver
88
{
9-
private static readonly MessageEntityFormatter _FORMATTER = new();
9+
private static readonly MessageEntityFormatter ENTITY_FORMATTER = new();
10+
11+
private static readonly MessageChainFormatter CHAIN_FORMATTER = new();
1012

1113
public IMessagePackFormatter<T>? GetFormatter<T>()
1214
{
13-
if (typeof(T) == typeof(IMessageEntity)) return (IMessagePackFormatter<T>?)_FORMATTER;
15+
if (typeof(T) == typeof(IMessageEntity)) return (IMessagePackFormatter<T>)ENTITY_FORMATTER;
16+
17+
if (typeof(T) == typeof(MessageChain)) return (IMessagePackFormatter<T>)CHAIN_FORMATTER;
1418

1519
return null;
1620
}

Lagrange.OneBot/Database/MessageRecord.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ public partial class MessageRecord : IRealmObject
3030
{
3131
public static readonly MessagePackSerializerOptions OPTIONS = MessagePackSerializerOptions.Standard
3232
.WithResolver(CompositeResolver.Create(
33-
ContractlessStandardResolver.Instance,
34-
new MessageEntityResolver()
33+
new MessageEntityResolver(),
34+
ContractlessStandardResolver.Instance
3535
));
3636

3737
[PrimaryKey]
@@ -72,7 +72,7 @@ public static int CalcMessageHash(ulong msgId, uint seq)
7272
return ((ushort)seq << 16) | (ushort)msgId;
7373
}
7474

75-
public static implicit operator MessageRecord(MessageChain chain) => new()
75+
public static implicit operator MessageRecord?(MessageChain? chain) => chain == null ? null : new()
7676
{
7777
Id = CalcMessageHash(chain.MessageId, chain.Sequence),
7878
Type = chain.Type,
@@ -92,8 +92,10 @@ MessageType.Temp or
9292
Entities = MessagePackSerializer.Serialize<List<IMessageEntity>>(chain, OPTIONS)
9393
};
9494

95-
public static implicit operator MessageChain(MessageRecord record)
95+
public static implicit operator MessageChain?(MessageRecord? record)
9696
{
97+
if (record == null) return null;
98+
9799
var chain = record.Type switch
98100
{
99101
MessageType.Group => new MessageChain(

0 commit comments

Comments
 (0)