feat(cli): add 'browse <username>' to list a user's shared files

soulseek-rs browse <username> connects, logs in, requests the peer's file
list and prints the directories and files it shares.
This commit is contained in:
michel
2026-07-19 18:57:14 +02:00
parent f3218475dc
commit 7d8a435d25
2 changed files with 57 additions and 0 deletions
+6
View File
@@ -98,6 +98,12 @@ pub enum Commands {
/// Message text to send
message: String,
},
/// Browse another user's shared files
Browse {
/// Username whose shares to list
username: String,
},
}
pub fn parse_server_address(server: &str) -> color_eyre::Result<(String, u16)> {
+51
View File
@@ -104,6 +104,17 @@ fn main() -> Result<()> {
&recipient,
&message,
),
Some(Commands::Browse { username: target }) => browse_user(
&ClientSettings {
username,
password,
server_address: PeerAddress::new(server_host, server_port),
enable_listen: !cli.disable_listener,
listen_port: cli.listener_port,
shared_directory,
},
&target,
),
None => {
use ratatui::crossterm::{
event::EnableMouseCapture,
@@ -154,6 +165,46 @@ fn main() -> Result<()> {
}
}
fn browse_user(settings: &ClientSettings, target: &str) -> Result<()> {
use std::time::Instant;
let mut client = Client::with_settings(settings.clone());
client
.connect()
.map_err(|e| color_eyre::eyre::eyre!("Failed to connect: {}", e))?;
if !client
.login()
.map_err(|e| color_eyre::eyre::eyre!("Failed to login: {}", e))?
{
return Err(color_eyre::eyre::eyre!("Login rejected by server"));
}
client
.browse_user(target)
.map_err(|e| color_eyre::eyre::eyre!("Failed to browse: {}", e))?;
println!("📂 Requesting shared files from {target}...");
let deadline = Instant::now() + Duration::from_secs(20);
while Instant::now() < deadline {
if let Some(directories) = client.take_browse_result(target) {
if directories.is_empty() {
println!("({target} shares nothing)");
}
for directory in directories {
println!("\n{}/", directory.name);
for (name, size) in directory.files {
println!(" {name} ({size} bytes)");
}
}
return Ok(());
}
std::thread::sleep(Duration::from_millis(200));
}
Err(color_eyre::eyre::eyre!(
"Timed out waiting for {target}'s file list"
))
}
fn send_private_message(
settings: &ClientSettings,
recipient: &str,