diff --git a/src/chat/gui.rs b/src/chat/gui.rs index 6f243a2..232e1fb 100644 --- a/src/chat/gui.rs +++ b/src/chat/gui.rs @@ -1,7 +1,6 @@ use std::sync::{Arc, mpsc::{channel, Receiver}}; use std::cell::RefCell; use std::time::{Duration, SystemTime}; -use std::error::Error; use std::thread; use chrono::Local; @@ -17,9 +16,8 @@ use gtk4::{ Overlay, Picture, ScrolledWindow, Settings, Window }; -use crate::{connect_rac, proto::{connect, read_messages}}; - -use super::{config::{default_max_messages, default_update_time, get_config_path, save_config, Config}, ctx::Context, on_send_message, parse_message}; +use super::{config::{default_max_messages, default_update_time, get_config_path, save_config, Config}, +ctx::Context, on_send_message, parse_message, print_message, recv_tick}; struct UiModel { chat_box: GtkBox, @@ -34,44 +32,6 @@ pub fn add_chat_message(ctx: Arc, message: String) { let _ = ctx.sender.read().unwrap().clone().unwrap().send(message); } -pub fn print_message(ctx: Arc, message: String) -> Result<(), Box> { - ctx.add_message(ctx.config(|o| o.max_messages), vec![message.clone()]); - add_chat_message(ctx.clone(), message); - Ok(()) -} - -pub fn recv_tick(ctx: Arc) -> Result<(), Box> { - match read_messages( - connect_rac!(ctx), - ctx.config(|o| o.max_messages), - ctx.packet_size(), - !ctx.config(|o| o.ssl_enabled), - ctx.config(|o| o.chunked_enabled) - ) { - Ok(Some((messages, size))) => { - if ctx.config(|o| o.chunked_enabled) { - ctx.add_messages_packet(ctx.config(|o| o.max_messages), messages.clone(), size); - for msg in messages { - add_chat_message(ctx.clone(), msg.clone()); - } - } else { - ctx.put_messages_packet(ctx.config(|o| o.max_messages), messages.clone(), size); - for msg in messages { - add_chat_message(ctx.clone(), msg.clone()); - } - } - }, - Err(e) => { - let msg = format!("Read messages error: {}", e.to_string()).to_string(); - ctx.add_message(ctx.config(|o| o.max_messages), vec![msg.clone()]); - add_chat_message(ctx.clone(), msg.clone()); - } - _ => {} - } - thread::sleep(Duration::from_millis(ctx.config(|o| o.update_time) as u64)); - Ok(()) -} - fn load_pixbuf(data: &[u8]) -> Pixbuf { let loader = PixbufLoader::new(); loader.write(data).unwrap(); @@ -615,23 +575,23 @@ fn build_ui(ctx: Arc, app: &Application) -> UiModel { } } +fn run_recv_loop(ctx: Arc) { + thread::spawn(move || { + loop { + if let Err(e) = recv_tick(ctx.clone()) { + let _ = print_message(ctx.clone(), format!("Print messages error: {}", e.to_string()).to_string()); + thread::sleep(Duration::from_secs(1)); + } + } + }); +} + fn setup(ctx: Arc, ui: UiModel) { let (sender, receiver) = channel(); *ctx.sender.write().unwrap() = Some(Arc::new(sender)); - thread::spawn({ - let ctx = ctx.clone(); - - move || { - loop { - if let Err(e) = recv_tick(ctx.clone()) { - let _ = print_message(ctx.clone(), format!("Print messages error: {}", e.to_string()).to_string()); - thread::sleep(Duration::from_secs(1)); - } - } - } - }); + run_recv_loop(ctx.clone()); let (tx, rx) = channel(); diff --git a/src/chat/mod.rs b/src/chat/mod.rs index f9e1166..c932c0b 100644 --- a/src/chat/mod.rs +++ b/src/chat/mod.rs @@ -1,7 +1,5 @@ use std::{ - error::Error, - sync::Arc, - time::{SystemTime, UNIX_EPOCH} + error::Error, sync::Arc, thread, time::{Duration, SystemTime, UNIX_EPOCH} }; use crate::{connect_rac, proto::{register_user, send_message_auth}}; @@ -11,15 +9,13 @@ use super::{ util::sanitize_text }; +use gui::add_chat_message; use lazy_static::lazy_static; use regex::Regex; use ctx::Context; -pub use gui::{ - print_message, - run_main_loop -}; +pub use gui::run_main_loop; lazy_static! { @@ -163,6 +159,44 @@ pub fn prepare_message(ctx: Arc, message: &str) -> String { ) } +pub fn print_message(ctx: Arc, message: String) -> Result<(), Box> { + ctx.add_message(ctx.config(|o| o.max_messages), vec![message.clone()]); + add_chat_message(ctx.clone(), message); + Ok(()) +} + +pub fn recv_tick(ctx: Arc) -> Result<(), Box> { + match read_messages( + connect_rac!(ctx), + ctx.config(|o| o.max_messages), + ctx.packet_size(), + !ctx.config(|o| o.ssl_enabled), + ctx.config(|o| o.chunked_enabled) + ) { + Ok(Some((messages, size))) => { + if ctx.config(|o| o.chunked_enabled) { + ctx.add_messages_packet(ctx.config(|o| o.max_messages), messages.clone(), size); + for msg in messages { + add_chat_message(ctx.clone(), msg.clone()); + } + } else { + ctx.put_messages_packet(ctx.config(|o| o.max_messages), messages.clone(), size); + for msg in messages { + add_chat_message(ctx.clone(), msg.clone()); + } + } + }, + Err(e) => { + let msg = format!("Read messages error: {}", e.to_string()).to_string(); + ctx.add_message(ctx.config(|o| o.max_messages), vec![msg.clone()]); + add_chat_message(ctx.clone(), msg.clone()); + } + _ => {} + } + thread::sleep(Duration::from_millis(ctx.config(|o| o.update_time) as u64)); + Ok(()) +} + pub fn on_send_message(ctx: Arc, message: &str) -> Result<(), Box> { if message.starts_with("/") && ctx.config(|o| o.commands_enabled) { on_command(ctx.clone(), &message)?;