This commit is contained in:
William Casarin
2022-11-06 20:54:30 -08:00
parent 46f9bde257
commit 28c5ddbc80
6 changed files with 91 additions and 336 deletions

312
Cargo.lock generated
View File

@@ -111,12 +111,6 @@ version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcb6dd1c2376d2e096796e234a70e17e94cc2d5d54ff8ce42b28cef1d0d359a4"
[[package]]
name = "bitcoin_hashes"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4"
[[package]]
name = "bitflags"
version = "1.3.2"
@@ -129,24 +123,6 @@ version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
[[package]]
name = "block-buffer"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
dependencies = [
"generic-array",
]
[[package]]
name = "block-buffer"
version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e"
dependencies = [
"generic-array",
]
[[package]]
name = "bumpalo"
version = "3.11.0"
@@ -361,15 +337,6 @@ dependencies = [
"libc",
]
[[package]]
name = "cpufeatures"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320"
dependencies = [
"libc",
]
[[package]]
name = "crc32fast"
version = "1.3.2"
@@ -451,16 +418,6 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
[[package]]
name = "crypto-common"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
dependencies = [
"generic-array",
"typenum",
]
[[package]]
name = "cty"
version = "0.2.2"
@@ -477,9 +434,10 @@ dependencies = [
"egui_extras",
"ehttp",
"image",
"nostr_rust",
"poll-promise",
"serde",
"serde_derive",
"serde_json",
"tracing-subscriber",
"tracing-wasm",
]
@@ -537,25 +495,6 @@ dependencies = [
"adler32",
]
[[package]]
name = "digest"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
dependencies = [
"generic-array",
]
[[package]]
name = "digest"
version = "0.10.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c"
dependencies = [
"block-buffer 0.10.3",
"crypto-common",
]
[[package]]
name = "directories-next"
version = "2.0.0"
@@ -917,16 +856,6 @@ version = "0.3.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9"
[[package]]
name = "generic-array"
version = "0.14.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9"
dependencies = [
"typenum",
"version_check",
]
[[package]]
name = "gethostname"
version = "0.2.3"
@@ -1066,29 +995,6 @@ dependencies = [
"libc",
]
[[package]]
name = "hex"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]]
name = "http"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399"
dependencies = [
"bytes",
"fnv",
"itoa",
]
[[package]]
name = "httparse"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
[[package]]
name = "ident_case"
version = "1.0.1"
@@ -1463,22 +1369,6 @@ dependencies = [
"minimal-lexical",
]
[[package]]
name = "nostr_rust"
version = "0.3.0"
source = "git+git://jb55.com/nostr_rust?rev=ccf7e521fe3bb9ca8f86516aef2c1f71db0213ed#ccf7e521fe3bb9ca8f86516aef2c1f71db0213ed"
dependencies = [
"hex",
"rand",
"secp256k1",
"serde",
"serde_derive",
"serde_json",
"sha256",
"tungstenite",
"url",
]
[[package]]
name = "num-integer"
version = "0.1.45"
@@ -1575,18 +1465,6 @@ version = "1.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "074864da206b4973b84eb91683020dbefd6a8c3f0f38e054d93954e891935e4e"
[[package]]
name = "opaque-debug"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
[[package]]
name = "openssl-probe"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
[[package]]
name = "osmesa-sys"
version = "0.1.2"
@@ -1693,12 +1571,6 @@ dependencies = [
"static_assertions",
]
[[package]]
name = "ppv-lite86"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[package]]
name = "proc-macro-crate"
version = "1.2.1"
@@ -1728,36 +1600,6 @@ dependencies = [
"proc-macro2",
]
[[package]]
name = "rand"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [
"libc",
"rand_chacha",
"rand_core",
]
[[package]]
name = "rand_chacha"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
"rand_core",
]
[[package]]
name = "rand_core"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
"getrandom",
]
[[package]]
name = "raw-window-handle"
version = "0.4.3"
@@ -1909,27 +1751,6 @@ dependencies = [
"webpki",
]
[[package]]
name = "rustls-native-certs"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50"
dependencies = [
"openssl-probe",
"rustls-pemfile",
"schannel",
"security-framework",
]
[[package]]
name = "rustls-pemfile"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0864aeff53f8c05aa08d86e5ef839d3dfcf07aeba2db32f12db0ef716e87bd55"
dependencies = [
"base64",
]
[[package]]
name = "rustybuzz"
version = "0.5.1"
@@ -1970,16 +1791,6 @@ dependencies = [
"winapi-util",
]
[[package]]
name = "schannel"
version = "0.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2"
dependencies = [
"lazy_static",
"windows-sys",
]
[[package]]
name = "scoped-tls"
version = "1.0.0"
@@ -2020,63 +1831,20 @@ dependencies = [
"tiny-skia 0.7.0",
]
[[package]]
name = "secp256k1"
version = "0.24.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff55dc09d460954e9ef2fa8a7ced735a964be9981fd50e870b2b3b0705e14964"
dependencies = [
"bitcoin_hashes",
"rand",
"secp256k1-sys",
]
[[package]]
name = "secp256k1-sys"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "83080e2c2fc1006e625be82e5d1eb6a43b7fd9578b617fcc55814daf286bba4b"
dependencies = [
"cc",
]
[[package]]
name = "security-framework"
version = "2.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c"
dependencies = [
"bitflags",
"core-foundation",
"core-foundation-sys",
"libc",
"security-framework-sys",
]
[[package]]
name = "security-framework-sys"
version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556"
dependencies = [
"core-foundation-sys",
"libc",
]
[[package]]
name = "serde"
version = "1.0.143"
version = "1.0.147"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53e8e5d5b70924f74ff5c6d64d9a5acd91422117c60f48c4e07855238a254553"
checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.143"
version = "1.0.147"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3d8e8de557aee63c26b85b947f5e59b690d0454c753f3adeb5cd7835ab88391"
checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852"
dependencies = [
"proc-macro2",
"quote",
@@ -2115,40 +1883,6 @@ dependencies = [
"pkg-config",
]
[[package]]
name = "sha-1"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f"
dependencies = [
"cfg-if",
"cpufeatures",
"digest 0.10.5",
]
[[package]]
name = "sha2"
version = "0.9.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800"
dependencies = [
"block-buffer 0.9.0",
"cfg-if",
"cpufeatures",
"digest 0.9.0",
"opaque-debug",
]
[[package]]
name = "sha256"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e334db67871c14c18fc066ad14af13f9fdf5f9a91c61af432d1e3a39c8c6a141"
dependencies = [
"hex",
"sha2",
]
[[package]]
name = "sharded-slab"
version = "0.1.4"
@@ -2483,34 +2217,6 @@ version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "375812fa44dab6df41c195cd2f7fecb488f6c09fbaafb62807488cefab642bff"
[[package]]
name = "tungstenite"
version = "0.17.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0"
dependencies = [
"base64",
"byteorder",
"bytes",
"http",
"httparse",
"log",
"rand",
"rustls",
"rustls-native-certs",
"sha-1",
"thiserror",
"url",
"utf-8",
"webpki",
]
[[package]]
name = "typenum"
version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987"
[[package]]
name = "unicode-bidi"
version = "0.3.8"
@@ -2623,12 +2329,6 @@ dependencies = [
"xmlwriter",
]
[[package]]
name = "utf-8"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
[[package]]
name = "valuable"
version = "0.1.0"

View File

@@ -12,11 +12,13 @@ rust-version = "1.60"
egui = "0.19.0"
eframe = { version = "0.19.0", features = ["persistence"] }
serde = { version = "1", features = ["derive"] } # You only need this if you want app persistence
nostr_rust = { git = "git://jb55.com/nostr_rust", rev = "ccf7e521fe3bb9ca8f86516aef2c1f71db0213ed" }
#nostr_rust = { git = "git://jb55.com/nostr_rust", rev = "ccf7e521fe3bb9ca8f86516aef2c1f71db0213ed" }
ehttp = "0.2.0"
image = { version = "0.24", features = ["jpeg", "png", "webp"] }
egui_extras = { version = "0.19.0", features = ["image", "svg"] }
poll-promise = "0.2.0"
serde_json = { version = "1", default-features = false, features = ["std"] }
serde_derive = "1"
# native:
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]

