diff options
Diffstat (limited to 'src/server/world')
| -rw-r--r-- | src/server/world/cmd/mod.rs | 1 | ||||
| -rw-r--r-- | src/server/world/cmd/room.rs | 27 | ||||
| -rw-r--r-- | src/server/world/constants.rs | 13 | ||||
| -rw-r--r-- | src/server/world/mod.rs | 3 | ||||
| -rw-r--r-- | src/server/world/server.rs | 202 |
5 files changed, 0 insertions, 246 deletions
diff --git a/src/server/world/cmd/mod.rs b/src/server/world/cmd/mod.rs deleted file mode 100644 index addf7a5..0000000 --- a/src/server/world/cmd/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod room; diff --git a/src/server/world/cmd/room.rs b/src/server/world/cmd/room.rs deleted file mode 100644 index e41e30f..0000000 --- a/src/server/world/cmd/room.rs +++ /dev/null @@ -1,27 +0,0 @@ -pub fn create_room_id_redirect_command(room_name: &str, room_id: &i32) -> Vec<u8> { - let mut room_id_redirect = Vec::new(); - // room_id_redirect.push(room_id_redirect.len() as u8 + 1); // Data length - room_id_redirect.push(0x01); // ? - room_id_redirect.push(0x1A); // Command type1 - room_id_redirect.push(room_name.len() as u8); // UTF/ room name length - for i in room_name.bytes() { room_id_redirect.push(i); } // Push `room_name` - // for i in "<dimension-1>".bytes() { room_id_redirect.push(i); } // Push room number - - // Room number - room_id_redirect.push(0x00); - room_id_redirect.push(*room_id as u8); - - // IP - room_id_redirect.push(0x00); - room_id_redirect.push(0x00); - room_id_redirect.push(0x00); - room_id_redirect.push(0x00); - - // Port - room_id_redirect.push(0x16); - room_id_redirect.push(0x29); - - room_id_redirect.insert(0, room_id_redirect.len() as u8 + 1); // Data length - - room_id_redirect -} diff --git a/src/server/world/constants.rs b/src/server/world/constants.rs deleted file mode 100644 index 10c9439..0000000 --- a/src/server/world/constants.rs +++ /dev/null @@ -1,13 +0,0 @@ -use std::collections::HashMap; - -pub static ROOM_IDS: phf::Map<&'static str, &'static i32> = phf::phf_map! { -"ChatElevator<dimension-1>" => &4, -"IconViewRoom1Enter<dimension-1>" => &3, -"ChatHall<dimension-1>" => &9, -"IconViewRoom1<dimension-1>" => &12, -"IconViewRoom1g<dimension-1>" => &27230, -"ReceptionView1<dimension-1>" => &6, -"ReceptionView2<dimension-1>" => &5, -"Reception<dimension-1>" => &1, -"staircase1<dimension-1>" => &11, -}; diff --git a/src/server/world/mod.rs b/src/server/world/mod.rs deleted file mode 100644 index 741d763..0000000 --- a/src/server/world/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod cmd; -// pub mod constants; -pub mod server; diff --git a/src/server/world/server.rs b/src/server/world/server.rs deleted file mode 100644 index 6aa2401..0000000 --- a/src/server/world/server.rs +++ /dev/null @@ -1,202 +0,0 @@ -use mio::net::{TcpListener, TcpStream}; -use std::io::{Read, Write}; -use mio::{Poll, Token, Ready, PollOpt, Events}; -use std::collections::HashMap; -use std::str::from_utf8; -use crate::cmd::buddy_list::create_buddy_list_notify_command; -use crate::cmd::text::create_text_command; -use crate::cmd::property::{create_property_update_command, create_property_request_command}; -use super::cmd::room::create_room_id_redirect_command; -use rand::Rng; -use crate::server::utils::broadcast_to_all_clients; -// use super::constants::ROOM_IDS; - -// pub struct ClientSocket { -// tcp_stream: TcpStream, -// username: String, -// } - -pub struct WorldServer; -impl WorldServer { - pub fn new(listener: TcpListener) { - let poll = Poll::new().unwrap(); - poll.register( - &listener, - Token(0), - Ready::readable(), - PollOpt::edge() - ).unwrap(); - - let mut counter: usize = 0; - let mut sockets: HashMap<Token, TcpStream> = HashMap::new(); - let mut requests: HashMap<Token, Vec<u8>> = HashMap::new(); - let mut buffer = [0 as u8; 1024]; - - let mut events = Events::with_capacity(1024); - loop { - poll.poll(&mut events, None).unwrap(); - for event in &events { - match event.token() { - Token(0) => { - loop { - match listener.accept() { - Ok((socket, address)) => { - counter += 1; - let token = Token(counter); - - poll.register( - &socket, - token, - Ready::readable(), - PollOpt::edge() - ).unwrap(); - - info!( - "registered ip '{}' with token '{}'", - address.ip(), token.0 - ); - - sockets.insert(token, socket); - requests.insert(token, Vec::with_capacity(192)); - } - Err(ref e) if e.kind() == std::io::ErrorKind::WouldBlock => - break, - Err(e) => { - error!("unexpected error: {}", e); - poll.deregister(sockets.get(&Token(counter)).unwrap()).unwrap(); - break; - } - } - } - }, - token if event.readiness().is_readable() => { - loop { - let read = sockets.get_mut(&token).unwrap().read(&mut buffer); - match read { - Ok(0) => { sockets.remove(&token); break; } - Ok(n) => { - let req = requests.get_mut(&token).unwrap(); - for b in &buffer[0..n] { - req.push(*b); - } - - // First byte means how long data section of the packet is. - // Second byte is to be determined. - // Third byte is the request type. - - // Match packet type by descriptor; **third** byte. - match &buffer.get(2).unwrap() { // Third byte is 2 because Rust is zero-indexed. - // PROPREQ - 10 => { - info!("received property request command"); - sockets.get_mut(&token).unwrap() - .write_all(&create_property_update_command()).unwrap(); - info!("sent property update"); - } - // SESSINIT - 6 => { - info!("received session initialization command"); - sockets.get_mut(&token).unwrap() - .write_all(&create_property_request_command()).unwrap(); - info!("sent session initialization command") - } - // PROPSET - 15 => info!("received property set command"), - // BUDDYLISTUPDATE - 29 => { - info!("received buddy list update command"); - sockets.get_mut(&token).unwrap() - .write_all(&create_buddy_list_notify_command("Wirlaburla")) - .unwrap(); - info!("sent buddy notify update command"); - } - // ROOMIDRQ - 20 => { - info!("received room id request command"); - - let room_name = from_utf8( - &buffer[4..*&buffer.get(0).unwrap().to_owned() as usize] - ).unwrap(); - // let room_id = ROOM_IDS.get(&room_name[11..]).cloned().unwrap(); - // debug!("room name: {}, room id: {}", room_name, room_id); - - // Passing `0` as `room_id` parameter as currently there is - // no way to find out a room's ID based on it's name. - sockets.get_mut(&token).unwrap() - .write_all(&create_room_id_redirect_command(room_name, &0)) - .unwrap(); - info!("sent redirect id command") - } - // TEXT - 14 => { - info!("received text command"); - - // TODO: Make this into a command! - let message = from_utf8( - &buffer[6..*&buffer.get(0).unwrap().to_owned() as usize] - ).unwrap(); - info!("message: {}", message); - - // Using User as a placeholder. Ideally, this would print out the username of - // the one who sent it. - broadcast_to_all_clients( - &sockets, - &create_text_command( - // Random integer is added to the end of "User", just a development - // proof-of-concept. Since at this stage usernames aren't exactly kept, - // we can identify message senders as their connection token; `token.0`. - &format!("User{}", rand::thread_rng().gen_range(1..150).to_string()), - message - ) - ); - } - // SESSEXIT - 7 => { - info!("received session termination command"); - poll.deregister(sockets.get(&token).unwrap()).unwrap(); - info!("de-registered client: {}", token.0); - } - // Anything else, do nothing. - _ => () - } - } - Err(ref e) if e.kind() == std::io::ErrorKind::WouldBlock => - break, - Err(e) => { error!("unexpected error: {}", e); break; } - } - } - - // Unimplemented - // let ready = requests.get(&token).unwrap() - // .windows(4) - // .find(|window| is_double_crnl(*window)) - // .is_some(); - // - // if ready { - // let socket = sockets.get(&token).unwrap(); - // poll.reregister( - // socket, - // token, - // Ready::writable(), - // PollOpt::edge() | PollOpt::oneshot()).unwrap(); - // } - }, - // Unimplemented - // token if event.readiness().is_writable() => { - // println!("writeable"); - // requests.get_mut(&token).unwrap().clear(); - // sockets.get_mut(&token).unwrap().write_all("test".as_bytes()).unwrap(); - // - // // Re-use existing connection ("keep-alive") - switch back to reading - // poll.reregister( - // sockets.get(&token).unwrap(), - // token, - // Ready::readable(), - // PollOpt::edge()).unwrap(); - // }, - _ => () - } - } - } - } -} |