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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user