From ce63efeba6428329ce7f525c0fa71eddd1ce3036 Mon Sep 17 00:00:00 2001 From: MeexReay Date: Mon, 10 Feb 2025 14:48:00 +0300 Subject: [PATCH] message storing refactor --- src/main.rs | 6 +++--- src/rac.rs | 25 ++++++++++++++++--------- src/term.rs | 45 ++++++++++++++++++++++++++++----------------- 3 files changed, 47 insertions(+), 29 deletions(-) diff --git a/src/main.rs b/src/main.rs index d3e614c..0a03760 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,5 @@ use std::{ - error::Error, io::{stdin, stdout, BufRead, Write}, sync::{Arc, RwLock} + error::Error, io::{stdin, stdout, BufRead, Write}, sync::{atomic::AtomicUsize, Arc, RwLock} }; use colored::Color; @@ -149,14 +149,14 @@ fn main() { } if args.read_messages { - print!("{}", read_messages(&config.host).expect("Error reading messages")); + print!("{}", read_messages(&config.host, config.max_messages).expect("Error reading messages").0.join("\n")); return; } let disable_formatting = args.disable_formatting; let disable_commands = args.disable_commands; - let messages = Arc::new(RwLock::new(String::new())); + let messages = Arc::new((RwLock::new(Vec::new()), AtomicUsize::new(0))); let input = Arc::new(RwLock::new(String::new())); let config = Arc::new(config); diff --git a/src/rac.rs b/src/rac.rs index ab50658..a20fe34 100644 --- a/src/rac.rs +++ b/src/rac.rs @@ -1,4 +1,4 @@ -use std::{error::Error, io::{Read, Write}, net::TcpStream, sync::{Arc, RwLock}, thread, time::Duration}; +use std::{error::Error, io::{Read, Write}, net::TcpStream, sync::{atomic::{AtomicUsize, Ordering}, Arc, RwLock}, thread, time::Duration}; use crate::{config::Config, term::print_console, ADVERTISEMENT, ADVERTISEMENT_ENABLED}; @@ -33,7 +33,7 @@ fn skip_null(stream: &mut TcpStream) -> Result, Box> { } } -pub fn read_messages(host: &str) -> Result> { +pub fn read_messages(host: &str, max_messages: usize) -> Result<(Vec, usize), Box> { let mut stream = TcpStream::connect(host)?; stream.write_all(&[0x00])?; @@ -69,23 +69,30 @@ pub fn read_messages(host: &str) -> Result> { String::from_utf8_lossy(&data).to_string() }; - Ok(packet_data) + let lines: Vec<&str> = packet_data.split("\n").collect(); + let lines: Vec = lines.clone().into_iter() + .skip(lines.len() - max_messages) + .map(|o| o.to_string()) + .collect(); + + Ok((lines, packet_size)) } -fn recv_loop(config: Arc, host: &str, cache: Arc>, input: Arc>, disable_formatting: bool) -> Result<(), Box> { - while let Ok(data) = read_messages(host) { - if data == cache.read().unwrap().clone() { +fn recv_loop(config: Arc, host: &str, cache: Arc<(RwLock>, AtomicUsize)>, input: Arc>, disable_formatting: bool) -> Result<(), Box> { + while let Ok(data) = read_messages(host, config.max_messages) { + if data.1 == cache.1.load(Ordering::SeqCst) { continue } - *cache.write().unwrap() = data; - print_console(config.clone(), &cache.read().unwrap(), &input.read().unwrap(), disable_formatting)?; + *cache.0.write().unwrap() = data.0.clone(); + cache.1.store(data.1, Ordering::SeqCst); + print_console(config.clone(), data.0, &input.read().unwrap(), disable_formatting)?; thread::sleep(Duration::from_millis(config.update_time as u64)); } Ok(()) } -pub fn run_recv_loop(config: Arc, host: String, messages: Arc>, input: Arc>, disable_formatting: bool) { +pub fn run_recv_loop(config: Arc, host: String, messages: Arc<(RwLock>, AtomicUsize)>, input: Arc>, disable_formatting: bool) { thread::spawn({ move || { let _ = recv_loop(config.clone(), &host, messages, input, disable_formatting); diff --git a/src/term.rs b/src/term.rs index 7447ba2..1713b84 100644 --- a/src/term.rs +++ b/src/term.rs @@ -1,4 +1,4 @@ -use std::{error::Error, io::{stdout, Write}, sync::{Arc, RwLock}, time::Duration}; +use std::{error::Error, io::{stdout, Write}, sync::{atomic::AtomicUsize, Arc, RwLock}, time::Duration}; use colored::{Color, Colorize}; use crossterm::{cursor::MoveLeft, event::{self, Event, KeyCode}, terminal::{disable_raw_mode, enable_raw_mode}, ExecutableCommand}; @@ -6,22 +6,15 @@ use regex::Regex; use crate::{config::Config, on_command, rac::send_message, ADVERTISEMENT, COLORED_USERNAMES, DATE_REGEX}; -pub fn print_console(config: Arc, messages: &str, input: &str, disable_formatting: bool) -> Result<(), Box> { - let mut messages = messages.split("\n") - .map(|o| o.to_string()) - .collect::>(); - messages.reverse(); - messages.truncate(config.max_messages); - messages.reverse(); - let messages: Vec = if disable_formatting { - messages - } else { - messages.into_iter().filter_map(format_message).collect() - }; +pub fn print_console(config: Arc, messages: Vec, input: &str, disable_formatting: bool) -> Result<(), Box> { let text = format!( "{}{}\n> {}", "\n".repeat(config.max_messages - messages.len()), - messages.join("\n"), + if disable_formatting { + messages + } else { + messages.into_iter().filter_map(format_message).collect() + }.join("\n"), // if sound { "\x07" } else { "" }, input ); @@ -84,7 +77,16 @@ fn find_username_color(message: &str) -> Option<(String, String, Color)> { None } -fn poll_events(config: Arc, input: Arc>, messages: Arc>, host: String, name: String, disable_formatting: bool, disable_commands: bool, disable_hiding_ip: bool) { +fn poll_events( + config: Arc, + input: Arc>, + messages: Arc<(RwLock>, AtomicUsize)>, + host: String, + name: String, + disable_formatting: bool, + disable_commands: bool, + disable_hiding_ip: bool +) { loop { if !event::poll(Duration::from_millis(50)).unwrap_or(false) { continue } @@ -119,7 +121,7 @@ fn poll_events(config: Arc, input: Arc>, messages: Arc, input: Arc>, messages: Arc, messages: Arc>, input: Arc>, host: String, name: String, disable_formatting: bool, disable_commands: bool, disable_hiding_ip: bool) { +pub fn run_main_loop( + config: Arc, + messages: Arc<(RwLock>, AtomicUsize)>, + input: Arc>, + host: String, + name: String, + disable_formatting: bool, + disable_commands: bool, + disable_hiding_ip: bool +) { enable_raw_mode().unwrap(); // thread::spawn({