- Retry was broken for the common case: retry_selected_download removed the failed download only from the UI list, not the client's DownloadStore. Since Client::download re-derives the same md5 token from the unchanged filename, retrying a still-Failed download left a duplicate-token entry; the token-migration path then deleted both, misrouting completion so the retried file downloaded to disk but the UI showed 'Queued' forever. Add Client::remove_download / DownloadStore::remove_by_file (status-agnostic) and clear the stale entry before re-issuing. Regression-tested. - Chat-room member selection could point out of range: RoomEvent::UserLeft shrank the active room's member list without clamping user_selected, so the highlight silently shifted to the wrong user (or vanished, making 'b'/'m' no-ops, and blanking the member pane). Clamp user_selected after every applied room event. Regression-tested.
soulseek-rs-lib
A Rust library for implementing the Soulseek peer-to-peer protocol.
About
This library provides the core functionality for interacting with the Soulseek network. It can be used to build custom Soulseek clients or bots.
Usage
Add this to your Cargo.toml:
[dependencies]
soulseek-rs-lib = "0.1.0"
Example
Simple Usage
use soulseek_rs::Client;
use std::time::Duration;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create and connect to Soulseek server
let mut client = Client::new("username", "password");
client.connect();
client.login()?;
// Search for files
let results = client.search("Alex Kassian lifestream", Duration::from_secs(10))?;
// Download first available file
if let Some(result) = results.iter().find(|r| !r.files.is_empty()) {
let file = &result.files[0];
client.download(
file.name.clone(),
file.username.clone(),
file.size,
"~/Downloads".to_string(),
)?;
println!("Downloaded: {}", file.name);
}
Ok(())
}
Advanced Configuration
use soulseek_rs::{Client, ClientSettings, PeerAddress};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create client with custom settings
let settings = ClientSettings {
server_address: PeerAddress::new("server.slsknet.org".to_string(), 2242),
enable_listen: true,
listen_port: 3000,
..ClientSettings::new("username", "password")
};
let mut client = Client::with_settings(settings);
client.connect();
client.login()?;
Ok(())
}