diff --git a/src/lib.rs b/src/lib.rs index 49c5457..16406c4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,3 @@ -use crate::app::ZapStreamApp; -use eframe::Renderer; -use egui::Vec2; pub mod app; mod link; diff --git a/src/link.rs b/src/link.rs index 1673dd3..12603d3 100644 --- a/src/link.rs +++ b/src/link.rs @@ -71,15 +71,15 @@ impl NostrLink { .to_string(), ), kind: Some(note.kind()), - author: Some(note.pubkey().clone()), + author: Some(*note.pubkey()), relays: vec![], } } else { Self { hrp: NostrLinkType::Event, - id: IdOrStr::Id(note.id().clone()), + id: IdOrStr::Id(*note.id()), kind: Some(note.kind()), - author: Some(note.pubkey().clone()), + author: Some(*note.pubkey()), relays: vec![], } } diff --git a/src/note_store.rs b/src/note_store.rs index ff98785..c483027 100644 --- a/src/note_store.rs +++ b/src/note_store.rs @@ -1,6 +1,5 @@ use crate::link::NostrLink; use nostrdb::Note; -use std::borrow::Borrow; use std::collections::HashMap; pub struct NoteStore<'a> { diff --git a/src/note_util.rs b/src/note_util.rs index ce1f974..264c670 100644 --- a/src/note_util.rs +++ b/src/note_util.rs @@ -1,6 +1,5 @@ use nostr_sdk::util::hex; use nostrdb::{NdbStr, Note, Tag}; -use std::fmt::Display; pub trait NoteUtil { fn id_hex(&self) -> String; diff --git a/src/route/home.rs b/src/route/home.rs index a73dd43..c5fd8de 100644 --- a/src/route/home.rs +++ b/src/route/home.rs @@ -37,13 +37,13 @@ impl NostrWidget for HomePage { .events .iter() .map(|n| services.ndb.get_note_by_key(services.tx, NoteKey::new(n.0))) - .map_while(|f| f.map_or(None, |f| Some(f))) + .map_while(|f| f.ok()) .collect(); let events = NoteStore::from_vec(events); ScrollArea::vertical() .show(ui, |ui| { - widgets::StreamList::new(&events, &services).ui(ui) + widgets::StreamList::new(&events, services).ui(ui) }).inner } } diff --git a/src/route/mod.rs b/src/route/mod.rs index 406f8fe..7465fee 100644 --- a/src/route/mod.rs +++ b/src/route/mod.rs @@ -1,20 +1,16 @@ use crate::link::NostrLink; use crate::note_util::OwnedNote; -use crate::route; use crate::route::home::HomePage; use crate::route::login::LoginPage; use crate::route::stream::StreamPage; use crate::services::image_cache::ImageCache; use crate::services::ndb_wrapper::NDBWrapper; -use crate::widgets::{Header, NostrWidget, StreamList}; -use egui::{Context, Response, ScrollArea, Ui, Widget}; +use crate::widgets::{Header, NostrWidget}; +use egui::{Context, Response, Ui}; use egui_inbox::{UiInbox, UiInboxSender}; -use egui_video::{Player, PlayerState}; use log::{info, warn}; -use nostr_sdk::nips::nip01; -use nostr_sdk::{Client, Kind, PublicKey}; -use nostrdb::{Filter, Ndb, Note, Transaction}; -use std::borrow::Borrow; +use nostr_sdk::Client; +use nostrdb::{Ndb, Transaction}; use std::path::PathBuf; mod home; @@ -93,11 +89,11 @@ impl Router { let tx = self.ndb.start_transaction(); // handle app state changes - let mut q = self.router.read(ui); - while let Some(r) = q.next() { + let q = self.router.read(ui); + for r in q { if let Routes::Action(a) = &r { match a { - RouteAction::LoginPubkey(k) => self.login = Some(k.clone()), + RouteAction::LoginPubkey(k) => self.login = Some(*k), _ => info!("Not implemented"), } } else { diff --git a/src/route/stream.rs b/src/route/stream.rs index b57073d..f642910 100644 --- a/src/route/stream.rs +++ b/src/route/stream.rs @@ -26,8 +26,7 @@ impl StreamPage { link, sub, event: events - .first() - .map_or(None, |n| Some(OwnedNote(n.note_key.as_u64()))), + .first().map(|n| OwnedNote(n.note_key.as_u64())), chat: None, player: None, new_msg: WriteChat::new(), @@ -45,8 +44,7 @@ impl NostrWidget for StreamPage { let event = if let Some(k) = &self.event { services .ndb - .get_note_by_key(services.tx, NoteKey::new(k.0)) - .map_or(None, |f| Some(f)) + .get_note_by_key(services.tx, NoteKey::new(k.0)).ok() } else { None }; @@ -65,7 +63,7 @@ impl NostrWidget for StreamPage { if self.chat.is_none() { let ok = OwnedNote(event.key().unwrap().as_u64()); - let chat = Chat::new(self.link.clone(), ok, &services.ndb, services.tx); + let chat = Chat::new(self.link.clone(), ok, services.ndb, services.tx); self.chat = Some(chat); } diff --git a/src/services/image_cache.rs b/src/services/image_cache.rs index 79850cb..bf3a481 100644 --- a/src/services/image_cache.rs +++ b/src/services/image_cache.rs @@ -1,11 +1,9 @@ use egui::Image; use log::{error, info}; use nostr_sdk::util::hex; -use sha2::digest::Update; use sha2::{Digest, Sha256}; use std::collections::HashSet; use std::fs; -use std::hash::Hash; use std::path::PathBuf; use std::sync::Arc; use tokio::sync::Mutex; @@ -45,7 +43,7 @@ impl ImageCache { { let u = url.into(); let path = self.find(&u); - if !path.exists() && u.len() > 0 { + if !path.exists() && !u.is_empty() { let path = path.clone(); let fl = self.fetch_lock.clone(); let ctx = self.ctx.clone(); diff --git a/src/services/ndb_wrapper.rs b/src/services/ndb_wrapper.rs index 11a52fe..22f2f3a 100644 --- a/src/services/ndb_wrapper.rs +++ b/src/services/ndb_wrapper.rs @@ -1,15 +1,12 @@ use crate::services::query::QueryManager; -use egui::CursorIcon::Default; -use log::{info, warn}; -use nostr_sdk::secp256k1::Context; +use log::warn; use nostr_sdk::{nostr, Client, JsonUtil, Kind, PublicKey, RelayPoolNotification}; use nostrdb::{ Error, Filter, Ndb, NdbProfile, Note, NoteKey, ProfileRecord, QueryResult, Subscription, Transaction, }; use std::collections::HashSet; -use std::sync::{Arc, Mutex, RwLock}; -use tokio::sync::mpsc::UnboundedSender; +use std::sync::Mutex; pub struct NDBWrapper { ctx: egui::Context, @@ -31,9 +28,9 @@ impl SubWrapper { } } -impl Into for &SubWrapper { - fn into(self) -> u64 { - self.subscription.id() +impl From<&SubWrapper> for u64 { + fn from(val: &SubWrapper) -> Self { + val.subscription.id() } } @@ -146,14 +143,12 @@ impl NDBWrapper { .map_or(None, |p| p.record().profile()); // TODO: fix this shit - if p.is_none() { - if self.profiles.lock().unwrap().insert(*pubkey) { - self.query_manager.queue_query("profile", &[ - nostr::Filter::new() - .kinds([Kind::Metadata]) - .authors([PublicKey::from_slice(pubkey).unwrap()]) - ]) - } + if p.is_none() && self.profiles.lock().unwrap().insert(*pubkey) { + self.query_manager.queue_query("profile", &[ + nostr::Filter::new() + .kinds([Kind::Metadata]) + .authors([PublicKey::from_slice(pubkey).unwrap()]) + ]) } let sub = None; (p, sub) diff --git a/src/services/query.rs b/src/services/query.rs index bba4a6e..b398345 100644 --- a/src/services/query.rs +++ b/src/services/query.rs @@ -4,10 +4,10 @@ use log::{error, info}; use nostr_sdk::prelude::StreamExt; use nostr_sdk::Kind::Metadata; use nostr_sdk::{Client, Filter, SubscribeAutoCloseOptions, SubscriptionId}; -use std::collections::{HashMap, HashSet, VecDeque}; +use std::collections::{HashMap, HashSet}; use std::sync::Arc; use std::time::Duration; -use tokio::sync::mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender}; +use tokio::sync::mpsc::{unbounded_channel, UnboundedSender}; use tokio::sync::RwLock; use tokio::task::JoinHandle; use uuid::Uuid; @@ -58,17 +58,14 @@ impl Query { /// Return next query batch pub fn next(&mut self) -> Option { let mut next: Vec = self.queue.drain().collect(); - if next.len() == 0 { + if next.is_empty() { return None; } let now = Utc::now(); let id = Uuid::new_v4(); // remove filters already sent - next = next - .into_iter() - .filter(|f| self.traces.len() == 0 || !self.traces.iter().all(|y| y.filters.iter().any(|z| z == f))) - .collect(); + next.retain(|f| self.traces.is_empty() || !self.traces.iter().all(|y| y.filters.iter().any(|z| z == f))); // force profile queries into single filter if next.iter().all(|f| if let Some(k) = &f.kinds { @@ -83,7 +80,7 @@ impl Query { } - if next.len() == 0 { + if next.is_empty() { return None; } Some(QueryTrace { @@ -157,10 +154,10 @@ where fn push_filters(qq: &mut HashMap, id: &str, filters: Vec) { if let Some(q) = qq.get_mut(id) { - q.add(filters.into()); + q.add(filters); } else { let mut q = Query::new(id); - q.add(filters.into()); + q.add(filters); qq.insert(id.to_string(), q); } } diff --git a/src/stream_info.rs b/src/stream_info.rs index 9a6b159..ddfae48 100644 --- a/src/stream_info.rs +++ b/src/stream_info.rs @@ -84,8 +84,7 @@ impl<'a> StreamInfo for Note<'a> { fn viewers(&self) -> Option { if let Some(s) = self.get_tag_value("current_participants") { - s.variant().str() - .map_or(None, |v| Some(v.parse::().unwrap_or(0))) + s.variant().str().map(|v| v.parse::().unwrap_or(0)) } else { None } diff --git a/src/widgets/avatar.rs b/src/widgets/avatar.rs index f011109..585993d 100644 --- a/src/widgets/avatar.rs +++ b/src/widgets/avatar.rs @@ -40,7 +40,7 @@ impl<'a> Avatar<'a> { pub fn pubkey(pk: &[u8; 32], svc: &'a RouteServices<'a>) -> Self { let (p, sub) = svc.ndb.fetch_profile(svc.tx, pk); Self { - image: p.and_then(|p| p.picture().and_then(|p| Some(svc.img_cache.load(p)))), + image: p.and_then(|p| p.picture().map(|p| svc.img_cache.load(p))), sub, size: None, } diff --git a/src/widgets/chat.rs b/src/widgets/chat.rs index 4796cf6..210494e 100644 --- a/src/widgets/chat.rs +++ b/src/widgets/chat.rs @@ -50,8 +50,7 @@ impl NostrWidget for Chat { .map_while(|n| { services .ndb - .get_note_by_key(services.tx, NoteKey::new(n.0)) - .map_or(None, |n| Some(n)) + .get_note_by_key(services.tx, NoteKey::new(n.0)).ok() }) .collect(); @@ -70,7 +69,7 @@ impl NostrWidget for Chat { for ev in events.iter().sorted_by(|a, b| { a.starts().cmp(&b.starts()) }) { - ChatMessage::new(&stream, &ev, services).ui(ui); + ChatMessage::new(&stream, ev, services).ui(ui); } }) }).response diff --git a/src/widgets/header.rs b/src/widgets/header.rs index fddf8c2..2b0f66b 100644 --- a/src/widgets/header.rs +++ b/src/widgets/header.rs @@ -37,13 +37,11 @@ impl NostrWidget for Header { ui.with_layout(Layout::right_to_left(Align::Center), |ui| { if let Some(pk) = services.login { ui.add(Avatar::pubkey(pk, services)); - } else { - if Button::new() - .show(ui, |ui| { - ui.label("Login") - }).clicked() { - services.navigate(Routes::LoginPage); - } + } else if Button::new() + .show(ui, |ui| { + ui.label("Login") + }).clicked() { + services.navigate(Routes::LoginPage); } }); }, diff --git a/src/widgets/stream_player.rs b/src/widgets/stream_player.rs index 2568058..ea70535 100644 --- a/src/widgets/stream_player.rs +++ b/src/widgets/stream_player.rs @@ -27,7 +27,7 @@ impl Widget for &mut StreamPlayer { let h = w / 16. * 9.; let size = Vec2::new(w, h); - if let Some(mut p) = self.player.as_mut() { + if let Some(p) = self.player.as_mut() { p.ui(ui, size) } else { VideoPlaceholder.ui(ui) diff --git a/src/widgets/stream_tile.rs b/src/widgets/stream_tile.rs index 3f743bd..5dd43f7 100644 --- a/src/widgets/stream_tile.rs +++ b/src/widgets/stream_tile.rs @@ -86,7 +86,7 @@ impl Widget for StreamEvent<'_> { let response = response.on_hover_and_drag_cursor(CursorIcon::PointingHand); if response.clicked() { self.services.navigate(Routes::EventPage { - link: NostrLink::from_note(&self.event), + link: NostrLink::from_note(self.event), event: None, }); } diff --git a/src/widgets/stream_title.rs b/src/widgets/stream_title.rs index 5a3ec19..7aa18d4 100644 --- a/src/widgets/stream_title.rs +++ b/src/widgets/stream_title.rs @@ -32,7 +32,7 @@ impl<'a> NostrWidget for StreamTitle<'a> { .size(32.) .ui(ui); - if let Some(summary) = self.event.get_tag_value("summary").map_or(None, |r| r.variant().str()) { + if let Some(summary) = self.event.get_tag_value("summary").and_then(|r| r.variant().str()) { let summary = RichText::new(summary) .color(Color32::WHITE); ui.add(Label::new(summary).wrap_mode(TextWrapMode::Truncate)); diff --git a/src/widgets/write_chat.rs b/src/widgets/write_chat.rs index ff6bf9d..20db7f0 100644 --- a/src/widgets/write_chat.rs +++ b/src/widgets/write_chat.rs @@ -1,7 +1,7 @@ use crate::route::RouteServices; use crate::theme::NEUTRAL_900; use crate::widgets::NostrWidget; -use egui::{Button, Frame, Image, Margin, Rect, Response, Rounding, Sense, Shadow, Stroke, TextEdit, Ui, Vec2, Widget}; +use egui::{Frame, Image, Margin, Response, Rounding, Sense, Stroke, TextEdit, Ui, Widget}; use log::info; pub struct WriteChat {