Files
soulseek-rs-modded/soulseek-rs-lib/src/message/server/user_left_room.rs
T
michel 7bc0ee2c3d feat(lib): chat-room protocol (list, join, leave, say) with events
Implement the Soulseek chat-room server messages against soulfind's
wire format:
- MessageFactory builders: room-list request (64), join (14),
  leave (15), say (13).
- Handlers parsing the server side: RoomList (64) names+counts,
  JoinRoom (14) membership, SayChatroom (13), UserJoinedRoom (16),
  UserLeftRoom (17), LeaveRoom (15).
- Surface everything to the client as a drained RoomEvent stream plus
  a room-list snapshot; new Client API: request_room_list, join_room,
  leave_room, say_in_room, room_list, take_room_events.

Unit tests cover each builder and handler; server-gated e2e tests
exercise message delivery and room listing against soulfind.
2026-07-19 19:47:58 +02:00

44 lines
1.2 KiB
Rust

use crate::{
actor::server_actor::ServerMessage,
message::{Message, MessageHandler},
};
use std::sync::mpsc::Sender;
pub struct UserLeftRoomHandler;
impl MessageHandler<ServerMessage> for UserLeftRoomHandler {
fn get_code(&self) -> u8 {
17
}
fn handle(&self, message: &mut Message, sender: Sender<ServerMessage>) {
let room = message.read_string();
let username = message.read_string();
let _ = sender.send(ServerMessage::RoomUserLeft { room, username });
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn forwards_user_left() {
let (tx, rx) = std::sync::mpsc::channel();
let mut message = Message::new();
message.write_raw_bytes(vec![0u8; 8]);
message.write_string("jazz");
message.write_string("carol");
message.set_pointer(8);
UserLeftRoomHandler.handle(&mut message, tx);
match rx.try_recv() {
Ok(ServerMessage::RoomUserLeft { room, username }) => {
assert_eq!(room, "jazz");
assert_eq!(username, "carol");
}
other => panic!("unexpected: {other:?}"),
}
}
}