View File

@@ -1,10 +1,12 @@
use egui::{Align, Layout, RichText, WidgetText};
use egui_extras::RetainedImage;
use nostr_rust::events::Event;
//use nostr_rust::events::Event;
use poll_promise::Promise;
use std::borrow::{Borrow, Cow};
use std::collections::HashMap;
use crate::Event;
type ImageCache = HashMap<String, Promise<ehttp::Result<RetainedImage>>>;
/// We derive Deserialize/Serialize so we can persist app state on shutdown.
@@ -57,7 +59,7 @@ impl Damus {
fn parse_response(response: ehttp::Response) -> Result<RetainedImage, String> {
let content_type = response.content_type().unwrap_or_default();
if content_type.starts_with("image/svg+xml") {
if content_type.starts_with("image/svg") {
RetainedImage::from_svg_bytes(&response.url, &response.bytes)
} else if content_type.starts_with("image/") {
RetainedImage::from_image_bytes(&response.url, &response.bytes)
@@ -99,29 +101,46 @@ fn render_pfp(ctx: &egui::Context, img_cache: &mut ImageCache, ui: &mut egui::Ui
}
}
fn render_event(ctx: &egui::Context, img_cache: &mut ImageCache, ui: &mut egui::Ui, ev: &Event) {
render_pfp(
ctx,
img_cache,
ui,
//"https://damus.io/img/damus.svg".into(),
"http://cdn.jb55.com/img/red-me.jpg".into(),
);
ui.label(&ev.content);
fn render_username(ui: &mut egui::Ui, pk: &str) {
ui.horizontal(|ui| {
ui.spacing_mut().item_spacing.x = 0.0;
ui.label(&pk[0..8]);
ui.label(":");
ui.label(&pk[64 - 8..]);
});
}
fn render_events(ctx: &egui::Context, app: &mut Damus, ui: &mut egui::Ui) {
for ev in &app.events {
ui.spacing_mut().item_spacing.y = 10.0;
render_event(ctx, &mut app.img_cache, ui, ev);
}
fn render_event(ctx: &egui::Context, img_cache: &mut ImageCache, ui: &mut egui::Ui, ev: &Event) {
ui.with_layout(egui::Layout::left_to_right(egui::Align::TOP), |ui| {
let damus_pic = "https://damus.io/img/damus.svg".into();
let jb55_pic = "http://cdn.jb55.com/img/red-me.jpg".into();
let pic =
if ev.pub_key == "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245" {
jb55_pic
} else {
damus_pic
};
render_pfp(ctx, img_cache, ui, pic);
ui.with_layout(egui::Layout::top_down(egui::Align::LEFT), |ui| {
render_username(ui, &ev.pub_key);
ui.label(&ev.content);
})
});
}
fn timeline_view(ctx: &egui::Context, app: &mut Damus, ui: &mut egui::Ui) {
//let row_height = 100_f32;
//let total_rows = app.events.len();
ui.heading("Timeline");
egui::ScrollArea::vertical().show(ui, |ui| {
render_events(ctx, app, ui);
egui::ScrollArea::both().show(ui, |ui| {
for ev in &app.events {
ui.separator();
render_event(ctx, &mut app.img_cache, ui, ev);
}
});
/*
@@ -159,12 +178,8 @@ fn render_damus(ctx: &egui::Context, _frame: &mut eframe::Frame, app: &mut Damus
egui::CentralPanel::default().show(ctx, |ui| {
// The central panel the region left after adding TopPanel's and SidePanel's
ui.heading("eframe template");
ui.hyperlink("https://github.com/emilk/eframe_template");
ui.add(egui::github_link_file!(
"https://github.com/emilk/eframe_template/blob/master/",
"Source code."
));
ui.heading("Damus Desktop");
ui.hyperlink("https://damus.io");
egui::warn_if_debug_build(ui);
});
}
@@ -189,17 +204,30 @@ impl eframe::App for Damus {
created_at: 1667781968,
kind: 1,
tags: vec![],
content: "yello\nthere".to_string(),
content: "yello\nthere\nbeep\nboop\nyoink".to_string(),
sig: "af02c971015995f79e07fa98aaf98adeeb6a56d0005e451ee4e78844cff712a6bc0f2109f72a878975f162dcefde4173b65ebd4c3d3ab3b520a9dcac6acf092d".to_string(),
};
let test_event2 = Event {
id: "6938e3cd841f3111dbdbd909f87fd52c3d1f1e4a07fd121d1243196e532811cb".to_string(),
pub_key: "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245".to_string(),
created_at: 1667781968,
kind: 1,
tags: vec![],
content: "yo yo\nwhats up\nnotmuch".to_string(),
sig: "af02c971015995f79e07fa98aaf98adeeb6a56d0005e451ee4e78844cff712a6bc0f2109f72a878975f162dcefde4173b65ebd4c3d3ab3b520a9dcac6acf092d".to_string(),
};
if self.events.len() == 0 {
self.events.push(test_event.clone());
println!("{}", &self.events[0].content);
self.events.push(test_event2.clone());
self.events.push(test_event.clone());
println!("{}", &self.events[1].content);
self.events.push(test_event2.clone());
self.events.push(test_event.clone());
self.events.push(test_event2.clone());
self.events.push(test_event.clone());
self.events.push(test_event2.clone());
self.events.push(test_event.clone());
println!("{}", &self.events[2].content);
}
render_damus(ctx, _frame, self);

23
src/event.rs Normal file
View File

@@ -0,0 +1,23 @@
use serde_derive::{Deserialize, Serialize};
use serde_json::json;
/// Event is the struct used to represent a Nostr event
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Event {
/// 32-bytes sha256 of the the serialized event data
pub id: String,
/// 32-bytes hex-encoded public key of the event creator
#[serde(rename = "pubkey")]
pub pub_key: String,
/// unix timestamp in seconds
pub created_at: u64,
/// integer
/// 0: NostrEvent
pub kind: u8,
/// Tags
pub tags: Vec<Vec<String>>,
/// arbitrary string
pub content: String,
/// 64-bytes signature of the sha256 hash of the serialized event data, which is the same as the "id" field
pub sig: String,
}

View File

@@ -1,4 +1,6 @@
#![warn(clippy::all, rust_2018_idioms)]
mod app;
mod event;
pub use app::Damus;
pub use event::Event;

View File

@@ -9,7 +9,7 @@ fn main() {
let native_options = eframe::NativeOptions::default();
eframe::run_native(
"eframe template",
"Damus Desktop",
native_options,
Box::new(|cc| Box::new(damus::Damus::new(cc))),
);