Insert euph messages into vault

This commit is contained in:
Joscha 2022-06-24 00:20:34 +02:00
parent d6821881f3
commit 72b531d216
2 changed files with 45 additions and 30 deletions

View file

@ -7,8 +7,11 @@ use tokio::sync::{mpsc, oneshot};
use tokio::{select, task, time}; use tokio::{select, task, time};
use tokio_tungstenite::tungstenite; use tokio_tungstenite::tungstenite;
use crate::ui::UiEvent;
use crate::vault::EuphVault;
use super::api::Data; use super::api::Data;
use super::conn::{self, ConnRx, ConnTx, Status, WsStream}; use super::conn::{self, ConnRx, ConnTx, Status};
#[derive(Debug, thiserror::Error)] #[derive(Debug, thiserror::Error)]
pub enum Error { pub enum Error {
@ -27,25 +30,23 @@ enum Event {
#[derive(Debug)] #[derive(Debug)]
struct State { struct State {
name: String, name: String,
vault: EuphVault,
ui_event_tx: mpsc::UnboundedSender<UiEvent>,
conn_tx: Option<ConnTx>, conn_tx: Option<ConnTx>,
} }
impl State { impl State {
async fn run( async fn run(
name: String, mut self,
canary: oneshot::Receiver<Infallible>, canary: oneshot::Receiver<Infallible>,
event_tx: mpsc::UnboundedSender<Event>, event_tx: mpsc::UnboundedSender<Event>,
mut event_rx: mpsc::UnboundedReceiver<Event>, mut event_rx: mpsc::UnboundedReceiver<Event>,
) { ) {
let mut state = Self { let name = self.name.clone();
name: name.clone(),
conn_tx: None,
};
let result = select! { let result = select! {
_ = canary => Ok(()), _ = canary => Ok(()),
_ = Self::reconnect(&name, &event_tx) => Ok(()), _ = Self::reconnect(&name, &event_tx) => Ok(()),
e = state.handle_events(&mut event_rx) => e, e = self.handle_events(&mut event_rx) => e,
}; };
if let Err(e) = result { if let Err(e) = result {
@ -106,42 +107,43 @@ impl State {
error!("e&{}: auth not implemented", self.name); error!("e&{}: auth not implemented", self.name);
bail!("auth not implemented"); bail!("auth not implemented");
} }
Data::DisconnectEvent(e) => { Data::DisconnectEvent(d) => {
warn!("e&{}: disconnected for reason {:?}", self.name, e.reason); warn!("e&{}: disconnected for reason {:?}", self.name, d.reason);
} }
Data::HelloEvent(_) => {} Data::HelloEvent(_) => {}
Data::JoinEvent(e) => { Data::JoinEvent(d) => {
info!("e&{}: {:?} joined", self.name, e.0.name); info!("e&{}: {:?} joined", self.name, d.0.name);
} }
Data::LoginEvent(_) => {} Data::LoginEvent(_) => {}
Data::LogoutEvent(_) => {} Data::LogoutEvent(_) => {}
Data::NetworkEvent(e) => { Data::NetworkEvent(d) => {
info!("e&{}: network event ({})", self.name, e.r#type); info!("e&{}: network event ({})", self.name, d.r#type);
} }
Data::NickEvent(e) => { Data::NickEvent(d) => {
info!("e&{}: {:?} renamed to {:?}", self.name, e.from, e.to); info!("e&{}: {:?} renamed to {:?}", self.name, d.from, d.to);
} }
Data::EditMessageEvent(_) => { Data::EditMessageEvent(_) => {
info!("e&{}: a message was edited", self.name); info!("e&{}: a message was edited", self.name);
} }
Data::PartEvent(e) => { Data::PartEvent(d) => {
info!("e&{}: {:?} left", self.name, e.0.name); info!("e&{}: {:?} left", self.name, d.0.name);
} }
Data::PingEvent(_) => {} Data::PingEvent(_) => {}
Data::PmInitiateEvent(e) => { Data::PmInitiateEvent(d) => {
info!( info!(
"e&{}: {:?} initiated a pm from &{}", "e&{}: {:?} initiated a pm from &{}",
self.name, e.from_nick, e.from_room self.name, d.from_nick, d.from_room
); );
} }
Data::SendEvent(_) => {} Data::SendEvent(_) => {}
Data::SnapshotEvent(e) => { Data::SnapshotEvent(d) => {
info!("e&{}: successfully joined", self.name); info!("e&{}: successfully joined", self.name);
if let Some(nick) = e.nick { self.vault.add_messages(d.log, None);
info!("e&{}: using nick {nick:?}", self.name); let _ = self.ui_event_tx.send(UiEvent::Redraw);
} else { }
info!("e&{}: no nick set", self.name); Data::LogReply(d) => {
} self.vault.add_messages(d.log, d.before);
let _ = self.ui_event_tx.send(UiEvent::Redraw);
} }
_ => {} _ => {}
} }
@ -166,11 +168,22 @@ pub struct Room {
} }
impl Room { impl Room {
pub fn new(name: String) -> Self { pub fn new(
name: String,
vault: EuphVault,
ui_event_tx: mpsc::UnboundedSender<UiEvent>,
) -> Self {
let (canary_tx, canary_rx) = oneshot::channel(); let (canary_tx, canary_rx) = oneshot::channel();
let (event_tx, event_rx) = mpsc::unbounded_channel(); let (event_tx, event_rx) = mpsc::unbounded_channel();
task::spawn(State::run(name, canary_rx, event_tx.clone(), event_rx)); let state = State {
name,
vault,
ui_event_tx,
conn_tx: None,
};
task::spawn(state.run(canary_rx, event_tx.clone(), event_rx));
Self { Self {
canary: canary_tx, canary: canary_tx,

View file

@ -60,7 +60,9 @@ impl Ui {
Self::poll_crossterm_events(event_tx_clone, weak_crossterm_lock) Self::poll_crossterm_events(event_tx_clone, weak_crossterm_lock)
}); });
let chat = Chat::new(vault.euph("test".to_string())); let room_vault = vault.euph("test".to_string());
let chat = Chat::new(room_vault.clone());
let room = euph::Room::new("test".to_string(), room_vault, event_tx.clone());
// Run main UI. // Run main UI.
// //
@ -75,7 +77,7 @@ impl Ui {
event_tx: event_tx.clone(), event_tx: event_tx.clone(),
vault, vault,
visible: Visible::Log, visible: Visible::Log,
room: euph::Room::new("test".to_string()), room,
chat, chat,
log_chat: Chat::new(logger), log_chat: Chat::new(logger),
}; };