From 0c2a5cb256a3a31996f409d2713392c717126935 Mon Sep 17 00:00:00 2001 From: MeexReay Date: Mon, 14 Apr 2025 00:57:55 +0300 Subject: [PATCH] fix errors printing and some other fixes --- src/chat.rs | 13 +++++++++---- src/chat/minimal_tui.rs | 24 ++++++++++++++++-------- src/chat/pretty_tui.rs | 13 +++++++------ 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/src/chat.rs b/src/chat.rs index c0552d5..2b323bd 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -47,18 +47,23 @@ impl ChatStorage { self.messages.read().unwrap().clone() } - pub fn update(&self, messages: Vec, packet_size: usize) { + pub fn update(&self, max_length: usize, messages: Vec, packet_size: usize) { self.packet_size.store(packet_size, Ordering::SeqCst); + let mut messages = messages; + messages.drain(max_length..); *self.messages.write().unwrap() = messages; } - pub fn append_and_store(&self, messages: Vec, packet_size: usize) { + pub fn append_and_store(&self, max_length: usize, messages: Vec, packet_size: usize) { self.packet_size.store(packet_size, Ordering::SeqCst); - self.messages.write().unwrap().append(&mut messages.clone()); + self.append(max_length, messages); } - pub fn append(&self, messages: Vec) { + pub fn append(&self, max_length: usize, messages: Vec) { self.messages.write().unwrap().append(&mut messages.clone()); + if self.messages.read().unwrap().len() > max_length { + self.messages.write().unwrap().drain(max_length..); + } } } diff --git a/src/chat/minimal_tui.rs b/src/chat/minimal_tui.rs index 96b798c..77d8796 100644 --- a/src/chat/minimal_tui.rs +++ b/src/chat/minimal_tui.rs @@ -1,4 +1,6 @@ use std::sync::Arc; +use std::io::stdout; +use std::io::Write; use colored::Colorize; @@ -29,38 +31,44 @@ pub fn run_main_loop(ctx: Arc) { }; if ctx.enable_chunked { - ctx.messages.append_and_store(messages.clone(), size); + ctx.messages.append_and_store(ctx.max_messages, messages.clone(), size); } else { - ctx.messages.update(messages.clone(), size); + ctx.messages.update(ctx.max_messages, messages.clone(), size); } } Err(e) => { let msg = format!("Read messages error: {}", e.to_string()).bright_red().to_string(); - ctx.messages.append(vec![msg]); + ctx.messages.append(ctx.max_messages, vec![msg]); } _ => {} } }, Err(e) => { let msg = format!("Connect error: {}", e.to_string()).bright_red().to_string(); - ctx.messages.append(vec![msg]); + ctx.messages.append(ctx.max_messages, vec![msg]); } } - print!( - "{}\n{} ", - ctx.messages.messages() + let messages = ctx.messages.messages(); + + let mut out = stdout().lock(); + write!( + out, + "{}\n{}\n{} ", + "\n".repeat(ctx.max_messages - messages.len()), + messages .into_iter() .map(|o| o.white().blink().to_string()) .collect::>() .join("\n"), ">".bright_yellow() ); + out.flush(); if let Some(message) = get_input("") { if let Err(e) = on_send_message(ctx.clone(), &message) { let msg = format!("Send message error: {}", e.to_string()).bright_red().to_string(); - ctx.messages.append(vec![msg]); + ctx.messages.append(ctx.max_messages, vec![msg]); } } } diff --git a/src/chat/pretty_tui.rs b/src/chat/pretty_tui.rs index 9a3d210..3e34b02 100644 --- a/src/chat/pretty_tui.rs +++ b/src/chat/pretty_tui.rs @@ -169,7 +169,7 @@ fn poll_events(ctx: Arc) -> Result<(), Box> { if let Err(e) = on_send_message(ctx.clone(), &message) { let msg = format!("Send message error: {}", e.to_string()).bright_red().to_string(); - ctx.messages.append(vec![msg]); + ctx.messages.append(ctx.max_messages, vec![msg]); print_console(ctx.clone(), ctx.messages.messages(), &ctx.input.read().unwrap())?; } } else { @@ -328,16 +328,16 @@ pub fn recv_tick(ctx: Arc) -> Result<(), Box> { }; if ctx.enable_chunked { - ctx.messages.append_and_store(messages.clone(), size); + ctx.messages.append_and_store(ctx.max_messages, messages.clone(), size); print_console(ctx.clone(), ctx.messages.messages(), &ctx.input.read().unwrap())?; } else { - ctx.messages.update(messages.clone(), size); + ctx.messages.update(ctx.max_messages, messages.clone(), size); print_console(ctx.clone(), messages, &ctx.input.read().unwrap())?; } } Err(e) => { let msg = format!("Read messages error: {}", e.to_string()).bright_red().to_string(); - ctx.messages.append(vec![msg]); + ctx.messages.append(ctx.max_messages, vec![msg]); print_console(ctx.clone(), ctx.messages.messages(), &ctx.input.read().unwrap())?; } _ => {} @@ -362,8 +362,9 @@ pub fn run_main_loop(ctx: Arc) { loop { if let Err(e) = recv_tick(ctx.clone()) { let msg = format!("Print messages error: {}", e.to_string()).bright_red().to_string(); - ctx.messages.append(vec![msg]); + ctx.messages.append(ctx.max_messages, vec![msg]); let _ = print_console(ctx.clone(), ctx.messages.messages(), &ctx.input.read().unwrap()); + thread::sleep(Duration::from_secs(1)); } } } @@ -371,7 +372,7 @@ pub fn run_main_loop(ctx: Arc) { if let Err(e) = poll_events(ctx.clone()) { let msg = format!("Poll events error: {}", e.to_string()).bright_red().to_string(); - ctx.messages.append(vec![msg]); + ctx.messages.append(ctx.max_messages, vec![msg]); let _ = print_console(ctx.clone(), ctx.messages.messages(), &ctx.input.read().unwrap()); } } \ No newline at end of file