feat(peer): ask a peer what it says about itself

The client answered a UserInfoRequest but could never send one, so a
user's profile — description, upload slots, queue length — was something
this client served and never saw. The reply (peer code 16) is now parsed
too, with the tolerances other clients carry: a picture is skipped rather
than kept, a length that overruns the message is clamped, and a message
that stops early (older clients, and Museek+ writing a boolean as an
integer) still yields every field before it.
This commit is contained in:
Michel de Graaf
2026-09-09 17:14:17 +00:00
parent 6d6f4f282e
commit 0546d3a77c
7 changed files with 263 additions and 1 deletions
+10
View File
@@ -1,6 +1,7 @@
use crate::actor::{Actor, ActorHandle, ConnectionState};
use crate::client::ClientOperation;
use crate::dispatcher::MessageDispatcher;
use crate::message::peer::UserInfoResponseHandler;
use crate::message::peer::{
FileSearchResponse, FolderContentsRequest, FolderContentsResponseHandler,
GetShareFileList, PeerInit, PlaceInQueueRequest, PlaceInQueueResponse,
@@ -47,6 +48,8 @@ pub enum PeerMessage {
ShareListRequested,
/// A peer we are browsing sent us their shared-file listing (code 5).
ShareListReceived(Vec<SharedDirectory>),
/// A peer answered our `UserInfoRequest` with what it says about itself.
UserInfoReceived(crate::message::peer::PeerInfo),
/// A peer answered our `FolderContentsRequest` with one folder's listing.
FolderContentsReceived {
token: u32,
@@ -207,6 +210,7 @@ impl PeerActor {
handlers.register_handler(FolderContentsRequest);
handlers.register_handler(FolderContentsResponseHandler);
handlers.register_handler(UserInfoRequest);
handlers.register_handler(UserInfoResponseHandler);
handlers.register_handler(UploadDeniedHandler);
handlers.register_handler(UploadFailedHandler);
handlers.register_handler(PlaceInQueueRequest);
@@ -317,6 +321,12 @@ impl PeerActor {
directories,
});
}
PeerMessage::UserInfoReceived(info) => {
self.forward(ClientOperation::PeerInfoReceived {
username: self.peer_username(),
info,
});
}
PeerMessage::FolderContentsReceived {
token,
folder,