improvements to join room
This commit is contained in:
parent
f78acbdb10
commit
da336e41be
@ -73,7 +73,27 @@ fn users(stream: &mut TcpStream) {
|
|||||||
|
|
||||||
fn msg(stream: &mut TcpStream) {}
|
fn msg(stream: &mut TcpStream) {}
|
||||||
|
|
||||||
fn join(stream: &mut TcpStream) {}
|
fn join(nick: &str, room: &str, stream: &mut TcpStream) {
|
||||||
|
#[cfg(debug_assertions)]
|
||||||
|
println!("nick {} joining room s{} ", nick, room);
|
||||||
|
let size = room.to_string().capacity() + nick.to_string().capacity() + 2;
|
||||||
|
let mut out_buf: Vec<u8> = vec![0; size];
|
||||||
|
let mut byte:usize = 0;
|
||||||
|
out_buf[byte] = codes::client::JOIN_ROOM;
|
||||||
|
byte+=1;
|
||||||
|
for i in 0..nick.len() {
|
||||||
|
out_buf[byte] = *nick.as_bytes().get(i).unwrap();
|
||||||
|
byte+=1;
|
||||||
|
}
|
||||||
|
out_buf[byte] = 0x20;
|
||||||
|
byte += 1;
|
||||||
|
for i in 0.. room.len() {
|
||||||
|
out_buf[byte] = *room.as_bytes().get(i).unwrap();
|
||||||
|
byte+=1;
|
||||||
|
}
|
||||||
|
stream.write(&out_buf);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
fn show(stream: &mut TcpStream) {}
|
fn show(stream: &mut TcpStream) {}
|
||||||
fn leave(stream: &mut TcpStream) {}
|
fn leave(stream: &mut TcpStream) {}
|
||||||
@ -102,12 +122,16 @@ pub fn start() {
|
|||||||
stream.write(&buf);
|
stream.write(&buf);
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let cmd: String = input!(":");
|
let inp: String = input!(":");
|
||||||
match cmd.trim() {
|
let cmds: Vec<_> = inp.split(" ").collect();
|
||||||
|
match *cmds.get(0).unwrap() {
|
||||||
"/quit" => disconnect(),
|
"/quit" => disconnect(),
|
||||||
"/rooms" => rooms(&mut stream),
|
"/rooms" => rooms(&mut stream),
|
||||||
"/users" => users(&mut stream),
|
"/users" => users(&mut stream),
|
||||||
"/join" => join(&mut stream),
|
"/join" => {
|
||||||
|
let room = *cmds.get(1).unwrap();
|
||||||
|
join(&nick,room ,&mut stream)
|
||||||
|
},
|
||||||
"/show" => show(&mut stream),
|
"/show" => show(&mut stream),
|
||||||
"/leave" => leave(&mut stream),
|
"/leave" => leave(&mut stream),
|
||||||
"/msg" => msg(&mut stream),
|
"/msg" => msg(&mut stream),
|
||||||
|
@ -19,7 +19,7 @@ struct Server {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Server {
|
impl Server {
|
||||||
fn new() -> Server {
|
fn new() -> Self {
|
||||||
Server {
|
Server {
|
||||||
users: HashSet::new(),
|
users: HashSet::new(),
|
||||||
rooms: HashMap::new(),
|
rooms: HashMap::new(),
|
||||||
@ -75,6 +75,13 @@ fn handle_client(
|
|||||||
codes::client::JOIN_ROOM => {
|
codes::client::JOIN_ROOM => {
|
||||||
#[cfg(debug_assertions)]
|
#[cfg(debug_assertions)]
|
||||||
println!("JOIN_ROOM ");
|
println!("JOIN_ROOM ");
|
||||||
|
|
||||||
|
let p: String = String::from_utf8_lossy(param_bytes).to_string();
|
||||||
|
|
||||||
|
let params: Vec<&str> = p.split(' ').collect();
|
||||||
|
let user = params.get(0).unwrap();
|
||||||
|
let room = params.get(1).unwrap();
|
||||||
|
join_room(server, *user, room, stream)
|
||||||
}
|
}
|
||||||
codes::client::LEAVE_ROOM => {
|
codes::client::LEAVE_ROOM => {
|
||||||
#[cfg(debug_assertions)]
|
#[cfg(debug_assertions)]
|
||||||
@ -86,7 +93,7 @@ fn handle_client(
|
|||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
#[cfg(debug_assertions)]
|
#[cfg(debug_assertions)]
|
||||||
println!("Unspecified client Op");
|
println!("Unspecified client Op, {:x?}", cmd_bytes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,7 +102,7 @@ fn handle_client(
|
|||||||
|
|
||||||
fn register_nick(server: &Arc<Mutex<Server>>, nickname: String, stream: &mut TcpStream) {
|
fn register_nick(server: &Arc<Mutex<Server>>, nickname: String, stream: &mut TcpStream) {
|
||||||
// Check for nickname collision
|
// Check for nickname collision
|
||||||
let mut unlocked_server = server.lock().unwrap();
|
let mut unlocked_server: std::sync::MutexGuard<'_, Server> = server.lock().unwrap();
|
||||||
if unlocked_server.users.contains(&nickname) {
|
if unlocked_server.users.contains(&nickname) {
|
||||||
#[cfg(debug_assertions)]
|
#[cfg(debug_assertions)]
|
||||||
println!("nickname collision, {}", nickname);
|
println!("nickname collision, {}", nickname);
|
||||||
@ -109,6 +116,20 @@ fn register_nick(server: &Arc<Mutex<Server>>, nickname: String, stream: &mut Tcp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn join_room(server: &Arc<Mutex<Server>>, user: &str, room: &str, stream: &mut TcpStream) {
|
||||||
|
let mut unlocked_server: std::sync::MutexGuard<'_, Server> = server.lock().unwrap();
|
||||||
|
|
||||||
|
match unlocked_server.rooms.get_mut(room) {
|
||||||
|
Some(l) => {
|
||||||
|
l.push(user.to_string());
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
let list: Vec<String> = vec![user.to_string()];
|
||||||
|
unlocked_server.rooms.insert(room.to_string(), list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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()));
|
||||||
@ -120,16 +141,15 @@ pub fn start() {
|
|||||||
match tcpstream {
|
match tcpstream {
|
||||||
Ok(mut stream) => {
|
Ok(mut stream) => {
|
||||||
let mut buf_in: [u8; 1024] = [0; 1024];
|
let mut buf_in: [u8; 1024] = [0; 1024];
|
||||||
let server_innter = Arc::clone(&server_outer);
|
let server_inner = Arc::clone(&server_outer);
|
||||||
|
|
||||||
thread::spawn(move || loop {
|
thread::spawn(move || loop {
|
||||||
match stream.read(&mut buf_in) {
|
match stream.read(&mut buf_in) {
|
||||||
Ok(size) => {
|
Ok(size) => {
|
||||||
|
|
||||||
let cmd_bytes: &[u8] = &buf_in[0..1];
|
let cmd_bytes: &[u8] = &buf_in[0..1];
|
||||||
let param_bytes: &[u8] = &buf_in[1..size];
|
let param_bytes: &[u8] = &buf_in[1..size];
|
||||||
|
|
||||||
handle_client(&server_innter, &mut stream, cmd_bytes, param_bytes);
|
handle_client(&server_inner, &mut stream, cmd_bytes, param_bytes);
|
||||||
}
|
}
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
println!("Error parsing client");
|
println!("Error parsing client");
|
||||||
|
Reference in New Issue
Block a user