community: the drawer asks a peer for its card and the server for interests, and discover gets the similar-users shelf

This commit is contained in:
KeelrLeek committed 2026-09-02 14:03:26 -05:00
1 parent 64a7561750
commit 5160d97a5f
10 files changed
+412 -2

No files matched your search

+25
View File
@@ -125,6 +125,11 @@ pub fn browse_request() -> Vec<u8> {
Writer::new().finish_u32(code::BROWSE_REQUEST)
}
/// Ask a peer for their user-info card (code 15; answered with code 16).
pub fn user_info_request() -> Vec<u8> {
Writer::new().finish_u32(code::USER_INFO_REQUEST)
}
/// Legacy enqueue message; some clients expect it before TransferRequest.
pub fn queue_download(filename: &str) -> Vec<u8> {
Writer::new()
@@ -247,6 +252,15 @@ pub enum PeerEvent {
UploadFailed {
filename: String,
},
/// A peer's user-info card, the answer to our user_info_request.
UserInfoResponse {
description: String,
/// Raw bytes as sent — hostile input until decoded under limits.
picture: Option<Vec<u8>>,
total_uploads: u32,
queue_size: u32,
has_free_slot: bool,
},
// Requests other peers make of us (M5 responder):
BrowseRequest,
UserInfoRequest,
@@ -320,6 +334,17 @@ pub fn decode(code: u32, payload: Bytes) -> Result<PeerEvent> {
code::UPLOAD_FAILED => PeerEvent::UploadFailed {
filename: r.string()?,
},
code::USER_INFO_RESPONSE => {
let description = r.string()?;
let picture = if r.bool()? { Some(r.bytes()?.to_vec()) } else { None };
PeerEvent::UserInfoResponse {
description,
picture,
total_uploads: r.u32()?,
queue_size: r.u32()?,
has_free_slot: r.bool().unwrap_or(false),
}
}
code::BROWSE_REQUEST => PeerEvent::BrowseRequest,
code::USER_INFO_REQUEST => PeerEvent::UserInfoRequest,
code::FOLDER_CONTENTS_REQUEST => PeerEvent::FolderContentsRequest {