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.
44 lines
1.2 KiB
Rust
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:?}"),
|
|
}
|
|
}
|
|
}
|