This commit is contained in:
2026-08-06 14:52:43 +07:00
parent 6d5d154486
commit 0c6d700395
4 changed files with 23 additions and 27 deletions
-5
View File
@@ -104,13 +104,8 @@ impl NostrBackend {
/// event is immediately visible to [`NostrBackend::query`].
pub async fn send(&self, builder: EventBuilder) -> Result<Event> {
let event = builder.finalize_async(&self.signer).await?;
let output = self.client.send_event(&event).await?;
// Keep our own events in the local database; the notification pump
// only fires for events received from relays.
self.client.database().save_event(&event).await?;
if output.success.is_empty() && !output.failed.is_empty() {
let reasons = output
.failed
+2 -7
View File
@@ -7,7 +7,7 @@ use nostr_sdk::prelude::*;
pub struct Update {
pub kind: Kind,
/// First `a` tag value of the event, if any (e.g. the repository coordinate).
pub coordinate: Option<String>,
pub coordinate: Option<Coordinate>,
pub author: PublicKey,
pub event_id: EventId,
}
@@ -15,12 +15,7 @@ pub struct Update {
impl Update {
/// Build an update from a received event.
pub fn from_event(event: &Event) -> Self {
let coordinate = event
.tags
.iter()
.find(|t| t.kind() == "a")
.and_then(|t| t.content())
.map(str::to_owned);
let coordinate = event.tags.coordinates().nth(0);
Self {
kind: event.kind,
+16 -11
View File
@@ -9,7 +9,6 @@ use crate::backend::{Backend, BackendEvent};
/// their resolved statuses. Always derived from the local database.
pub struct RepoStore {
addr: RepoAddr,
addr_string: String,
pub announcement: Option<Announcement>,
/// `(refname, commit-id)` pairs from the latest state announcement.
pub refs: Vec<(String, String)>,
@@ -29,20 +28,27 @@ pub struct RepoStore {
impl RepoStore {
pub fn new(addr: RepoAddr, cx: &mut Context<Self>) -> Self {
let addr_string = addr.to_string();
let backend = Backend::global(cx);
let subscription = cx.subscribe(&Backend::global(cx), |this, _backend, event, cx| {
let subscription = cx.subscribe(&backend, |this, _backend, event, cx| {
let relevant = match event {
BackendEvent::NostrUpdate(update) => {
update.coordinate.as_deref() == Some(this.addr_string.as_str())
|| (update.kind == Kind::GitRepoAnnouncement
&& update.author == this.addr.owner)
let coordinate = update.coordinate.as_ref() == Some(&this.addr.coordinate());
let author = update.author == this.addr.owner;
let kind = update.kind == Kind::GitRepoAnnouncement;
coordinate || (author && kind)
}
BackendEvent::Published(event) => {
event.kind == Kind::GitRepoAnnouncement && event.pubkey == this.addr.owner
|| event.tags.iter().any(|t| {
t.kind() == "a" && t.content() == Some(this.addr_string.as_str())
})
let kind = event.kind == Kind::GitRepoAnnouncement;
let author = event.pubkey == this.addr.owner;
let coordinate = event
.tags
.coordinates()
.into_iter()
.any(|c| c == this.addr.coordinate());
coordinate || (kind && author)
}
_ => false,
};
@@ -54,7 +60,6 @@ impl RepoStore {
let mut store = Self {
addr,
addr_string,
announcement: None,
refs: Vec::new(),
head: None,
+5 -4
View File
@@ -21,15 +21,16 @@ impl RepoListStore {
/// Create a store. If `author` is `None`, all announcements are listed.
pub fn new(author: Option<PublicKey>, cx: &mut Context<Self>) -> Self {
let backend = Backend::global(cx);
let subscription = cx.subscribe(&backend, |this, _backend, event, cx| {
let git_kind = Kind::GitRepoAnnouncement;
let relevant = match event {
BackendEvent::NostrUpdate(update) => {
update.kind == Kind::GitRepoAnnouncement
&& this.author.is_none_or(|a| a == update.author)
update.kind == git_kind && this.author.is_none_or(|a| a == update.author)
}
BackendEvent::Published(event) => {
event.kind == Kind::GitRepoAnnouncement
&& this.author.is_none_or(|a| a == event.pubkey)
event.kind == git_kind && this.author.is_none_or(|a| a == event.pubkey)
}
BackendEvent::Synced | BackendEvent::SyncProgress { .. } => true,
_ => false,