Dispatch read one byte of the code, so a code with a non-zero high byte was handled as its low byte. Message::get_message_code now reads the whole little-endian uint32 and handlers register by u32. PeerInit and PierceFirewall, the only frames with a one-byte code, get their own accessor for the listener's first frame.
45 lines
1.3 KiB
Rust
45 lines
1.3 KiB
Rust
use crate::{
|
|
actor::server_actor::ServerMessage,
|
|
message::{Message, MessageHandler},
|
|
};
|
|
use std::sync::mpsc::Sender;
|
|
|
|
pub struct UserJoinedRoomHandler;
|
|
|
|
impl MessageHandler<ServerMessage> for UserJoinedRoomHandler {
|
|
fn get_code(&self) -> u32 {
|
|
16
|
|
}
|
|
|
|
fn handle(&self, message: &mut Message, sender: Sender<ServerMessage>) {
|
|
// UserJoinedRoom (code 16): room, username, then that user's stats,
|
|
// which we don't need. Reading the first two fields is enough.
|
|
let room = message.read_string();
|
|
let username = message.read_string();
|
|
let _ = sender.send(ServerMessage::RoomUserJoined { room, username });
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
use crate::message::framed;
|
|
|
|
#[test]
|
|
fn forwards_user_joined() {
|
|
let (tx, rx) = std::sync::mpsc::channel();
|
|
let mut message = framed(|m| {
|
|
m.write_string("jazz").write_string("carol");
|
|
});
|
|
|
|
UserJoinedRoomHandler.handle(&mut message, tx);
|
|
match rx.try_recv() {
|
|
Ok(ServerMessage::RoomUserJoined { room, username }) => {
|
|
assert_eq!(room, "jazz");
|
|
assert_eq!(username, "carol");
|
|
}
|
|
other => panic!("unexpected: {other:?}"),
|
|
}
|
|
}
|
|
}
|