This commit is contained in:
Mike Dilger 2023-01-03 18:37:25 +13:00
parent 3338010318
commit 35d2514c8a
7 changed files with 230 additions and 29 deletions

View File

@ -31,8 +31,7 @@ impl Minion {
tracing::debug!("{}: {}: NEW EVENT", &self.url, handle); tracing::debug!("{}: {}: NEW EVENT", &self.url, handle);
// Try processing everything immediately // Try processing everything immediately
crate::process::process_new_event(&event, true, Some(self.url.clone())) crate::process::process_new_event(&event, true, Some(self.url.clone())).await?;
.await?;
/* /*
if event.kind == EventKind::TextNote { if event.kind == EventKind::TextNote {
@ -48,7 +47,6 @@ impl Minion {
.await?; .await?;
} }
*/ */
} }
} }
RelayMessage::Notice(msg) => { RelayMessage::Notice(msg) => {

View File

@ -505,6 +505,11 @@ impl Overlord {
serde_json::from_str(&bus_message.json_payload)?; serde_json::from_str(&bus_message.json_payload)?;
self.post_reply(content, reply_to).await?; self.post_reply(content, reply_to).await?;
} }
"like" => {
let (id, pubkey): (Id, PublicKey) =
serde_json::from_str(&bus_message.json_payload)?;
self.post_like(id, pubkey).await?;
}
"process_incoming_events" => { "process_incoming_events" => {
// Clear new events // Clear new events
GLOBALS.event_is_new.write().await.clear(); GLOBALS.event_is_new.write().await.clear();
@ -852,4 +857,69 @@ impl Overlord {
Ok(()) Ok(())
} }
async fn post_like(&mut self, id: Id, pubkey: PublicKey) -> Result<(), Error> {
let event = {
let public_key = match GLOBALS.signer.read().await.public_key() {
Some(pk) => pk,
None => {
tracing::warn!("No public key! Not posting");
return Ok(());
}
};
let pre_event = PreEvent {
pubkey: public_key,
created_at: Unixtime::now().unwrap(),
kind: EventKind::Reaction,
tags: vec![
Tag::Event {
id,
recommended_relay_url: DbRelay::recommended_relay_for_reply(id).await?,
marker: None,
},
Tag::Pubkey {
pubkey,
recommended_relay_url: None,
petname: None,
},
],
content: "+".to_owned(),
ots: None,
};
let powint = GLOBALS.settings.read().await.pow;
let pow = if powint > 0 { Some(powint) } else { None };
GLOBALS.signer.read().await.sign_preevent(pre_event, pow)?
};
let relays: Vec<DbRelay> = GLOBALS
.relays
.read()
.await
.iter()
.filter_map(|(_, r)| if r.post { Some(r.to_owned()) } else { None })
.collect();
for relay in relays {
// Start a minion for it, if there is none
if !self.urls_watching.contains(&Url::new(&relay.url)) {
self.start_minion(relay.url.clone()).await?;
}
// Send it the event to post
tracing::debug!("Asking {} to post", &relay.url);
let _ = self.to_minions.send(BusMessage {
target: relay.url.clone(),
kind: "post_event".to_string(),
json_payload: serde_json::to_string(&event).unwrap(),
});
}
// Process the message for ourself
crate::process::process_new_event(&event, false, None).await?;
Ok(())
}
} }

View File

@ -2,7 +2,7 @@ use super::{GossipUi, Page};
use crate::comms::BusMessage; use crate::comms::BusMessage;
use crate::feed::FeedKind; use crate::feed::FeedKind;
use crate::globals::{Globals, GLOBALS}; use crate::globals::{Globals, GLOBALS};
use crate::ui::widgets::{CopyButton, ReplyButton}; use crate::ui::widgets::{CopyButton, LikeButton, ReplyButton};
use eframe::egui; use eframe::egui;
use egui::{ use egui::{
Align, Color32, Context, Frame, Image, Layout, RichText, ScrollArea, SelectableLabel, Sense, Align, Color32, Context, Frame, Image, Layout, RichText, ScrollArea, SelectableLabel, Sense,
@ -453,27 +453,6 @@ fn render_post_actual(
}); });
}); });
// Second row
ui.horizontal(|ui| {
for (ch, count) in reactions.iter() {
if *ch == '+' {
ui.label(
RichText::new(format!("{} {}", ch, count))
.strong()
.color(Color32::DARK_GREEN),
);
} else if *ch == '-' {
ui.label(
RichText::new(format!("{} {}", ch, count))
.strong()
.color(Color32::DARK_RED),
);
} else {
ui.label(RichText::new(format!("{} {}", ch, count)).strong());
}
}
});
render_content(ui, &event.content); render_content(ui, &event.content);
// Under row // Under row
@ -488,6 +467,29 @@ fn render_post_actual(
if ui.add(ReplyButton {}).clicked() { if ui.add(ReplyButton {}).clicked() {
app.replying_to = Some(event.id); app.replying_to = Some(event.id);
} }
ui.add_space(24.0);
if ui.add(LikeButton {}).clicked() {
let tx = GLOBALS.to_overlord.clone();
let _ = tx.send(BusMessage {
target: "overlord".to_string(),
kind: "like".to_string(),
json_payload: serde_json::to_string(&(&event.id, &event.pubkey))
.unwrap(),
});
}
for (ch, count) in reactions.iter() {
if *ch == '+' {
ui.label(format!("{}", count));
}
}
ui.add_space(12.0);
for (ch, count) in reactions.iter() {
if *ch != '+' {
ui.label(RichText::new(format!("{} {}", ch, count)).strong());
}
}
}); });
} }
}); });

