diff --git a/samples/FishyFlip.Firehose/Program.cs b/samples/FishyFlip.Firehose/Program.cs index 1641ea2f..866d09c0 100644 --- a/samples/FishyFlip.Firehose/Program.cs +++ b/samples/FishyFlip.Firehose/Program.cs @@ -62,6 +62,12 @@ async Task HandleMessageAsync(SubscribeRepoMessage message) // The path contains the post action and path, we need the path, so we split to get it. var url = $"https://bsky.app/profile/{did}/post/{message.Commit.Ops![0]!.Path!.Split("/").Last()}"; Console.WriteLine($"Post URL: {url}, from {repo.Handle}"); + + if (post.Reply is not null) + { + Console.WriteLine($"Reply Root: {post.Reply.Root.Uri}"); + Console.WriteLine($"Reply Parent: {post.Reply.Parent.Uri}"); + } } } } \ No newline at end of file diff --git a/src/FishyFlip/ATWebSocketProtocol.cs b/src/FishyFlip/ATWebSocketProtocol.cs index 8e1f31d4..998f746c 100644 --- a/src/FishyFlip/ATWebSocketProtocol.cs +++ b/src/FishyFlip/ATWebSocketProtocol.cs @@ -212,7 +212,7 @@ void HandleProgressStatus(CarProgressStatusEvent e) var blockObj = CBORObject.Read(blockStream); if (blockObj["$type"] is not null) { - message.Record = ATRecord.FromCBORObject(blockObj); + message.Record = ATRecord.FromCBORObject(blockObj, this.logger); } else if (blockObj["sig"] is not null) { diff --git a/src/FishyFlip/Models/ATRecord.cs b/src/FishyFlip/Models/ATRecord.cs index c7dd853b..746e2acb 100644 --- a/src/FishyFlip/Models/ATRecord.cs +++ b/src/FishyFlip/Models/ATRecord.cs @@ -40,6 +40,11 @@ public ATRecord() /// An AT Record if the conversion is successful; otherwise, null. public static ATRecord? FromCBORObject(CBORObject blockObj, ILogger? logger = default) { +#if DEBUG + var rawObj = blockObj.ToJSONString(); + logger?.LogDebug($"Raw Object: {rawObj}"); +#endif + if (blockObj["$type"] is not null) { switch (blockObj["$type"].AsString()) @@ -63,6 +68,7 @@ public ATRecord() case Constants.ActorTypes.Profile: return new Profile(blockObj); default: + logger?.LogDebug($"Unknown type: {blockObj["$type"].AsString()}"); return null; } } diff --git a/src/FishyFlip/Models/Post.cs b/src/FishyFlip/Models/Post.cs index f03785e2..76f21cdf 100644 --- a/src/FishyFlip/Models/Post.cs +++ b/src/FishyFlip/Models/Post.cs @@ -55,6 +55,7 @@ public Post(CBORObject obj) this.Text = obj["text"].AsString(); this.Langs = obj["langs"]?.Values.Select(n => n.AsString()).ToArray(); this.Facets = obj["facets"]?.Values.Select(n => new Facet(n)).ToArray(); + this.Reply = obj["reply"]?.IsNull ?? false ? null : obj["reply"].ToReply(); } /// diff --git a/src/FishyFlip/Tools/Cbor/CborExtensions.cs b/src/FishyFlip/Tools/Cbor/CborExtensions.cs index 7aa02542..3d2a916d 100644 --- a/src/FishyFlip/Tools/Cbor/CborExtensions.cs +++ b/src/FishyFlip/Tools/Cbor/CborExtensions.cs @@ -118,4 +118,28 @@ public static Embed ToEmbed(this CBORObject obj) return new UnknownEmbed(type); } + + /// + /// Cast CBOR to Reply. + /// + /// CBORObject. + /// Reply. + public static Reply? ToReply(this CBORObject? obj) + { + if (obj is null) + { + return null; + } + + var root = obj["root"]; + var parent = obj["parent"]; + if (root.IsNull || parent.IsNull) + { + return null; + } + + var rootRef = new ReplyRef(root["cid"].ToCid()!, ATUri.Create(root["uri"].AsString())); + var parentRef = new ReplyRef(parent["cid"].ToCid()!, ATUri.Create(parent["uri"].AsString())); + return new Reply(rootRef, parentRef); + } } \ No newline at end of file