From c415d46ef7bfa21db06658146e1c01c93153d343 Mon Sep 17 00:00:00 2001 From: jus1d Date: Tue, 6 Aug 2024 12:58:55 +0400 Subject: [PATCH 1/6] [Client] Add delete support --- src/client.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/client.rs b/src/client.rs index e8f03a7..acf48a7 100644 --- a/src/client.rs +++ b/src/client.rs @@ -305,6 +305,12 @@ impl Prompt { } } + fn delete(&mut self) { + if self.cursor < self.buffer.len() { + self.buffer.remove(self.cursor); + } + } + fn before_cursor(&self) -> &[char] { &self.buffer[..self.cursor] } @@ -498,7 +504,7 @@ fn main() -> io::Result<()> { prompt.right_char(); } KeyCode::Backspace => prompt.backspace(), - // TODO: delete current character by KeyCode::Delete + KeyCode::Delete => prompt.delete(), // TODO: delete word by Ctrl+W KeyCode::Tab => { if let Some((prefix, &[])) = parse_command(prompt.before_cursor()) { From 0051d2370517cc26ef21603600bbb8e614d497fd Mon Sep 17 00:00:00 2001 From: jus1d Date: Tue, 6 Aug 2024 12:59:30 +0400 Subject: [PATCH 2/6] Add todo --- src/client.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/client.rs b/src/client.rs index acf48a7..2beabc8 100644 --- a/src/client.rs +++ b/src/client.rs @@ -556,6 +556,7 @@ fn main() -> io::Result<()> { Ok(n) => { if n > 0 { if let Some(line) = sanitize_terminal_output(&buf[..n]) { + // TODO: don't push to local char empty message client.chat.push(line, Color::White) } } else { From 2b672c1524278fb37fe624ebf556768d024cd3ba Mon Sep 17 00:00:00 2001 From: jus1d Date: Tue, 6 Aug 2024 13:10:45 +0400 Subject: [PATCH 3/6] [Client] don't send empty messages (or whitespaces only) --- src/client.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/client.rs b/src/client.rs index 2beabc8..e4ced87 100644 --- a/src/client.rs +++ b/src/client.rs @@ -537,7 +537,9 @@ fn main() -> io::Result<()> { // TODO: don't display the message if it was not delivered // Maybe the server should actually send your own message back. // Not sending it back made sense in the telnet times. - chat_msg!(&mut client.chat, "{text}", text = &prompt); + if prompt.trim().len() > 0 { + chat_msg!(&mut client.chat, "{text}", text = &prompt); + } } else { chat_info!(&mut client.chat, "You are offline. Use {signature} to connect to a server.", signature = find_command("connect").expect("connect command").signature); } @@ -556,8 +558,7 @@ fn main() -> io::Result<()> { Ok(n) => { if n > 0 { if let Some(line) = sanitize_terminal_output(&buf[..n]) { - // TODO: don't push to local char empty message - client.chat.push(line, Color::White) + client.chat.push(line, Color::White); } } else { client.stream = None; From 8d7c6cd2b0b650ff591a0710370356d2f61f892e Mon Sep 17 00:00:00 2001 From: jus1d Date: Tue, 6 Aug 2024 13:23:38 +0400 Subject: [PATCH 4/6] [Client] delete_word() --- src/client.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/client.rs b/src/client.rs index e4ced87..9598673 100644 --- a/src/client.rs +++ b/src/client.rs @@ -329,6 +329,12 @@ impl Prompt { self.buffer.pop(); } } + + fn delete_word(&mut self) { + while self.at_cursor().is_alphabetic() { + self.buffer.remove(self.cursor); + } + } } #[derive(Default)] @@ -486,6 +492,7 @@ fn main() -> io::Result<()> { match x { 'c' => client.quit = true, 'k' => prompt.delete_until_end(), + 'w' => prompt.delete_word(), _ => {} } } else { @@ -505,7 +512,6 @@ fn main() -> io::Result<()> { } KeyCode::Backspace => prompt.backspace(), KeyCode::Delete => prompt.delete(), - // TODO: delete word by Ctrl+W KeyCode::Tab => { if let Some((prefix, &[])) = parse_command(prompt.before_cursor()) { let prefix = prefix.iter().collect::(); From 79d5f6f23cd8399cec4821a58631b864f4ee1e8a Mon Sep 17 00:00:00 2001 From: jus1d Date: Tue, 6 Aug 2024 13:58:50 +0400 Subject: [PATCH 5/6] add server responding with your message. highlighting your message --- src/client.rs | 15 ++++++++------- src/server.rs | 15 ++++++++++----- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/client.rs b/src/client.rs index 9598673..eee9bb2 100644 --- a/src/client.rs +++ b/src/client.rs @@ -187,6 +187,7 @@ impl ChatLog { } } +#[allow(unused_macros)] macro_rules! chat_msg { ($chat:expr, $($arg:tt)*) => { $chat.push(format!($($arg)*), Color::White) @@ -540,12 +541,6 @@ fn main() -> io::Result<()> { if let Some(ref mut stream) = &mut client.stream { let prompt = prompt.buffer.iter().collect::(); stream.write(prompt.as_bytes())?; - // TODO: don't display the message if it was not delivered - // Maybe the server should actually send your own message back. - // Not sending it back made sense in the telnet times. - if prompt.trim().len() > 0 { - chat_msg!(&mut client.chat, "{text}", text = &prompt); - } } else { chat_info!(&mut client.chat, "You are offline. Use {signature} to connect to a server.", signature = find_command("connect").expect("connect command").signature); } @@ -564,7 +559,13 @@ fn main() -> io::Result<()> { Ok(n) => { if n > 0 { if let Some(line) = sanitize_terminal_output(&buf[..n]) { - client.chat.push(line, Color::White); + // TODO: some user can just send message, that starts with 'You: ', and it + // will be highlighted + if line.starts_with("You: ") { + client.chat.push(line, Color::Magenta) + } else { + client.chat.push(line, Color::White); + } } } else { client.stream = None; diff --git a/src/server.rs b/src/server.rs index f187b81..5002203 100644 --- a/src/server.rs +++ b/src/server.rs @@ -170,11 +170,16 @@ impl Server { if author.authed { println!("INFO: Client {author_addr} sent message {bytes:?}", author_addr = Sens(author_addr)); for (client_token, client) in self.clients.iter_mut() { - if *client_token != token && client.authed { - let _ = writeln!(client.conn, "{text}").map_err(|err| { - eprintln!("ERROR: could not broadcast message to all the clients from {author_addr}: {err}", author_addr = Sens(author_addr), err = Sens(err)) - }); - } + let message = if *client_token != token && client.authed { + format!("{text}") + } else { + format!("You: {text}") + }; + + let _ = writeln!(client.conn, "{message}").map_err(|err| { + eprintln!("ERROR: could not broadcast message to all the clients from {author_addr}: {err}", + author_addr = Sens(author_addr), err = Sens(err)) + }); } } else { if text != self.token { From ab2979dc39b2d10dc93ff2e25fa11c07bfb5ecd7 Mon Sep 17 00:00:00 2001 From: jus1d Date: Wed, 7 Aug 2024 18:33:49 +0400 Subject: [PATCH 6/6] [Client] Make more readable comment --- src/client.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/client.rs b/src/client.rs index eee9bb2..1e59603 100644 --- a/src/client.rs +++ b/src/client.rs @@ -559,8 +559,7 @@ fn main() -> io::Result<()> { Ok(n) => { if n > 0 { if let Some(line) = sanitize_terminal_output(&buf[..n]) { - // TODO: some user can just send message, that starts with 'You: ', and it - // will be highlighted + // TODO: some user can just send message, that starts with 'You: ', and it will be highlighted as your if line.starts_with("You: ") { client.chat.push(line, Color::Magenta) } else {