From b7d1fd9256e38c0d7c1687ee406b97198e743eff Mon Sep 17 00:00:00 2001 From: Giacomo Pasini <21265557+zeegomo@users.noreply.github.com> Date: Mon, 8 Jan 2024 15:40:19 +0100 Subject: [PATCH] Nomos chat fixes (#555) * Make chat messages unique Since DA will rightfully ignore duplicated messages, we need to add a nonce to make sure every message is unique, so that a user can send the same message twice. This nonce is randomly generated for simplicity. * Clear in_flight status upon error on chat app --- nomos-cli/Cargo.toml | 3 ++- nomos-cli/src/cmds/chat/mod.rs | 7 ++++-- nomos-cli/src/cmds/chat/ui.rs | 44 +++++++++++++++++++--------------- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/nomos-cli/Cargo.toml b/nomos-cli/Cargo.toml index e59135ae..8e7ebc7b 100644 --- a/nomos-cli/Cargo.toml +++ b/nomos-cli/Cargo.toml @@ -35,4 +35,5 @@ once_cell = "1" crossterm = "0.27" ratatui = "0.24" tui-input = "0.8" -ansi-to-tui = "3" \ No newline at end of file +ansi-to-tui = "3" +rand = "0.8" \ No newline at end of file diff --git a/nomos-cli/src/cmds/chat/mod.rs b/nomos-cli/src/cmds/chat/mod.rs index 7e6aa575..c89619e4 100644 --- a/nomos-cli/src/cmds/chat/mod.rs +++ b/nomos-cli/src/cmds/chat/mod.rs @@ -160,9 +160,8 @@ fn run_app(terminal: &mut Terminal, mut app: App) { terminal.draw(|f| ui::ui(f, &app)).unwrap(); if let Ok(update) = app.status_updates.try_recv() { - if let Status::Done = update { + if let Status::Done | Status::Err(_) = update { app.message_in_flight = false; - app.message_status = None; } app.message_status = Some(update); app.last_updated = Instant::now(); @@ -191,6 +190,7 @@ fn run_app(terminal: &mut Terminal, mut app: App) { wire::serialize(&ChatMessage { author: app.username.clone().unwrap(), message: app.input.value().into(), + _nonce: rand::random(), }) .unwrap() .into(), @@ -223,6 +223,9 @@ fn run_app(terminal: &mut Terminal, mut app: App) { struct ChatMessage { author: String, message: String, + // Since DA will rightfully ignore duplicated messages, we need to add a nonce to make sure + // every message is unique. This is randomly generated for simplicity. + _nonce: u64, } #[tokio::main] diff --git a/nomos-cli/src/cmds/chat/ui.rs b/nomos-cli/src/cmds/chat/ui.rs index fd8ee53e..63b3e86a 100644 --- a/nomos-cli/src/cmds/chat/ui.rs +++ b/nomos-cli/src/cmds/chat/ui.rs @@ -124,25 +124,31 @@ fn render_messages(f: &mut Frame, app: &App, rect: Rect) { let messages: Vec = app .messages .iter() - .map(|ChatMessage { author, message }| { - let content = if author == app.username.as_ref().unwrap() { - static MARGIN: usize = 2; - // pad to make it appear aligned on the right - let pad = " ".repeat( - (rect.width as usize) - .saturating_sub(message.len()) - .saturating_sub(MARGIN), - ); - Line::from(vec![Span::raw(pad), Span::raw(message)]) - } else { - Line::from(vec![ - Span::styled(format!("{author}: "), Style::new().fg(Color::Yellow).bold()), - Span::raw(message), - ]) - .alignment(Alignment::Left) - }; - ListItem::new(content) - }) + .map( + |ChatMessage { + author, + message, + _nonce, + }| { + let content = if author == app.username.as_ref().unwrap() { + static MARGIN: usize = 2; + // pad to make it appear aligned on the right + let pad = " ".repeat( + (rect.width as usize) + .saturating_sub(message.len()) + .saturating_sub(MARGIN), + ); + Line::from(vec![Span::raw(pad), Span::raw(message)]) + } else { + Line::from(vec![ + Span::styled(format!("{author}: "), Style::new().fg(Color::Yellow).bold()), + Span::raw(message), + ]) + .alignment(Alignment::Left) + }; + ListItem::new(content) + }, + ) .collect(); let messages = List::new(messages).block(Block::default().borders(Borders::ALL).title("Messages"));