From 5dec68218e500e281919d4e32c435e30dd96d564 Mon Sep 17 00:00:00 2001 From: matteodev8 Date: Fri, 24 Jan 2025 12:58:49 +0100 Subject: [PATCH] chore: cargo format --- src/main.rs | 13 ++- src/net/keep_alive.rs | 15 ++-- src/net/mod.rs | 2 +- src/net/recv.rs | 23 ++--- src/net/send.rs | 23 +++-- src/tui/app.rs | 202 +++++++++++++++++++++--------------------- src/tui/formatter.rs | 43 ++++++--- src/tui/mod.rs | 2 +- src/tui/ui.rs | 41 ++++----- src/util/mod.rs | 2 +- src/util/terminal.rs | 6 +- 11 files changed, 192 insertions(+), 180 deletions(-) diff --git a/src/main.rs b/src/main.rs index 004a212..f5553ee 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,28 +1,27 @@ -use std::io::{stdout, Result}; use std::env; +use std::io::{stdout, Result}; use ratatui::prelude::*; -use crossterm::terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}; +use crossterm::terminal::{enable_raw_mode, EnterAlternateScreen}; use crossterm::ExecutableCommand; use crate::tui::app::App; -mod tui; mod net; +mod tui; mod util; -fn main() -> Result<()> { +fn main() -> Result<()> { let args: Vec = env::args().collect(); - + let default_addr = String::from("127.0.0.1"); - + let address = args.get(1).unwrap_or(&default_addr); let port: u16 = args.get(2).map_or(52800, |p| p.parse().unwrap_or(52800)); let host = (address.clone(), port); - enable_raw_mode()?; let mut terminal = Terminal::new(CrosstermBackend::new(stdout()))?; diff --git a/src/net/keep_alive.rs b/src/net/keep_alive.rs index 532e853..18e1249 100644 --- a/src/net/keep_alive.rs +++ b/src/net/keep_alive.rs @@ -1,17 +1,16 @@ -use std::net::TcpStream; use stblib::colors::{BOLD, C_RESET, RED}; use stblib::stbchat::net::OutgoingPacketStream; use stblib::stbchat::packet::ServerPacket; +use std::net::TcpStream; pub fn keep_alive(mut server: OutgoingPacketStream) { loop { stblib::utilities::sleep(30); - server.write(ServerPacket::KeepAlive) - .unwrap_or_else(|_| { - eprintln!( - "{BOLD}{RED}An error occurred when sending Keep Alive to the server.\n\ + server.write(ServerPacket::KeepAlive).unwrap_or_else(|_| { + eprintln!( + "{BOLD}{RED}An error occurred when sending Keep Alive to the server.\n\ Could it be that the connection to the server has been lost?{C_RESET}" - ); - }); + ); + }); } -} \ No newline at end of file +} diff --git a/src/net/mod.rs b/src/net/mod.rs index 5dbf500..e53fca2 100644 --- a/src/net/mod.rs +++ b/src/net/mod.rs @@ -1,3 +1,3 @@ +pub mod keep_alive; pub mod recv; pub mod send; -pub mod keep_alive; \ No newline at end of file diff --git a/src/net/recv.rs b/src/net/recv.rs index 9e15580..0f77cd7 100644 --- a/src/net/recv.rs +++ b/src/net/recv.rs @@ -1,11 +1,10 @@ -use std::sync::Arc; use std::net::TcpStream; use std::sync::mpsc::Sender; +use std::sync::Arc; use stblib::stbchat::net::IncomingPacketStream; use stblib::stbchat::packet::ClientPacket; - use crate::tui::app::{AppEvent, AppState, Views}; use crate::tui::formatter::{badge_handler, MessageFormatter}; @@ -19,9 +18,13 @@ pub fn recv( loop { match r_server.read::() { - Ok(ClientPacket::SystemMessage { message}) => { - app_state.write().unwrap().messages.push(formatter.system(message)); - }, + Ok(ClientPacket::SystemMessage { message }) => { + app_state + .write() + .unwrap() + .messages + .push(formatter.system(message)); + } Ok(ClientPacket::UserMessage { author, message }) => { app_state.write().unwrap().messages.push(formatter.user( @@ -29,17 +32,17 @@ pub fn recv( author.nickname, author.role_color, badge_handler(author.badge), - message + message, )); - }, + } - Ok(ClientPacket::Event { event_type}) => { + Ok(ClientPacket::Event { event_type }) => { if event_type == "event.login" { app_state.write().unwrap().current_view = Views::Authentication; } } Err(_) => break, - _ => () + _ => (), } } -} \ No newline at end of file +} diff --git a/src/net/send.rs b/src/net/send.rs index eb9a009..3bc8989 100644 --- a/src/net/send.rs +++ b/src/net/send.rs @@ -9,17 +9,19 @@ use crate::tui::app::AppEvent; pub fn send( mut w_server: OutgoingPacketStream, rx: Receiver, - rx_login: Receiver<(String, String, String)> + rx_login: Receiver<(String, String, String)>, ) { let tx_data = rx_login.recv().unwrap(); if tx_data.0 == "event.login" { - w_server.write(ServerPacket::Login { - username: tx_data.1, - password: tx_data.2 - }).unwrap(); + w_server + .write(ServerPacket::Login { + username: tx_data.1, + password: tx_data.2, + }) + .unwrap(); } - + loop { let message = rx.recv().unwrap_or_else(|_| { println!("Client closed connection"); @@ -28,13 +30,8 @@ pub fn send( match message { AppEvent::SendMessage(message) => { - w_server.write( - ServerPacket::Message { - message - }) - .unwrap(); + w_server.write(ServerPacket::Message { message }).unwrap(); } } } - -} \ No newline at end of file +} diff --git a/src/tui/app.rs b/src/tui/app.rs index 7859fe0..c2ad91a 100644 --- a/src/tui/app.rs +++ b/src/tui/app.rs @@ -1,21 +1,21 @@ +use std::net::TcpStream; +use std::sync::mpsc::channel; use std::sync::{Arc, RwLock}; use std::time::Duration; -use std::net::TcpStream; -use std::sync::mpsc::{channel}; use crossterm::event; use crossterm::event::{Event, KeyCode}; use ratatui::backend::Backend; use ratatui::style::{Color, Style}; -use ratatui::Terminal; use ratatui::widgets::{Block, Borders}; +use ratatui::Terminal; use stblib::stbchat::net::{IncomingPacketStream, OutgoingPacketStream}; use tui_textarea::TextArea; -use crate::{net, util}; use crate::tui::app::AppEvent::SendMessage; +use crate::{net, util}; #[derive(Default, Clone)] pub struct App { @@ -39,7 +39,7 @@ pub enum Views { #[default] MainView, Menu, - Authentication + Authentication, } pub enum AppEvent { @@ -71,7 +71,7 @@ impl App { password_input.set_cursor_line_style(Style::default()); password_input.set_placeholder_text("Password"); password_input.set_mask_char('*'); - + self.address = host.0; self.port = host.1; @@ -81,13 +81,16 @@ impl App { Ok(tcp_stream) => tcp_stream, Err(_) => { util::terminal::cleanup(); - eprintln!("Server {}:{} is unreachable. Check if the server is online.", self.address, self.port); + eprintln!( + "Server {}:{} is unreachable. Check if the server is online.", + self.address, self.port + ); std::process::exit(1); } }; let (r_server, w_server) = (stream.try_clone().unwrap(), stream.try_clone().unwrap()); - + let keep_alive_stream = OutgoingPacketStream::wrap(stream.try_clone().unwrap()); let r_server = IncomingPacketStream::wrap(r_server); @@ -95,124 +98,119 @@ impl App { let state_clone = self.state.clone(); - std::thread::spawn(|| { net::recv::recv(r_server, tx_recv, utx, state_clone) }); - std::thread::spawn(|| { net::send::send(w_server, rx_send, rx) }); + std::thread::spawn(|| net::recv::recv(r_server, tx_recv, utx, state_clone)); + std::thread::spawn(|| net::send::send(w_server, rx_send, rx)); - std::thread::spawn(|| { net::keep_alive::keep_alive(keep_alive_stream) }); + std::thread::spawn(|| net::keep_alive::keep_alive(keep_alive_stream)); self.selected_text_field = String::from("username"); loop { - terminal.draw(|frame| self.main_ui(frame, &mut input, &mut username_input, &mut password_input)).unwrap(); + terminal + .draw(|frame| { + self.main_ui(frame, &mut input, &mut username_input, &mut password_input) + }) + .unwrap(); if !event::poll(Duration::from_millis(100)).expect("Failed to poll event") { continue; } - + if let Event::Key(key) = event::read().expect("Failed to read event") { let current_view = self.state.read().unwrap().current_view; match current_view { - Views::MainView => { - match key.code { - KeyCode::Enter => { - let message = input.lines()[0].clone(); - tx_send.send(SendMessage(message)).unwrap(); - - input = TextArea::default(); - input.set_block(Block::default().borders(Borders::ALL)); - input.set_cursor_line_style(Style::default()); - input.set_placeholder_text("Message..."); - - } - KeyCode::Esc => { self.state.write().unwrap().current_view = Views::Menu }, - KeyCode::Down => { - let mut new_selected = Some(self.selected.unwrap_or(0).saturating_sub(1)); - if new_selected == Some(0) { - new_selected = None - } - self.selected = new_selected - }, - KeyCode::Up => { - let mut new_selected = Some(self.selected.unwrap_or(0) + 1); - - if new_selected > Some(self.state.read().unwrap().messages.len()) { - new_selected = None - } - self.selected = new_selected - }, - KeyCode::PageUp => { - self.selected = Some(self.state.read().unwrap().messages.len()) + Views::MainView => match key.code { + KeyCode::Enter => { + let message = input.lines()[0].clone(); + tx_send.send(SendMessage(message)).unwrap(); + + input = TextArea::default(); + input.set_block(Block::default().borders(Borders::ALL)); + input.set_cursor_line_style(Style::default()); + input.set_placeholder_text("Message..."); + } + KeyCode::Esc => self.state.write().unwrap().current_view = Views::Menu, + KeyCode::Down => { + let mut new_selected = + Some(self.selected.unwrap_or(0).saturating_sub(1)); + if new_selected == Some(0) { + new_selected = None } - KeyCode::PageDown => { - self.selected = Some(1) + self.selected = new_selected + } + KeyCode::Up => { + let mut new_selected = Some(self.selected.unwrap_or(0) + 1); + + if new_selected > Some(self.state.read().unwrap().messages.len()) { + new_selected = None } - _ => { - input.input(key); - }, + self.selected = new_selected } - } - Views::Menu => { - match key.code { - KeyCode::Char('q') => { - tx_send.send(SendMessage("/exit".to_string())).unwrap(); - return - }, - KeyCode::Esc => { self.state.write().unwrap().current_view = Views::default() }, - _ => {} + KeyCode::PageUp => { + self.selected = Some(self.state.read().unwrap().messages.len()) } - - } - Views::Authentication => { - match key.code { - KeyCode::Esc => { self.state.write().unwrap().current_view = Views::default(); }, - KeyCode::Up => { - self.selected_text_field = String::from("username"); - password_input.set_cursor_style(Style::default()); - username_input.set_cursor_style(Style::default().bg(Color::White)) - }, - KeyCode::Down => { + KeyCode::PageDown => self.selected = Some(1), + _ => { + input.input(key); + } + }, + Views::Menu => match key.code { + KeyCode::Char('q') => { + tx_send.send(SendMessage("/exit".to_string())).unwrap(); + return; + } + KeyCode::Esc => self.state.write().unwrap().current_view = Views::default(), + _ => {} + }, + Views::Authentication => match key.code { + KeyCode::Esc => { + self.state.write().unwrap().current_view = Views::default(); + } + KeyCode::Up => { + self.selected_text_field = String::from("username"); + password_input.set_cursor_style(Style::default()); + username_input.set_cursor_style(Style::default().bg(Color::White)) + } + KeyCode::Down => { + self.selected_text_field = String::from("password"); + username_input.set_cursor_style(Style::default()); + password_input.set_cursor_style(Style::default().bg(Color::White)) + } + KeyCode::Tab => match self.selected_text_field.as_str() { + "username" => { self.selected_text_field = String::from("password"); username_input.set_cursor_style(Style::default()); password_input.set_cursor_style(Style::default().bg(Color::White)) - }, - KeyCode::Tab => { - match self.selected_text_field.as_str() { - "username" => { - self.selected_text_field = String::from("password"); - username_input.set_cursor_style(Style::default()); - password_input.set_cursor_style(Style::default().bg(Color::White)) - }, - "password" => { - self.selected_text_field = String::from("username"); - password_input.set_cursor_style(Style::default()); - username_input.set_cursor_style(Style::default().bg(Color::White)) - } - _ => {} - } } - KeyCode::Enter => { - let (username, password) = ( - username_input.lines()[0].clone(), - password_input.lines()[0].clone() - ); - - tx.send(("event.login".to_string(), username, password)).unwrap(); - - self.state.write().unwrap().current_view = Views::default(); - }, - _ => { - if self.selected_text_field == "username" { - username_input.input(key); - } - else { - password_input.input(key); - } + "password" => { + self.selected_text_field = String::from("username"); + password_input.set_cursor_style(Style::default()); + username_input.set_cursor_style(Style::default().bg(Color::White)) + } + _ => {} + }, + KeyCode::Enter => { + let (username, password) = ( + username_input.lines()[0].clone(), + password_input.lines()[0].clone(), + ); + + tx.send(("event.login".to_string(), username, password)) + .unwrap(); + + self.state.write().unwrap().current_view = Views::default(); + } + _ => { + if self.selected_text_field == "username" { + username_input.input(key); + } else { + password_input.input(key); } } - } + }, } } } } -} \ No newline at end of file +} diff --git a/src/tui/formatter.rs b/src/tui/formatter.rs index 475c976..1cee793 100644 --- a/src/tui/formatter.rs +++ b/src/tui/formatter.rs @@ -1,10 +1,10 @@ -use std::collections::HashMap; use stblib::colors::*; +use std::collections::HashMap; #[derive(Clone, Copy, Default)] pub enum MessageFormats { #[default] - Default + Default, } pub type MessageFormat = HashMap<&'static str, (String, String, String)>; @@ -34,48 +34,63 @@ impl MessageFormatter { let format = match fmt { "default" => MessageFormats::Default, - &_ => MessageFormats::Default + &_ => MessageFormats::Default, }; let format_str = match format { - MessageFormats::Default => String::from("default") + MessageFormats::Default => String::from("default"), }; let formats = Self::load_formats(); - let current_format = formats.get_key_value(format_str.as_str()).unwrap().1.to_owned(); + let current_format = formats + .get_key_value(format_str.as_str()) + .unwrap() + .1 + .to_owned(); Self { format, format_str, formats, - current_format + current_format, } } - pub fn user(&self, username: String, nickname: String, role_color: String, badge: String, message: String) -> String { + pub fn user( + &self, + username: String, + nickname: String, + role_color: String, + badge: String, + message: String, + ) -> String { match nickname { - _ if username == nickname => self.current_format.1 + _ if username == nickname => self + .current_format + .1 .replace("[%