feat!: wishlist, upload-queue privilege recognition, and search filters (#20)
Closes the last two gaps in Soulseek's list of features an alternative client must implement to be tolerated, and adds the result filters Nicotine+ has had all along. Wishlist: server code 103 is sent and code 104's announced interval is kept rather than logged and discarded, so the re-search timer runs off the schedule the server set. `wish add|remove|list|run` plus `serve --wishlist`; wishes persist in config.toml as a TOML array so a comma inside a query survives. `wish run` prints search-shaped records, so it pipes into `download --stdin`. Privilege recognition: the code-69 user list is parsed instead of counted and dropped, and code 92 answers `whoami` as `privilege_seconds`. Uploads now go through a queue with a slot cap (`--upload-slots`, default 2) that serves privileged users first — the cap is what makes the ordering mean anything, so they are one change. `PlaceInQueueRequest` (peer code 51) is answered, where it previously had no handler at all, and a departed peer's slot is released so a stalled peer cannot wedge uploads shut. Search filters: `--exclude`, `--extension`, `--min-size`, `--max-size` beside the existing `--min-bitrate` and `--free-slots`, in one flattened arg group shared by `search`, `get` and `wish run`. Also serialises the library e2e suite behind the same gate `cli_e2e` already uses: the new queue tests hold peer sockets open on purpose, which starved concurrently-spawned soulfinds and failed unrelated download tests with `login: Timeout`. BREAKING CHANGE: `UploadStatus` gains a `Queued(u32)` variant, so an exhaustive match on it no longer compiles, and `cli::Commands` gains `Wish`.
This commit is contained in:
+29
-1
@@ -8,7 +8,10 @@ mod port_mapping;
|
||||
mod ui;
|
||||
|
||||
use clap::Parser;
|
||||
use cli::{Cli, Commands, ConfigCommand, SharesCommand, parse_server_address};
|
||||
use cli::{
|
||||
Cli, Commands, ConfigCommand, SharesCommand, WishCommand,
|
||||
parse_server_address,
|
||||
};
|
||||
use commands::Ctx;
|
||||
use output::{CliError, CliResult, Exit, Out};
|
||||
use soulseek_rs::{ClientSettings, ClientVersion, PeerAddress};
|
||||
@@ -93,6 +96,15 @@ fn run(mut cli: Cli, out: &Out) -> CliResult {
|
||||
Commands::Shares(SharesCommand::Remove { ref directory }) => {
|
||||
return commands::settings::shares_remove(out, &store, directory);
|
||||
}
|
||||
Commands::Wish(WishCommand::Add { ref query }) => {
|
||||
return commands::wish::add(out, &store, query);
|
||||
}
|
||||
Commands::Wish(WishCommand::Remove { ref query }) => {
|
||||
return commands::wish::remove(out, &store, query);
|
||||
}
|
||||
Commands::Wish(WishCommand::List) => {
|
||||
return commands::wish::list(out, &store);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
@@ -104,6 +116,22 @@ fn run(mut cli: Cli, out: &Out) -> CliResult {
|
||||
Commands::Shares(SharesCommand::Reindex) => {
|
||||
commands::settings::shares_reindex(&ctx)
|
||||
}
|
||||
Commands::Wish(WishCommand::Run(ref args)) => {
|
||||
commands::wish::run(&ctx, &store, args)
|
||||
}
|
||||
Commands::Serve(ref args) => {
|
||||
let sweeper = args
|
||||
.wishlist
|
||||
.then(|| commands::wish::Sweeper::new(store.config.wishes()))
|
||||
.flatten();
|
||||
if args.wishlist && sweeper.is_none() {
|
||||
out.warn(
|
||||
"--wishlist has nothing to look for; add one with \
|
||||
`wish add QUERY`",
|
||||
);
|
||||
}
|
||||
commands::peer::serve(&ctx, args, sweeper)
|
||||
}
|
||||
other => commands::run(&ctx, other),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user