An agent driving the binary could search, fetch and chat, but it could not be a peer: nothing kept a session online to serve files, nothing reported an upload, shares could only be set at startup, and there was no way to ask whether a peer was worth queueing to or to check credentials without doing something else. New commands: serve [--follow] stay online sharing; one record per upload whoami credentials, connection and what we offer user <NAME> a peer's presence and share counts room users <ROOM> the member roster shares list|add|remove|status|reindex config path|list|get|set `config` and `shares list|add|remove` need no account, so they run before the credential check — asking a script to log in for a `config get` would be a poor trade. `serve` is the only place uploads are visible: they live in the process serving them, so a one-shot `uploads list` could print nothing but an empty list. Library additions, all request/poll pairs matching the existing conventions: - Client::room_members, kept current from the join and leave events - Client::request_user_info / user_info, backed by new handlers for GetUserStatus (7) and GetUserStats (36) — codes the dispatcher previously logged as unhandled. The wire format is taken from soulfind's own source and pinned by an e2e test that asserts a peer's real share count. - UserInfo carries presence and stats as Options, so a reply that never arrived cannot be read as "offline" or "shares nothing" - request_user_info clears the previous answer, so the documented poll loop observes this request rather than the last one - ServerMessage and ClientOperation are now #[non_exhaustive]: every protocol message the client learns adds a variant, and that should not break callers - the crate root and prelude re-export every type a Client method returns Also pins the output contract with tests: under --json, stdout carries only newline-delimited JSON across fifteen command shapes while progress still goes to stderr, and a failing command writes nothing to stdout at all.
34 lines
959 B
Rust
34 lines
959 B
Rust
// Core modules
|
|
pub mod actor;
|
|
pub mod client;
|
|
pub mod dispatcher;
|
|
pub mod download_store;
|
|
pub mod error;
|
|
pub mod message;
|
|
pub mod peer;
|
|
pub mod shares;
|
|
pub mod types;
|
|
#[macro_use]
|
|
pub mod utils;
|
|
|
|
// Prelude module for commonly used items
|
|
pub mod prelude {
|
|
pub use crate::actor::server_actor::PeerAddress;
|
|
pub use crate::types::{
|
|
DownloadStatus, File, RoomEvent, RoomInfo, Search, SearchResult,
|
|
Transfer, UploadInfo, UploadStatus, UserInfo, UserPresence, UserStats,
|
|
UserStatus,
|
|
};
|
|
pub use crate::{debug, error, info, trace, warn};
|
|
}
|
|
|
|
// Re-export commonly used types
|
|
pub use actor::server_actor::{PeerAddress, UserMessage};
|
|
pub use client::{Client, ClientSettings};
|
|
pub use error::{Result, SoulseekRs};
|
|
pub use message::peer::SharedDirectory;
|
|
pub use types::{
|
|
DownloadStatus, File, RoomEvent, RoomInfo, Search, SearchResult, Transfer,
|
|
UploadInfo, UploadStatus, UserInfo, UserPresence, UserStats, UserStatus,
|
|
};
|