diff --git a/src/app/widgets.rs b/src/app/widgets.rs index e21aacf..cc61d57 100644 --- a/src/app/widgets.rs +++ b/src/app/widgets.rs @@ -1,4 +1,4 @@ -use std::sync::LazyLock; +use std::{net::Ipv4Addr, sync::LazyLock}; use jocalsend::ReceiveRequest; use log::LevelFilter; @@ -146,7 +146,11 @@ impl Widget for &mut App { footer_right.inner(footer_margin), buf, ); - NetworkInfoWidget.render(footer_left.inner(footer_margin), buf); + network_info( + &self.service.config.local_ip_addr, + footer_left.inner(footer_margin), + buf, + ); receive_requests( &rx_reqs, &mut self.receiving_state, @@ -354,52 +358,41 @@ fn peers(peers: &[Peer], state: &mut ListState, area: Rect, buf: &mut Buffer) { ratatui::widgets::StatefulWidget::render(list, area, buf, state); } -#[derive(Debug, Clone)] -pub struct NetworkInfoWidget; +fn network_info(local_ip_addr: &Ipv4Addr, area: Rect, buf: &mut Buffer) { + let local_addr = format!("{local_ip_addr:?}:{}", jocalsend::DEFAULT_PORT); + let local_addr = local_addr.to_line().right_aligned(); -impl Widget for NetworkInfoWidget { - fn render(self, area: Rect, buf: &mut Buffer) - where - Self: Sized, - { - let udp = "UDP socket"; - let udp = udp.to_line().left_aligned(); - let uaddr = format!("{:?}", jocalsend::LISTENING_SOCKET_ADDR); - let udp = Row::new(vec![udp, uaddr.to_line().right_aligned()]).yellow(); + let http = "HTTP address"; + let http = Row::new(vec![http.to_line().left_aligned(), local_addr.clone()]).yellow(); - let mip = format!( - "{:?}:{:?}", - jocalsend::MULTICAST_IP, - jocalsend::DEFAULT_PORT - ); - let multicast = "Multicast address"; - let multicast = Row::new(vec![ - multicast.to_line().left_aligned(), - mip.to_line().right_aligned(), - ]) - .yellow(); + let udp = "UDP socket"; + let udp = udp.to_line().left_aligned(); + let udp = Row::new(vec![udp, local_addr]).yellow(); - let haddr = format!("{:?}", jocalsend::LISTENING_SOCKET_ADDR); - let http = "HTTP address"; - let http = Row::new(vec![ - http.to_line().left_aligned(), - haddr.to_line().right_aligned(), - ]) - .yellow(); + let mip = format!( + "{:?}:{:?}", + jocalsend::MULTICAST_IP, + jocalsend::DEFAULT_PORT + ); + let multicast = "Multicast address"; + let multicast = Row::new(vec![ + multicast.to_line().left_aligned(), + mip.to_line().right_aligned(), + ]) + .yellow(); - let rows = vec![udp, multicast, http]; - let widths = vec![Constraint::Percentage(50), Constraint::Percentage(50)]; + let rows = vec![http, udp, multicast]; + let widths = vec![Constraint::Percentage(50), Constraint::Percentage(50)]; - let title = Line::from(" Listeners ".bold()).centered(); + let title = Line::from(" Listeners ".bold()).centered(); - let block = Block::default() - .title(title) - .borders(Borders::all()) - .padding(Padding::uniform(1)); + let block = Block::default() + .title(title) + .borders(Borders::all()) + .padding(Padding::uniform(1)); - let table = Table::new(rows, widths).block(block); - table.render(area, buf); - } + let table = Table::new(rows, widths).block(block); + table.render(area, buf); } // helpers diff --git a/src/lib.rs b/src/lib.rs index a4c0506..a0c1c25 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,11 +7,13 @@ pub mod transfer; use std::{ collections::BTreeMap, fmt::Debug, - net::{Ipv4Addr, SocketAddr, SocketAddrV4}, + net::{IpAddr, Ipv4Addr, SocketAddr, SocketAddrV4}, sync::{Arc, OnceLock}, }; +use error::LocalSendError; use julid::Julid; +use local_ip_address::local_ip; use log::error; use models::{Device, FileMetadata}; use serde::{Deserialize, Serialize}; @@ -195,18 +197,22 @@ pub struct Config { pub multicast_addr: SocketAddrV4, pub port: u16, pub download_dir: String, - pub local_ip_addr: SocketAddr, + pub local_ip_addr: Ipv4Addr, } -impl Default for Config { - fn default() -> Self { +impl Config { + pub fn new() -> error::Result { let home = std::env::home_dir().unwrap_or("/tmp".into()); let dd = home.join("jocalsend-downloads"); - Self { + let IpAddr::V4(local_ip_addr) = local_ip()? else { + return Err(LocalSendError::IPv6Unsupported); + }; + + Ok(Self { multicast_addr: SocketAddrV4::new(MULTICAST_IP, DEFAULT_PORT), port: DEFAULT_PORT, download_dir: dd.to_string_lossy().into(), - local_ip_addr: ([0u8; 4], DEFAULT_PORT).into(), - } + local_ip_addr, + }) } } diff --git a/src/main.rs b/src/main.rs index 4f84b0a..90edd65 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use jocalsend::{Config, JocalService, Listeners, error, models::Device}; +use jocalsend::{Config, JocalService, Listeners, error::Result, models::Device}; use log::{error, info}; use ratatui::DefaultTerminal; use tokio::{sync::mpsc::unbounded_channel, task::JoinSet}; @@ -7,7 +7,7 @@ use tui_logger::{LevelFilter, init_logger, set_env_filter_from_env}; mod app; use app::{App, CurrentScreen, Peer}; -fn main() -> error::Result<()> { +fn main() -> Result<()> { let device = Device::default(); if std::env::var("RUST_LOG").is_err() { @@ -18,7 +18,7 @@ fn main() -> error::Result<()> { init_logger(LevelFilter::Info).map_err(|e| std::io::Error::other(format!("{e}")))?; set_env_filter_from_env(None); - let config = Config::default(); + let config = Config::new()?; let mut terminal = ratatui::init(); let result = start_and_run(&mut terminal, config, device); @@ -32,7 +32,7 @@ async fn start_and_run( terminal: &mut DefaultTerminal, config: Config, device: Device, -) -> error::Result<()> { +) -> Result<()> { let (event_tx, event_listener) = unbounded_channel(); let service = JocalService::new(device, config.clone(), event_tx)