refactor
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user