From 87c5a7ce4237473b802b44c4a0d2dd137da03613 Mon Sep 17 00:00:00 2001 From: Konstantin Zhigaylo Date: Wed, 18 Jun 2025 08:13:14 +0300 Subject: [PATCH] refactor: remove unnecessary cloning and simplify code --- .gitignore | 1 + src/ctx.rs | 85 +++++++++++++++++++++-------------------------- src/proto/rac.rs | 14 ++++---- src/proto/wrac.rs | 14 ++++---- 4 files changed, 52 insertions(+), 62 deletions(-) diff --git a/.gitignore b/.gitignore index af54c07..b970583 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ /result /messages.txt /accounts.txt +/.idea \ No newline at end of file diff --git a/src/ctx.rs b/src/ctx.rs index cc5e82a..34a21bf 100644 --- a/src/ctx.rs +++ b/src/ctx.rs @@ -71,8 +71,8 @@ impl Context { args, messages_file: messages_file.clone(), accounts_file: accounts_file.clone(), - messages: RwLock::new(load_messages(messages_file.clone())), - accounts: RwLock::new(load_accounts(accounts_file.clone())), + messages: RwLock::new(load_messages(messages_file)), + accounts: RwLock::new(load_accounts(accounts_file)), messages_offset: AtomicU64::default(), notifications: RwLock::new(HashMap::new()), timeouts: RwLock::new(HashMap::new()), @@ -82,7 +82,6 @@ impl Context { pub fn push_message(&self, msg: Vec) -> Result<(), Box> { if let Some(messages_file) = self.messages_file.clone() { let mut file = OpenOptions::new() - .write(true) .append(true) .create(true) .open(messages_file)?; @@ -112,27 +111,26 @@ impl Context { } pub fn get_account_by_addr(&self, addr: &str) -> Option { - for acc in self.accounts.read().unwrap().iter().rev() { - if acc.addr() == addr { - return Some(acc.clone()); - } - } - None + self.accounts + .read() + .unwrap() + .iter() + .find(|acc| acc.addr() == addr) + .cloned() } pub fn get_account(&self, name: &str) -> Option { - for acc in self.accounts.read().unwrap().iter() { - if acc.name() == name { - return Some(acc.clone()); - } - } - None + self.accounts + .read() + .unwrap() + .iter() + .find(|acc| acc.name() == name) + .cloned() } pub fn push_account(&self, acc: Account) -> Result<(), Box> { if let Some(accounts_file) = self.accounts_file.clone() { let mut file = OpenOptions::new() - .write(true) .append(true) .create(true) .open(accounts_file)?; @@ -215,41 +213,34 @@ impl Account { } pub fn from_bytes(text: Vec) -> Result> { - let mut text = Cursor::new(text); - - let mut name_len = [0; 4]; - text.read_exact(&mut name_len)?; - let name_len = u32::from_le_bytes(name_len) as usize; - - let mut salt_len = [0; 4]; - text.read_exact(&mut salt_len)?; - let salt_len = u32::from_le_bytes(salt_len) as usize; - - let mut addr_len = [0; 4]; - text.read_exact(&mut addr_len)?; - let addr_len = u32::from_le_bytes(addr_len) as usize; - - let mut pass_len = [0; 4]; - text.read_exact(&mut pass_len)?; - let pass_len = u32::from_le_bytes(pass_len) as usize; - - let mut name = vec![0; name_len]; - text.read_exact(&mut name)?; - let name = String::from_utf8_lossy(&name).to_string(); - - let mut salt = vec![0; salt_len]; - text.read_exact(&mut salt)?; - let salt = String::from_utf8_lossy(&salt).to_string(); - - let mut addr = vec![0; addr_len]; - text.read_exact(&mut addr)?; - let addr = String::from_utf8_lossy(&addr).to_string(); + let mut cursor = Cursor::new(text); + + let read_u32 = |cursor: &mut Cursor>| -> Result> { + let mut buf = [0; 4]; + cursor.read_exact(&mut buf)?; + Ok(u32::from_le_bytes(buf)) + }; + + let name_len = read_u32(&mut cursor)? as usize; + let salt_len = read_u32(&mut cursor)? as usize; + let addr_len = read_u32(&mut cursor)? as usize; + let pass_len = read_u32(&mut cursor)? as usize; + + let read_string = |cursor: &mut Cursor>, len: usize| -> Result> { + let mut buf = vec![0; len]; + cursor.read_exact(&mut buf)?; + String::from_utf8(buf).map_err(|e| e.into()) + }; + + let name = read_string(&mut cursor, name_len)?; + let salt = read_string(&mut cursor, salt_len)?; + let addr = read_string(&mut cursor, addr_len)?; let mut pass = vec![0; pass_len]; - text.read_exact(&mut pass)?; + cursor.read_exact(&mut pass)?; let mut date = [0; 8]; - text.read_exact(&mut date)?; + cursor.read_exact(&mut date)?; let date = i64::from_le_bytes(date); Ok(Account { diff --git a/src/proto/rac.rs b/src/proto/rac.rs index de74f6f..0fdb843 100644 --- a/src/proto/rac.rs +++ b/src/proto/rac.rs @@ -16,14 +16,14 @@ pub fn accept_rac_stream( stream.read_exact(&mut buf)?; if buf[0] == 0x00 { - let total_size = on_total_size(ctx.clone(), addr.clone())?; + let total_size = on_total_size(ctx.clone(), addr)?; stream.write_all(total_size.to_string().as_bytes())?; let mut id = vec![0]; stream.read_exact(&mut id)?; if id[0] == 0x01 { - stream.write_all(&on_total_data(ctx.clone(), addr.clone(), Some(total_size))?)?; + stream.write_all(&on_total_data(ctx.clone(), addr, Some(total_size))?)?; } else if id[0] == 0x02 { let mut buf = vec![0; 10]; let size = stream.read(&mut buf)?; @@ -32,7 +32,7 @@ pub fn accept_rac_stream( let client_has: u64 = String::from_utf8(buf)?.parse()?; stream.write_all(&on_chunked_data( ctx.clone(), - addr.clone(), + addr, Some(total_size), client_has, )?)?; @@ -42,7 +42,7 @@ pub fn accept_rac_stream( let size = stream.read(&mut buf)?; buf.truncate(size); - on_send_message(ctx.clone(), addr.clone(), buf)?; + on_send_message(ctx.clone(), addr, buf)?; } else if buf[0] == 0x02 { let mut buf = vec![0; ctx.args.message_limit + 2 + 512]; // FIXME: softcode this (512 = name + password) let size = stream.read(&mut buf)?; @@ -62,9 +62,7 @@ pub fn accept_rac_stream( return Ok(()); }; - if let Some(resp_id) = - on_send_auth_message(ctx.clone(), addr.clone(), name, password, text)? - { + if let Some(resp_id) = on_send_auth_message(ctx.clone(), addr, name, password, text)? { stream.write_all(&[resp_id])?; } } else if buf[0] == 0x03 { @@ -83,7 +81,7 @@ pub fn accept_rac_stream( return Ok(()); }; - if let Some(resp_id) = on_register_user(ctx.clone(), addr.clone(), name, password)? { + if let Some(resp_id) = on_register_user(ctx.clone(), addr, name, password)? { stream.write_all(&[resp_id])?; } } diff --git a/src/proto/wrac.rs b/src/proto/wrac.rs index 2a55c44..7134a6c 100644 --- a/src/proto/wrac.rs +++ b/src/proto/wrac.rs @@ -35,7 +35,7 @@ pub fn accept_wrac_stream( if id == 0x00 { if data.is_empty() { - let total_size = on_total_size(ctx.clone(), addr.clone())?; + let total_size = on_total_size(ctx.clone(), addr)?; sent_size = Some(total_size); websocket.write(Message::Binary(Bytes::from( @@ -50,7 +50,7 @@ pub fn accept_wrac_stream( if id == 0x01 { websocket.write(Message::Binary(Bytes::from(on_total_data( ctx.clone(), - addr.clone(), + addr, sent_size, )?)))?; websocket.flush()?; @@ -58,7 +58,7 @@ pub fn accept_wrac_stream( let client_has = String::from_utf8(data)?.parse()?; websocket.write(Message::Binary(Bytes::from(on_chunked_data( ctx.clone(), - addr.clone(), + addr, sent_size, client_has, )?)))?; @@ -66,7 +66,7 @@ pub fn accept_wrac_stream( } } } else if id == 0x01 { - on_send_message(ctx.clone(), addr.clone(), data)?; + on_send_message(ctx.clone(), addr, data)?; } else if id == 0x02 { let msg = String::from_utf8_lossy(&data).to_string(); @@ -83,7 +83,7 @@ pub fn accept_wrac_stream( }; if let Some(resp_id) = - on_send_auth_message(ctx.clone(), addr.clone(), name, password, text)? + on_send_auth_message(ctx.clone(), addr, name, password, text)? { websocket.write(Message::Binary(Bytes::from(vec![resp_id])))?; websocket.flush()?; @@ -96,12 +96,12 @@ pub fn accept_wrac_stream( let Some(name) = segments.next() else { return Ok(()); }; + let Some(password) = segments.next() else { return Ok(()); }; - if let Some(resp_id) = on_register_user(ctx.clone(), addr.clone(), name, password)? - { + if let Some(resp_id) = on_register_user(ctx.clone(), addr, name, password)? { websocket.write(Message::Binary(Bytes::from(vec![resp_id])))?; websocket.flush()?; }