use std::env; use std::io::{self, BufRead, BufReader, Write}; use std::net::TcpStream; fn read_messages(mut reader: impl BufRead) -> u64 { // Read the message count let mut buf = String::new(); reader.read_line(&mut buf).unwrap(); let count = buf.trim().parse::().unwrap(); // Read and print each message for _ in 0..count { buf.clear(); reader.read_line(&mut buf).unwrap(); print!("{buf}"); } // Read and return the message index buf.clear(); reader.read_line(&mut buf).unwrap(); buf.trim().parse::().unwrap() } fn main() { // Read the configuration let mut args = env::args().skip(1); let username = args.next().expect("need username"); let host = args.next().expect("need hostname"); let port = args.next().unwrap_or("44322".into()); let port = port.parse::().expect("port should be an integer"); // Connect to the server let mut writer = TcpStream::connect((host, port)).unwrap(); let mut reader = BufReader::new(writer.try_clone().unwrap()); // Get message history writer.write_all(b"LAST 20\n").unwrap(); let mut last_index = read_messages(&mut reader); // Process user input print!("> "); io::stdout().flush().unwrap(); let lines = io::stdin().lines(); for line in lines.map(Result::unwrap) { // Send non-empty lines if !line.is_empty() { writer .write_all(format!("SEND {username}: {line}\n").as_bytes()) .unwrap(); let mut discard = String::new(); reader.read_line(&mut discard).unwrap(); } // Get new messages writer .write_all(format!("SKIP {last_index}\n").as_bytes()) .unwrap(); last_index = read_messages(&mut reader); print!("> "); io::stdout().flush().unwrap(); } }