From 8b9b8701729908fd60ac5952251c4458ceca2a2f Mon Sep 17 00:00:00 2001 From: MeexReay Date: Sun, 9 Feb 2025 15:33:32 +0300 Subject: [PATCH] message formating --- Cargo.lock | 45 ++++++++++++++++++++++++++++++++++++++ Cargo.toml | 3 ++- src/main.rs | 62 +++++++++++++++++++++++++++++++++++++++++++++++------ test.txt | 1 - 4 files changed, 102 insertions(+), 9 deletions(-) delete mode 100644 test.txt diff --git a/Cargo.lock b/Cargo.lock index d2766a1..ce20601 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,11 +2,21 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + [[package]] name = "bRAC" version = "1.99.2" dependencies = [ "rand", + "regex", "termion", ] @@ -57,6 +67,12 @@ dependencies = [ "redox_syscall", ] +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + [[package]] name = "numtoa" version = "0.2.4" @@ -136,6 +152,35 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20145670ba436b55d91fc92d25e71160fbfbdd57831631c8d7d36377a476f1cb" +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + [[package]] name = "syn" version = "2.0.98" diff --git a/Cargo.toml b/Cargo.toml index 4252924..573a670 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,4 +5,5 @@ edition = "2021" [dependencies] rand = "0.9.0" -termion = "4.0.3" \ No newline at end of file +termion = "4.0.3" +regex = "1.11.1" \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index dad69ac..db2a600 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,16 +1,28 @@ -use std::{error::Error, fmt::format, fs, io::{stdin, stdout, BufRead, Read, Write}, net::TcpStream, sync::{Arc, RwLock}, thread, time::{self, Duration, SystemTime, UNIX_EPOCH}}; +use std::{ + error::Error, io::{stdin, stdout, BufRead, Read, Write}, net::TcpStream, sync::{Arc, RwLock}, thread +}; use rand::random; -use termion::{event::Key, input::TermRead, raw::IntoRawMode}; +use regex::Regex; +use termion::{color, event::Key, input::TermRead, raw::IntoRawMode, style}; const MAX_MESSAGES: usize = 100; const DEFAULT_HOST: &str = "meex.lol:11234"; +const MAGIC_KEY: &str = "리㹰"; fn send_message(host: &str, message: &str) -> Result<(), Box> { let mut stream = TcpStream::connect(host)?; stream.write_all(&[0x01])?; - stream.write_all(message.as_bytes())?; - stream.write_all("\0".repeat(1023 - message.len()).as_bytes())?; + let data = format!("\r{}{}", + message, + if message.chars().count() < 39 { + " ".repeat(39-message.chars().count()) + } else { + String::new() + } + ); + stream.write_all(data.as_bytes())?; + stream.write_all("\0".repeat(1023 - data.len()).as_bytes())?; Ok(()) } @@ -47,7 +59,6 @@ fn read_messages(host: &str) -> Result> { .parse()? }; - // println!("{} {}", skip, packet_size); stream.write_all(&[0x01])?; let packet_data = { @@ -97,6 +108,42 @@ fn get_input(prompt: &str, default: &str) -> String { }.to_string() } +fn on_message(message: String) -> String { + let message = Regex::new(r"\{[^}]*\}\ ").unwrap().replace(&message, "").to_string(); + let message = message.replace("\r", ""); + let message = message.replace("\0", ""); + let message = message.replace("\t", ""); + + let captures = Regex::new(r"\[(.*?)\] <(.*?)> (.*)").unwrap().captures(&message) + .or_else(|| Regex::new(&format!("\\[(.*?)\\] {}<(.*?)> (.*)", MAGIC_KEY)).unwrap().captures(&message)) + .or_else(|| Regex::new(&format!("\\[(.*?)\\] {} <(.*?)> (.*)", MAGIC_KEY)).unwrap().captures(&message)) + .or_else(|| Regex::new(r"\[(.*?)\] (.*?): (.*)").unwrap().captures(&message)); + + if let Some(captures) = captures { + let date = &captures[1]; + let nick = &captures[2]; + let content = &captures[3]; + + let mut result = String::new(); + result.push_str(&format!("{}{}[{}] ", color::Fg(color::White), style::Faint, date)); + result.push_str(&format!("{}{}{}<{}> ", style::Reset, style::Bold, color::Fg(color::Cyan), nick)); + result.push_str(&format!("{}{}{}", color::Fg(color::White), style::Blink, content)); + result.push_str(&style::Reset.to_string()); + result + } else if let Some(captures) = Regex::new(r"\[(.*?)\] (.*)").unwrap().captures(&message) { + let date = &captures[1]; + let content = &captures[2]; + + let mut result = String::new(); + result.push_str(&format!("{}{}[{}] ", color::Fg(color::White), style::Faint, date)); + result.push_str(&format!("{}{}{}{}", style::Reset, color::Fg(color::White), style::Blink, content)); + result.push_str(&style::Reset.to_string()); + result + } else { + message + } +} + fn print_console(messages: &str, input: &str) -> Result<(), Box> { let mut messages = messages.split("\n") .map(|o| o.to_string()) @@ -104,6 +151,7 @@ fn print_console(messages: &str, input: &str) -> Result<(), Box> { messages.reverse(); messages.truncate(MAX_MESSAGES); messages.reverse(); + let messages: Vec = messages.into_iter().map(on_message).collect(); let mut out = stdout().into_raw_mode()?; let text = format!("{}{}\n> {}", "\n".repeat(MAX_MESSAGES - messages.len()), messages.join("\n"), input); for line in text.lines() { @@ -132,7 +180,7 @@ fn main() { } }); - let stdout = stdout().into_raw_mode().unwrap(); + let _ = stdout().into_raw_mode().unwrap(); let stdin = stdin(); for key in stdin.keys() { @@ -140,7 +188,7 @@ fn main() { Key::Char('\n') => { let message = input.read().unwrap().clone(); if !message.is_empty() { - send_message(&host, &format!("<{}> {}", name, message)).expect("Error sending message"); + send_message(&host, &format!("{}<{}> {}", MAGIC_KEY, name, message)).expect("Error sending message"); input.write().unwrap().clear(); } } diff --git a/test.txt b/test.txt deleted file mode 100644 index 040ab53..0000000 --- a/test.txt +++ /dev/null @@ -1 +0,0 @@ -[2025-02-09 10:40:02] {192.168.0.201} Извините, я при ап \ No newline at end of file