submodule对gitea不管用,所以直接拉了一份拉格兰
This commit is contained in:
50
Lagrange.Core/Lagrange.OneBot/Message/Entity/ReplySegment.cs
Normal file
50
Lagrange.Core/Lagrange.OneBot/Message/Entity/ReplySegment.cs
Normal file
@@ -0,0 +1,50 @@
|
||||
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() };
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user