View File

@ -74,8 +74,8 @@ impl Widget for CopyButton {
fn ui(self, ui: &mut Ui) -> Response { fn ui(self, ui: &mut Ui) -> Response {
let padding = ui.spacing().button_padding; let padding = ui.spacing().button_padding;
let space = Vec2 { let space = Vec2 {
x: 12.0 + padding.x * 2.0, x: 16.0 + padding.x * 2.0,
y: 12.0 + padding.y * 2.0, y: 16.0 + padding.y * 2.0,
}; };
let (id, rect) = ui.allocate_space(space); let (id, rect) = ui.allocate_space(space);
let response = ui.interact(rect, id, Sense::click()); let response = ui.interact(rect, id, Sense::click());

View File

@ -0,0 +1,128 @@
use eframe::{egui, epaint};
use egui::{Color32, Pos2, Response, Sense, Shape, Ui, Vec2, Widget};
use epaint::{PathShape, Stroke};
pub struct LikeButton {}
impl LikeButton {
fn paint(ui: &mut Ui, corner: Pos2) {
ui.painter().add(Shape::Path(PathShape {
points: vec![
Pos2 {
x: corner.x + 8.0,
y: corner.y + 16.0,
},
Pos2 {
x: corner.x + 9.0,
y: corner.y + 15.0,
},
Pos2 {
x: corner.x + 12.0,
y: corner.y + 13.0,
},
Pos2 {
x: corner.x + 15.0,
y: corner.y + 9.0,
},
Pos2 {
x: corner.x + 16.0,
y: corner.y + 6.0,
},
Pos2 {
x: corner.x + 16.0,
y: corner.y + 4.0,
},
Pos2 {
x: corner.x + 15.0,
y: corner.y + 2.0,
},
Pos2 {
x: corner.x + 13.0,
y: corner.y + 0.0,
},
Pos2 {
x: corner.x + 12.0,
y: corner.y + 0.0,
},
Pos2 {
x: corner.x + 10.0,
y: corner.y + 1.0,
},
Pos2 {
x: corner.x + 8.0,
y: corner.y + 3.0,
},
Pos2 {
x: corner.x + 6.0,
y: corner.y + 1.0,
},
Pos2 {
x: corner.x + 4.0,
y: corner.y + 0.0,
},
Pos2 {
x: corner.x + 3.0,
y: corner.y + 0.0,
},
Pos2 {
x: corner.x + 1.0,
y: corner.y + 2.0,
},
Pos2 {
x: corner.x + 0.0,
y: corner.y + 4.0,
},
Pos2 {
x: corner.x + 0.0,
y: corner.y + 6.0,
},
Pos2 {
x: corner.x + 1.0,
y: corner.y + 9.0,
},
Pos2 {
x: corner.x + 4.0,
y: corner.y + 13.0,
},
Pos2 {
x: corner.x + 7.0,
y: corner.y + 15.0,
},
Pos2 {
x: corner.x + 8.0,
y: corner.y + 16.0,
},
],
closed: true,
fill: Color32::TRANSPARENT,
stroke: Stroke {
width: 1.0,
color: Color32::from_rgb(0x8d, 0x7f, 0x73),
},
}));
}
}
impl Widget for LikeButton {
fn ui(self, ui: &mut Ui) -> Response {
let padding = ui.spacing().button_padding;
let space = Vec2 {
x: 16.0 + padding.x * 2.0,
y: 16.0 + padding.y * 2.0,
};
let (id, rect) = ui.allocate_space(space);
let response = ui.interact(rect, id, Sense::click());
let shift = if response.is_pointer_button_down_on() {
2.0
} else {
0.0
};
let pos = Pos2 {
x: rect.min.x + padding.x + shift,
y: rect.min.y + padding.y + shift,
};
Self::paint(ui, ui.painter().round_pos_to_pixels(pos));
response
}
}

View File

@ -3,3 +3,6 @@ pub use copy_button::CopyButton;
mod reply_button; mod reply_button;
pub use reply_button::ReplyButton; pub use reply_button::ReplyButton;
mod like_button;
pub use like_button::LikeButton;

View File

@ -71,8 +71,8 @@ impl Widget for ReplyButton {
fn ui(self, ui: &mut Ui) -> Response { fn ui(self, ui: &mut Ui) -> Response {
let padding = ui.spacing().button_padding; let padding = ui.spacing().button_padding;
let space = Vec2 { let space = Vec2 {
x: 12.0 + padding.x * 2.0, x: 16.0 + padding.x * 2.0,
y: 12.0 + padding.y * 2.0, y: 16.0 + padding.y * 2.0,
}; };
let (id, rect) = ui.allocate_space(space); let (id, rect) = ui.allocate_space(space);
let response = ui.interact(rect, id, Sense::click()); let response = ui.interact(rect, id, Sense::click());