support leave/join messages
This commit is contained in:
parent
a5df7865a1
commit
d5935cdfff
@ -79,6 +79,9 @@ fn process_message(msg_bytes: &[u8], nick: &str) {
|
|||||||
codes::error::EMPTY_ROOM => {
|
codes::error::EMPTY_ROOM => {
|
||||||
eprintln!("Room is Empty");
|
eprintln!("Room is Empty");
|
||||||
}
|
}
|
||||||
|
codes::error::ALREADY_IN_ROOM => {
|
||||||
|
eprintln!("You are already in that room");
|
||||||
|
}
|
||||||
_ => {
|
_ => {
|
||||||
eprintln!("Error code: {:x?}", msg_bytes[1]);
|
eprintln!("Error code: {:x?}", msg_bytes[1]);
|
||||||
}
|
}
|
||||||
|
@ -220,7 +220,6 @@ fn handle_client(
|
|||||||
}
|
}
|
||||||
|
|
||||||
codes::KEEP_ALIVE => {
|
codes::KEEP_ALIVE => {
|
||||||
println!("kEEP alive");
|
|
||||||
stream.write_all(&[codes::RESPONSE_OK]).unwrap();
|
stream.write_all(&[codes::RESPONSE_OK]).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -304,7 +303,14 @@ fn join_room(server: &Arc<Mutex<Server>>, user: &str, room: &str, stream: &mut T
|
|||||||
unlocked_server.rooms.insert(room.to_string(), list);
|
unlocked_server.rooms.insert(room.to_string(), list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stream.write_all(&[codes::RESPONSE_OK]).unwrap();
|
drop(unlocked_server);
|
||||||
|
let rooms: Vec<String> = get_rooms_of_user(server, user);
|
||||||
|
let rooms_expanded: String = rooms.join(",");
|
||||||
|
let response: String = format!("Joined {}. Current rooms: {}", room, rooms_expanded);
|
||||||
|
let res_bytes: &[u8] = response.as_bytes();
|
||||||
|
let code_bytes: &[u8] = &[codes::RESPONSE];
|
||||||
|
let out: &Vec<u8> = &[code_bytes, res_bytes].concat();
|
||||||
|
stream.write_all(out).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn leave_room(server: &Arc<Mutex<Server>>, user: &str, room: &str, stream: &mut TcpStream) {
|
fn leave_room(server: &Arc<Mutex<Server>>, user: &str, room: &str, stream: &mut TcpStream) {
|
||||||
@ -315,13 +321,27 @@ fn leave_room(server: &Arc<Mutex<Server>>, user: &str, room: &str, stream: &mut
|
|||||||
l.retain(|item: &String| item != user);
|
l.retain(|item: &String| item != user);
|
||||||
if l.len() == 0 {
|
if l.len() == 0 {
|
||||||
unlocked_server.rooms.remove(room);
|
unlocked_server.rooms.remove(room);
|
||||||
stream.write_all(&[codes::RESPONSE_OK]).unwrap();
|
drop(unlocked_server);
|
||||||
|
let rooms: Vec<String> = get_rooms_of_user(server, user);
|
||||||
|
let rooms_expanded: String = rooms.join(",");
|
||||||
|
let response: String = format!("Left {}. Current rooms: {}", room, rooms_expanded);
|
||||||
|
let code_bytes: &[u8] = &[codes::RESPONSE];
|
||||||
|
let res_bytes: &[u8] = response.as_bytes();
|
||||||
|
let out: &Vec<u8> = &[code_bytes, res_bytes].concat();
|
||||||
|
stream.write_all(out).unwrap();
|
||||||
} else if l.len() == before_len {
|
} else if l.len() == before_len {
|
||||||
stream
|
stream
|
||||||
.write_all(&[codes::ERROR, codes::error::INVALID_ROOM])
|
.write_all(&[codes::ERROR, codes::error::INVALID_ROOM])
|
||||||
.unwrap();
|
.unwrap();
|
||||||
} else {
|
} else {
|
||||||
stream.write_all(&[codes::RESPONSE_OK]).unwrap();
|
drop(unlocked_server);
|
||||||
|
let rooms: Vec<String> = get_rooms_of_user(server, user);
|
||||||
|
let rooms_expanded: String = rooms.join(",");
|
||||||
|
let response: String = format!("Left {}. Current rooms: {}", room, rooms_expanded);
|
||||||
|
let code_bytes: &[u8] = &[codes::RESPONSE];
|
||||||
|
let res_bytes: &[u8] = response.as_bytes();
|
||||||
|
let out: &Vec<u8> = &[code_bytes, res_bytes].concat();
|
||||||
|
stream.write_all(out).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
@ -332,6 +352,24 @@ fn leave_room(server: &Arc<Mutex<Server>>, user: &str, room: &str, stream: &mut
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Iterate on all rooms, capture each room name which has the user
|
||||||
|
// return a vec of strings of room names
|
||||||
|
fn get_rooms_of_user(server: &Arc<Mutex<Server>>, user: &str) -> Vec<String> {
|
||||||
|
let mut result: Vec<String> = vec![];
|
||||||
|
let guard: std::sync::MutexGuard<'_, Server> = server.lock().unwrap();
|
||||||
|
let rooms: std::collections::hash_map::Keys<'_, String, Vec<String>> = guard.rooms.keys();
|
||||||
|
rooms.for_each(|room| {
|
||||||
|
let user_vec = guard.rooms.get(room).unwrap();
|
||||||
|
for usr in user_vec {
|
||||||
|
if usr.eq(user) {
|
||||||
|
result.push(room.to_string());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
pub fn start() {
|
pub fn start() {
|
||||||
let listener: TcpListener = TcpListener::bind(SERVER_ADDRESS).expect("Failed to bind to port");
|
let listener: TcpListener = TcpListener::bind(SERVER_ADDRESS).expect("Failed to bind to port");
|
||||||
let server: Arc<Mutex<Server>> = Arc::new(Mutex::new(Server::new()));
|
let server: Arc<Mutex<Server>> = Arc::new(Mutex::new(Server::new()));
|
||||||
|
Reference in New Issue
Block a user