mirror of
https://github.com/MeexReay/bRAC.git
synced 2025-05-06 21:48:03 +03:00
message formating
This commit is contained in:
parent
8b64a2e1c3
commit
8b9b870172
45
Cargo.lock
generated
45
Cargo.lock
generated
@ -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"
|
||||||
|
@ -6,3 +6,4 @@ edition = "2021"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
rand = "0.9.0"
|
rand = "0.9.0"
|
||||||
termion = "4.0.3"
|
termion = "4.0.3"
|
||||||
|
regex = "1.11.1"
|
62
src/main.rs
62
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 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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user