50 lines
1.8 KiB
C#
50 lines
1.8 KiB
C#
using System.Text.Json.Serialization;
|
|
using Lagrange.Core.Message;
|
|
using Lagrange.Core.Message.Entity;
|
|
using Lagrange.OneBot.Database;
|
|
|
|
namespace Lagrange.OneBot.Message.Entity;
|
|
|
|
[Serializable]
|
|
public partial class ReplySegment(uint messageId)
|
|
{
|
|
public ReplySegment() : this(0) { }
|
|
|
|
[JsonPropertyName("id")][CQProperty] public string MessageId { get; set; } = messageId.ToString();
|
|
}
|
|
|
|
[SegmentSubscriber(typeof(ForwardEntity), "reply")]
|
|
public partial class ReplySegment : SegmentBase
|
|
{
|
|
internal MessageChain? TargetChain { get; set; }
|
|
|
|
internal uint Sequence { get; private set; }
|
|
|
|
public override void Build(MessageBuilder builder, SegmentBase segment)
|
|
{
|
|
if (segment is ReplySegment reply && Database is not null)
|
|
{
|
|
var messageRecord = Database.GetCollection<MessageRecord>().FindById(int.Parse(reply.MessageId));
|
|
reply.TargetChain ??= (MessageChain)messageRecord;
|
|
|
|
var build = MessagePacker.Build(reply.TargetChain, "");
|
|
var virtualElem = build.Body?.RichText?.Elems;
|
|
if (virtualElem != null) reply.TargetChain.Elements.AddRange(virtualElem);
|
|
|
|
builder.Forward(reply.TargetChain);
|
|
}
|
|
}
|
|
|
|
public override SegmentBase FromEntity(MessageChain chain, IMessageEntity entity)
|
|
{
|
|
if (entity is not ForwardEntity forward || Database is null) throw new ArgumentException("The entity is not a forward entity.");
|
|
|
|
var collection = Database.GetCollection<MessageRecord>();
|
|
|
|
int hash = MessageRecord.CalcMessageHash(forward.MessageId, forward.Sequence);
|
|
var query = collection.FindById(hash);
|
|
return query == null
|
|
? new ReplySegment { MessageId = 0.ToString() }
|
|
: new ReplySegment { MessageId = query.MessageHash.ToString() };
|
|
}
|
|
} |