feat(lib): answer UserInfoRequest with our slots and queue
Opening a user's profile in SoulseekQt or Nicotine+ asks that peer directly (peer code 15), and a peer that never answers shows an endless spinner. The reply (code 16) carries no description or picture, the configured upload slot count, how many uploads are waiting, and whether a slot is free right now, which is what the reference clients send.
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
//! `UserInfoRequest` (peer code 15) and its reply (code 16): what a peer says
|
||||
//! about itself when another user opens its profile.
|
||||
|
||||
use crate::message::{Message, MessageHandler};
|
||||
use crate::peer::PeerMessage;
|
||||
use std::sync::mpsc::Sender;
|
||||
|
||||
pub struct UserInfoRequest;
|
||||
impl MessageHandler<PeerMessage> for UserInfoRequest {
|
||||
fn get_code(&self) -> u32 {
|
||||
15
|
||||
}
|
||||
fn handle(&self, _message: &mut Message, sender: Sender<PeerMessage>) {
|
||||
let _ = sender.send(PeerMessage::UserInfoRequested);
|
||||
}
|
||||
}
|
||||
|
||||
/// Build a `UserInfoResponse` (peer code 16) with no description or picture.
|
||||
#[must_use]
|
||||
pub fn build_user_info(
|
||||
upload_slots: u32,
|
||||
queue_size: u32,
|
||||
slots_free: bool,
|
||||
) -> Message {
|
||||
Message::new()
|
||||
.write_int32(16)
|
||||
.write_string("")
|
||||
.write_bool(false)
|
||||
.write_int32(upload_slots)
|
||||
.write_int32(queue_size)
|
||||
.write_bool(slots_free)
|
||||
.clone()
|
||||
}
|
||||
Reference in New Issue
Block a user