message formating

This commit is contained in:
MeexReay 2025-02-09 15:33:32 +03:00
parent 8b64a2e1c3
commit 8b9b870172
4 changed files with 102 additions and 9 deletions

45
Cargo.lock generated
View File

@ -2,11 +2,21 @@
# It is not intended for manual editing. # It is not intended for manual editing.
version = 4 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]] [[package]]
name = "bRAC" name = "bRAC"
version = "1.99.2" version = "1.99.2"
dependencies = [ dependencies = [
"rand", "rand",
"regex",
"termion", "termion",
] ]
@ -57,6 +67,12 @@ dependencies = [
"redox_syscall", "redox_syscall",
] ]
[[package]]
name = "memchr"
version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]] [[package]]
name = "numtoa" name = "numtoa"
version = "0.2.4" version = "0.2.4"
@ -136,6 +152,35 @@ version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "20145670ba436b55d91fc92d25e71160fbfbdd57831631c8d7d36377a476f1cb" 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]] [[package]]
name = "syn" name = "syn"
version = "2.0.98" version = "2.0.98"

View File

@ -5,4 +5,5 @@ edition = "2021"
[dependencies] [dependencies]
rand = "0.9.0" rand = "0.9.0"
termion = "4.0.3" termion = "4.0.3"
regex = "1.11.1"

View File

@ -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 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 MAX_MESSAGES: usize = 100;
const DEFAULT_HOST: &str = "meex.lol:11234"; const DEFAULT_HOST: &str = "meex.lol:11234";
const MAGIC_KEY: &str = "리㹰";
fn send_message(host: &str, message: &str) -> Result<(), Box<dyn Error>> { fn send_message(host: &str, message: &str) -> Result<(), Box<dyn Error>> {
let mut stream = TcpStream::connect(host)?; let mut stream = TcpStream::connect(host)?;
stream.write_all(&[0x01])?; stream.write_all(&[0x01])?;
stream.write_all(message.as_bytes())?; let data = format!("\r{}{}",
stream.write_all("\0".repeat(1023 - message.len()).as_bytes())?; 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(()) Ok(())
} }
@ -47,7 +59,6 @@ fn read_messages(host: &str) -> Result<String, Box<dyn Error>> {
.parse()? .parse()?
}; };
// println!("{} {}", skip, packet_size);
stream.write_all(&[0x01])?; stream.write_all(&[0x01])?;
let packet_data = { let packet_data = {
@ -97,6 +108,42 @@ fn get_input(prompt: &str, default: &str) -> String {
}.to_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<dyn Error>> { fn print_console(messages: &str, input: &str) -> Result<(), Box<dyn Error>> {
let mut messages = messages.split("\n") let mut messages = messages.split("\n")
.map(|o| o.to_string()) .map(|o| o.to_string())
@ -104,6 +151,7 @@ fn print_console(messages: &str, input: &str) -> Result<(), Box<dyn Error>> {
messages.reverse(); messages.reverse();
messages.truncate(MAX_MESSAGES); messages.truncate(MAX_MESSAGES);
messages.reverse(); messages.reverse();
let messages: Vec<String> = messages.into_iter().map(on_message).collect();
let mut out = stdout().into_raw_mode()?; let mut out = stdout().into_raw_mode()?;
let text = format!("{}{}\n> {}", "\n".repeat(MAX_MESSAGES - messages.len()), messages.join("\n"), input); let text = format!("{}{}\n> {}", "\n".repeat(MAX_MESSAGES - messages.len()), messages.join("\n"), input);
for line in text.lines() { 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(); let stdin = stdin();
for key in stdin.keys() { for key in stdin.keys() {
@ -140,7 +188,7 @@ fn main() {
Key::Char('\n') => { Key::Char('\n') => {
let message = input.read().unwrap().clone(); let message = input.read().unwrap().clone();
if !message.is_empty() { 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(); input.write().unwrap().clear();
} }
} }

View File

@ -1 +0,0 @@
[2025-02-09 10:40:02] {192.168.0.201} <MrSugoma> Извините, я при ап<D0B0>