notedeck/src/post.rs
William Casarin e9da25266a enable nip10 replies
you can now reply to notes

Signed-off-by: William Casarin <jb55@jb55.com>
2024-07-01 19:22:43 -07:00

88 lines
2.3 KiB
Rust

use nostrdb::{Note, NoteBuilder, NoteReply};
use std::collections::HashSet;
pub struct NewPost {
pub content: String,
pub account: usize,
}
impl NewPost {
pub fn to_note(&self, seckey: &[u8; 32]) -> Note {
NoteBuilder::new()
.kind(1)
.content(&self.content)
.sign(seckey)
.build()
.expect("note should be ok")
}
pub fn to_reply(&self, seckey: &[u8; 32], replying_to: &Note) -> Note {
let builder = NoteBuilder::new().kind(1).content(&self.content);
let nip10 = NoteReply::new(replying_to.tags());
let mut builder = if let Some(root) = nip10.root() {
builder
.start_tag()
.tag_str("e")
.tag_str(&hex::encode(root.id))
.tag_str("")
.tag_str("root")
.start_tag()
.tag_str("e")
.tag_str(&hex::encode(replying_to.id()))
.tag_str("")
.tag_str("reply")
.sign(seckey)
} else {
// we're replying to a post that isn't in a thread,
// just add a single reply-to-root tag
builder
.start_tag()
.tag_str("e")
.tag_str(&hex::encode(replying_to.id()))
.tag_str("")
.tag_str("root")
.sign(seckey)
};
let mut seen_p: HashSet<&[u8; 32]> = HashSet::new();
builder = builder
.start_tag()
.tag_str("p")
.tag_str(&hex::encode(replying_to.pubkey()));
seen_p.insert(replying_to.pubkey());
for tag in replying_to.tags() {
if tag.count() < 2 {
continue;
}
if tag.get_unchecked(0).variant().str() != Some("p") {
continue;
}
let id = if let Some(id) = tag.get_unchecked(1).variant().id() {
id
} else {
continue;
};
if seen_p.contains(id) {
continue;
}
seen_p.insert(id);
builder = builder.start_tag().tag_str("p").tag_str(&hex::encode(id));
}
builder
.sign(seckey)
.build()
.expect("expected build to work")
}
}