initial real data rendering working

This commit is contained in:
William Casarin
2022-12-11 18:56:32 -08:00
parent 98adb82e56
commit e629402d11
2 changed files with 53 additions and 24 deletions

View File

@@ -1,5 +1,6 @@
use crate::{Error, Result}; use crate::{Error, Result};
use serde_derive::{Deserialize, Serialize}; use serde_derive::{Deserialize, Serialize};
use std::hash::{Hash, Hasher};
/// Event is the struct used to represent a Nostr event /// Event is the struct used to represent a Nostr event
#[derive(Serialize, Deserialize, Debug, Clone)] #[derive(Serialize, Deserialize, Debug, Clone)]
@@ -22,6 +23,13 @@ pub struct Event {
pub sig: String, pub sig: String,
} }
// Implement Hash trait
impl Hash for Event {
fn hash<H: Hasher>(&self, state: &mut H) {
self.id.hash(state);
}
}
impl PartialEq for Event { impl PartialEq for Event {
fn eq(&self, other: &Self) -> bool { fn eq(&self, other: &Self) -> bool {
self.id == other.id self.id == other.id

View File

@@ -1,13 +1,8 @@
//use egui::TextureFilter;
//use egui_android::SimpleApp;
use egui_extras::RetainedImage; use egui_extras::RetainedImage;
use enostr::{Filter, RelayEvent, RelayMessage};
//use nostr_rust::events::Event;
use poll_promise::Promise;
//use std::borrow::{Borrow, Cow};
use egui::Context; use egui::Context;
//use log::error; use enostr::{Filter, RelayEvent, RelayMessage};
use poll_promise::Promise;
use std::collections::HashMap; use std::collections::HashMap;
use std::hash::Hash; use std::hash::Hash;
use tracing::{debug, error, info, warn}; use tracing::{debug, error, info, warn};
@@ -38,7 +33,8 @@ pub struct Damus<'a> {
pool: RelayPool, pool: RelayPool,
events: Vec<Event>, all_events: HashMap<String, Event>,
events: Vec<String>,
img_cache: ImageCache<'a>, img_cache: ImageCache<'a>,
@@ -52,6 +48,7 @@ impl Default for Damus<'_> {
label: "Hello World!".to_owned(), label: "Hello World!".to_owned(),
state: DamusState::Initializing, state: DamusState::Initializing,
composing: false, composing: false,
all_events: HashMap::new(),
pool: RelayPool::default(), pool: RelayPool::default(),
events: vec![], events: vec![],
img_cache: HashMap::new(), img_cache: HashMap::new(),
@@ -93,11 +90,11 @@ fn try_process_event(damus: &mut Damus) {
let ev = m_ev.unwrap(); let ev = m_ev.unwrap();
let relay = ev.relay.to_owned(); let relay = ev.relay.to_owned();
match &ev.event { match ev.event {
RelayEvent::Opened => send_initial_filters(&mut damus.pool, &relay), RelayEvent::Opened => send_initial_filters(&mut damus.pool, &relay),
RelayEvent::Closed => warn!("{} connection closed", &relay), /* TODO: handle reconnects */ RelayEvent::Closed => warn!("{} connection closed", &relay), /* TODO: handle reconnects */
RelayEvent::Other(msg) => debug!("Other ws message: {:?}", msg), RelayEvent::Other(msg) => debug!("Other ws message: {:?}", msg),
RelayEvent::Message(msg) => process_message(damus, &msg), RelayEvent::Message(msg) => process_message(damus, &relay, msg),
} }
//info!("recv {:?}", ev) //info!("recv {:?}", ev)
} }
@@ -112,8 +109,23 @@ fn update_damus(damus: &mut Damus, ctx: &egui::Context) {
try_process_event(damus); try_process_event(damus);
} }
fn process_message(damus: &mut Damus, msg: &RelayMessage) { fn process_event(damus: &mut Damus, subid: &str, event: Event) {
info!("process message {:?}", msg); if damus.all_events.get(&event.id).is_some() {
return;
}
let cloned_id = event.id.clone();
damus.all_events.insert(cloned_id.clone(), event);
damus.events.push(cloned_id);
}
fn process_message(damus: &mut Damus, relay: &str, msg: RelayMessage) {
match msg {
RelayMessage::Event(subid, ev) => process_event(damus, &subid, ev),
RelayMessage::Notice(msg) => warn!("Notice from {}: {}", relay, msg),
RelayMessage::OK(cr) => info!("OK {:?}", cr),
RelayMessage::Eose(sid) => info!("EOSE {}", sid),
}
} }
fn render_damus(damus: &mut Damus, ctx: &Context) { fn render_damus(damus: &mut Damus, ctx: &Context) {
@@ -260,9 +272,11 @@ fn timeline_view(ui: &mut egui::Ui, app: &mut Damus<'_>) {
egui::ScrollArea::vertical() egui::ScrollArea::vertical()
.auto_shrink([false; 2]) .auto_shrink([false; 2])
.show(ui, |ui| { .show(ui, |ui| {
for ev in &app.events { for evid in &app.events {
render_event(ui, &mut app.img_cache, ev); if let Some(ev) = app.all_events.get(evid) {
ui.separator(); render_event(ui, &mut app.img_cache, ev);
ui.separator();
}
} }
}); });
} }
@@ -370,16 +384,23 @@ fn add_test_events(damus: &mut Damus<'_>) {
sig: "af02c971015995f79e07fa98aaf98adeeb6a56d0005e451ee4e78844cff712a6bc0f2109f72a878975f162dcefde4173b65ebd4c3d3ab3b520a9dcac6acf092d".to_string(), sig: "af02c971015995f79e07fa98aaf98adeeb6a56d0005e451ee4e78844cff712a6bc0f2109f72a878975f162dcefde4173b65ebd4c3d3ab3b520a9dcac6acf092d".to_string(),
}; };
damus
.all_events
.insert(test_event.id.clone(), test_event.clone());
damus
.all_events
.insert(test_event2.id.clone(), test_event2.clone());
if damus.events.len() == 0 { if damus.events.len() == 0 {
damus.events.push(test_event.clone()); damus.events.push(test_event.id.clone());
damus.events.push(test_event2.clone()); damus.events.push(test_event2.id.clone());
damus.events.push(test_event.clone()); damus.events.push(test_event.id.clone());
damus.events.push(test_event2.clone()); damus.events.push(test_event2.id.clone());
damus.events.push(test_event.clone()); damus.events.push(test_event.id.clone());
damus.events.push(test_event2.clone()); damus.events.push(test_event2.id.clone());
damus.events.push(test_event.clone()); damus.events.push(test_event.id.clone());
damus.events.push(test_event2.clone()); damus.events.push(test_event2.id.clone());
damus.events.push(test_event.clone()); damus.events.push(test_event.id.clone());
} }
} }