From 4d136b577ac4de244a216ddd40494be295c508ff Mon Sep 17 00:00:00 2001 From: Eric Lynema Date: Tue, 15 Jul 2025 13:00:14 -0400 Subject: [PATCH] feat: move mqtt configuration to config.ini --- .gitignore | 1 + Cargo.lock | 154 +++++++++++++++++++++++++++++++++++++--------------- Cargo.toml | 14 +++-- src/main.rs | 25 ++++++++- 4 files changed, 141 insertions(+), 53 deletions(-) diff --git a/.gitignore b/.gitignore index ea8c4bf..058dcb6 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +config.ini diff --git a/Cargo.lock b/Cargo.lock index 2c44d93..360ec3f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -44,6 +44,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "bitflags" version = "2.9.1" @@ -99,6 +105,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "configparser" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57e3272f0190c3f1584272d613719ba5fc7df7f4942fe542e63d949cf3a649b" + [[package]] name = "core-foundation" version = "0.9.4" @@ -170,12 +182,65 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + [[package]] name = "futures-core" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "futures-sink" version = "0.3.31" @@ -194,8 +259,13 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ + "futures-channel", "futures-core", + "futures-io", + "futures-macro", + "futures-sink", "futures-task", + "memchr", "pin-project-lite", "pin-utils", "slab", @@ -246,6 +316,15 @@ dependencies = [ "libc", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.13.0" @@ -445,20 +524,19 @@ dependencies = [ [[package]] name = "ratatui" -version = "0.27.0" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16546c5b5962abf8ce6e2881e722b4e0ae3b6f1a08a26ae3573c55853ca68d3" +checksum = "f44c9e68fd46eda15c646fbb85e1040b657a58cdc8c98db1d97a55930d991eef" dependencies = [ "bitflags", "cassowary", "compact_str", "crossterm", - "itertools", + "itertools 0.12.1", "lru", "paste", "stability", "strum", - "strum_macros", "unicode-segmentation", "unicode-truncate", "unicode-width", @@ -489,9 +567,9 @@ dependencies = [ [[package]] name = "rumqttc" -version = "0.24.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1568e15fab2d546f940ed3a21f48bbbd1c494c90c99c4481339364a497f94a9" +checksum = "8d8941c6791801b667d52bfe9ff4fc7c968d4f3f9ae8ae7abdaaa1c966feafc8" dependencies = [ "bytes", "flume", @@ -513,57 +591,44 @@ checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" [[package]] name = "rustls" -version = "0.22.4" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", "ring", - "rustls-pki-types", "rustls-webpki", - "subtle", - "zeroize", + "sct", ] [[package]] name = "rustls-native-certs" -version = "0.7.3" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ "openssl-probe", "rustls-pemfile", - "rustls-pki-types", "schannel", "security-framework", ] [[package]] name = "rustls-pemfile" -version = "2.2.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" -dependencies = [ - "zeroize", + "base64", ] [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ "ring", - "rustls-pki-types", "untrusted", ] @@ -594,6 +659,16 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "security-framework" version = "2.11.1" @@ -754,12 +829,6 @@ dependencies = [ "syn", ] -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - [[package]] name = "syn" version = "2.0.104" @@ -824,12 +893,11 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.25.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ "rustls", - "rustls-pki-types", "tokio", ] @@ -848,7 +916,9 @@ dependencies = [ name = "tui-mqtt-chat" version = "0.1.0" dependencies = [ + "configparser", "crossterm", + "futures", "rand", "ratatui", "rumqttc", @@ -876,7 +946,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" dependencies = [ - "itertools", + "itertools 0.13.0", "unicode-segmentation", "unicode-width", ] @@ -1088,9 +1158,3 @@ dependencies = [ "quote", "syn", ] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/Cargo.toml b/Cargo.toml index 791ebf9..dd92d3f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,11 +4,13 @@ version = "0.1.0" edition = "2021" [dependencies] -ratatui = { version = "0.27.0", features = ["crossterm"] } +configparser = "3.0.4" crossterm = { version = "0.27.0", features = ["event-stream"] } -rumqttc = "0.24.0" -tokio = { version = "1.38.0", features = ["full"] } -tokio-stream = "0.1.15" +futures = "0.3.30" rand = "0.8.5" -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" +ratatui = { version = "0.26.1", features = ["crossterm"] } +rumqttc = "0.23.0" +serde = { version = "1.0.197", features = ["derive"] } +serde_json = "1.0.115" +tokio = { version = "1.36.0", features = ["full"] } +tokio-stream = "0.1.15" diff --git a/src/main.rs b/src/main.rs index 6348851..577eb64 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,11 +5,12 @@ use crossterm::{ }; use ratatui::{prelude::*, widgets::*}; use rumqttc::{AsyncClient, MqttOptions, QoS}; -use std::{io, time::Duration}; +use std::{io, time::Duration, path::Path}; use tokio::sync::mpsc; use tokio_stream::StreamExt; use rand::Rng; use serde::{Deserialize, Serialize}; +use configparser::ini::Ini; #[derive(Debug, Serialize, Deserialize)] struct ChatMessage { @@ -81,8 +82,28 @@ async fn main() -> Result<(), Box> { async fn run_app(terminal: &mut Terminal, mut app: App) -> io::Result<()> { let (tx, mut rx) = mpsc::channel::<(String, String)>(100); - let mut mqttoptions = MqttOptions::new(app.username.clone(), "172.16.0.3", 1883); + let mut config = Ini::new(); + let config_path = "config.ini"; + + if !Path::new(config_path).exists() { + config.set("mqtt", "server", Some("172.16.0.3".to_owned())); + config.set("mqtt", "port", Some("1883".to_owned())); + config.set("mqtt", "username", Some("".to_owned())); + config.set("mqtt", "password", Some("".to_owned())); + config.write(config_path).unwrap(); + } + + let map = config.load(config_path).unwrap(); + let server = map.get("mqtt").unwrap().get("server").unwrap().clone().unwrap(); + let port = map.get("mqtt").unwrap().get("port").unwrap().clone().unwrap().parse::().unwrap(); + let username = map.get("mqtt").unwrap().get("username").unwrap().clone().unwrap(); + let password = map.get("mqtt").unwrap().get("password").unwrap().clone().unwrap(); + + let mut mqttoptions = MqttOptions::new(app.username.clone(), server, port); mqttoptions.set_keep_alive(Duration::from_secs(5)); + if !username.is_empty() { + mqttoptions.set_credentials(username, password); + } let (client, mut eventloop) = AsyncClient::new(mqttoptions, 10); client.subscribe(&format!("chat/{}", app.current_room), QoS::AtMostOnce).await.unwrap();