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