From d4e5c30fd9d2eecdd2af55fd4ee5c0da4cda3f55 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Mon, 22 Mar 2021 21:50:26 +0000 Subject: etc: Correct struct names --- src/server/auto/cmd/mod.rs | 2 +- src/server/auto/cmd/property.rs | 47 ---------- src/server/auto/cmd/room.rs | 27 ++++++ src/server/auto/constants.rs | 13 +++ src/server/auto/mod.rs | 2 +- src/server/auto/server.rs | 47 +++++++++- src/server/auto/utils.rs | 0 src/server/mod.rs | 2 +- src/server/room/cmd/mod.rs | 1 + src/server/room/cmd/property.rs | 47 ++++++++++ src/server/room/mod.rs | 3 + src/server/room/server.rs | 181 +++++++++++++++++++++++++++++++++++ src/server/room/utils.rs | 0 src/server/world/cmd/mod.rs | 1 - src/server/world/cmd/room.rs | 27 ------ src/server/world/constants.rs | 13 --- src/server/world/mod.rs | 3 - src/server/world/server.rs | 202 ---------------------------------------- 18 files changed, 317 insertions(+), 301 deletions(-) delete mode 100644 src/server/auto/cmd/property.rs create mode 100644 src/server/auto/cmd/room.rs create mode 100644 src/server/auto/constants.rs delete mode 100644 src/server/auto/utils.rs create mode 100644 src/server/room/cmd/mod.rs create mode 100644 src/server/room/cmd/property.rs create mode 100644 src/server/room/mod.rs create mode 100644 src/server/room/server.rs create mode 100644 src/server/room/utils.rs delete mode 100644 src/server/world/cmd/mod.rs delete mode 100644 src/server/world/cmd/room.rs delete mode 100644 src/server/world/constants.rs delete mode 100644 src/server/world/mod.rs delete mode 100644 src/server/world/server.rs (limited to 'src/server') diff --git a/src/server/auto/cmd/mod.rs b/src/server/auto/cmd/mod.rs index f348cd0..addf7a5 100644 --- a/src/server/auto/cmd/mod.rs +++ b/src/server/auto/cmd/mod.rs @@ -1 +1 @@ -pub mod property; +pub mod room; diff --git a/src/server/auto/cmd/property.rs b/src/server/auto/cmd/property.rs deleted file mode 100644 index b75efad..0000000 --- a/src/server/auto/cmd/property.rs +++ /dev/null @@ -1,47 +0,0 @@ -pub fn create_property_update_command() -> [u8; 161] { // Vec - // let mut property = Vec::with_capacity(2); - // property.push(0x01); // ? - // property.push(0x10); // Command type - // - // // Meaningful Data - // property.push(); // Property ID - // property.push(); // Flags - // property.push(); // Access - // - // // Insert data length as first byte. - // property.insert(0, property.len() as u8 + 1); // ^ - // - // property // Return created array - - [ - 0xA1, 0xFF, 0x10, 0x08, 0x80, 0x01, 0x07, 0x31, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x1B, 0x80, - 0x01, 0x0C, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x73, - 0x33, 0x64, 0x2E, 0x63, 0x6F, 0x6D, 0x1A, 0x80, - 0x01, 0x15, 0x6D, 0x61, 0x69, 0x6C, 0x2E, 0x75, - 0x73, 0x2E, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x73, - 0x2E, 0x6E, 0x65, 0x74, 0x3A, 0x32, 0x35, 0x19, - 0x80, 0x01, 0x28, 0x68, 0x74, 0x74, 0x70, 0x3A, - 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2D, 0x64, 0x79, - 0x6E, 0x61, 0x6D, 0x69, 0x63, 0x2E, 0x75, 0x73, - 0x2E, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x73, 0x2E, - 0x6E, 0x65, 0x74, 0x2F, 0x63, 0x67, 0x69, 0x2D, - 0x62, 0x69, 0x6E, 0x18, 0x80, 0x01, 0x1F, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, - 0x77, 0x2D, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, - 0x2E, 0x75, 0x73, 0x2E, 0x77, 0x6F, 0x72, 0x6C, - 0x64, 0x73, 0x2E, 0x6E, 0x65, 0x74, 0x0F, 0x80, - 0x01, 0x01, 0x33, 0x03, 0x80, 0x01, 0x02, 0x32, - 0x34, 0x01, 0x80, 0x01, 0x0C, 0x57, 0x4F, 0x52, - 0x4C, 0x44, 0x53, 0x4D, 0x41, 0x53, 0x54, 0x45, - 0x52 - ]: [u8; 161] -} - -pub fn create_property_request_command() -> [u8; 22] { - [ - 0x16, 0x01, 0x06, 0x04, 0x01, 0x30, 0x0f, 0x01, - 0x33, 0x08, 0x07, 0x31, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x03, 0x02, 0x32, 0x34 - ]: [u8; 22] -} diff --git a/src/server/auto/cmd/room.rs b/src/server/auto/cmd/room.rs new file mode 100644 index 0000000..ff839f3 --- /dev/null +++ b/src/server/auto/cmd/room.rs @@ -0,0 +1,27 @@ +pub fn create_room_id_redirect_command(room_name: &str, room_id: usize) -> Vec { + 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 "".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/auto/constants.rs b/src/server/auto/constants.rs new file mode 100644 index 0000000..10c9439 --- /dev/null +++ b/src/server/auto/constants.rs @@ -0,0 +1,13 @@ +use std::collections::HashMap; + +pub static ROOM_IDS: phf::Map<&'static str, &'static i32> = phf::phf_map! { +"ChatElevator" => &4, +"IconViewRoom1Enter" => &3, +"ChatHall" => &9, +"IconViewRoom1" => &12, +"IconViewRoom1g" => &27230, +"ReceptionView1" => &6, +"ReceptionView2" => &5, +"Reception" => &1, +"staircase1" => &11, +}; diff --git a/src/server/auto/mod.rs b/src/server/auto/mod.rs index 7ceb58d..741d763 100644 --- a/src/server/auto/mod.rs +++ b/src/server/auto/mod.rs @@ -1,3 +1,3 @@ pub mod cmd; +// pub mod constants; pub mod server; -pub mod utils; diff --git a/src/server/auto/server.rs b/src/server/auto/server.rs index 87f5e07..361ae00 100644 --- a/src/server/auto/server.rs +++ b/src/server/auto/server.rs @@ -1,15 +1,20 @@ use mio::net::{TcpListener, TcpStream}; use std::io::{Read, Write}; use mio::{Poll, Token, Ready, PollOpt, Events}; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; 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 crate::server::auto::cmd::property::{create_property_update_command, create_property_request_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; +// pub struct ClientSocket { +// tcp_stream: TcpStream, +// username: String, +// } + pub struct AutoServer; impl AutoServer { pub fn new(listener: TcpListener) { @@ -25,6 +30,8 @@ impl AutoServer { let mut sockets: HashMap = HashMap::new(); let mut requests: HashMap> = HashMap::new(); let mut buffer = [0 as u8; 1024]; + // let mut room_ids: HashMap<&str, i32> = HashMap::new(); + let mut room_ids: HashSet = HashSet::new(); let mut events = Events::with_capacity(1024); loop { @@ -102,10 +109,40 @@ impl AutoServer { sockets.get_mut(&token).unwrap() .write_all(&create_buddy_list_notify_command("Wirlaburla")) .unwrap(); - info!("sent buddy notify update command") + info!("sent buddy notify update command"); } // ROOMIDRQ - 20 => info!("received room id request command"), + 20 => { + info!("received room id request command"); + + let room_name = from_utf8( + &buffer[4..*&buffer.get(0).unwrap().to_owned() as usize] + ).unwrap(); + let mut room_id = 0; + if !room_ids.contains(room_name) { + room_ids.insert(room_name.to_string()); + let new = room_ids.iter() + .position(|i| i == room_name) + .unwrap(); + debug!("inserted room '{}' as '{}'", room_name, new); + } else { + let pos = room_ids + .iter() + .position(|i| i == room_name) + .unwrap(); + debug!("found room '{}' as '{}'", room_name, pos); + room_id = pos; + } + debug!("room name: {}, room id: {}", room_name, room_id); + debug!("{:?}", room_ids); + + // 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, room_id)) + .unwrap(); + info!("sent redirect id command") + } // TEXT 14 => { info!("received text command"); diff --git a/src/server/auto/utils.rs b/src/server/auto/utils.rs deleted file mode 100644 index e69de29..0000000 diff --git a/src/server/mod.rs b/src/server/mod.rs index ae2ae83..e741e07 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,3 +1,3 @@ pub mod auto; +pub mod room; pub mod utils; -pub mod world; diff --git a/src/server/room/cmd/mod.rs b/src/server/room/cmd/mod.rs new file mode 100644 index 0000000..f348cd0 --- /dev/null +++ b/src/server/room/cmd/mod.rs @@ -0,0 +1 @@ +pub mod property; diff --git a/src/server/room/cmd/property.rs b/src/server/room/cmd/property.rs new file mode 100644 index 0000000..b75efad --- /dev/null +++ b/src/server/room/cmd/property.rs @@ -0,0 +1,47 @@ +pub fn create_property_update_command() -> [u8; 161] { // Vec + // let mut property = Vec::with_capacity(2); + // property.push(0x01); // ? + // property.push(0x10); // Command type + // + // // Meaningful Data + // property.push(); // Property ID + // property.push(); // Flags + // property.push(); // Access + // + // // Insert data length as first byte. + // property.insert(0, property.len() as u8 + 1); // ^ + // + // property // Return created array + + [ + 0xA1, 0xFF, 0x10, 0x08, 0x80, 0x01, 0x07, 0x31, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x1B, 0x80, + 0x01, 0x0C, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x73, + 0x33, 0x64, 0x2E, 0x63, 0x6F, 0x6D, 0x1A, 0x80, + 0x01, 0x15, 0x6D, 0x61, 0x69, 0x6C, 0x2E, 0x75, + 0x73, 0x2E, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x73, + 0x2E, 0x6E, 0x65, 0x74, 0x3A, 0x32, 0x35, 0x19, + 0x80, 0x01, 0x28, 0x68, 0x74, 0x74, 0x70, 0x3A, + 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2D, 0x64, 0x79, + 0x6E, 0x61, 0x6D, 0x69, 0x63, 0x2E, 0x75, 0x73, + 0x2E, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x73, 0x2E, + 0x6E, 0x65, 0x74, 0x2F, 0x63, 0x67, 0x69, 0x2D, + 0x62, 0x69, 0x6E, 0x18, 0x80, 0x01, 0x1F, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, + 0x77, 0x2D, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, + 0x2E, 0x75, 0x73, 0x2E, 0x77, 0x6F, 0x72, 0x6C, + 0x64, 0x73, 0x2E, 0x6E, 0x65, 0x74, 0x0F, 0x80, + 0x01, 0x01, 0x33, 0x03, 0x80, 0x01, 0x02, 0x32, + 0x34, 0x01, 0x80, 0x01, 0x0C, 0x57, 0x4F, 0x52, + 0x4C, 0x44, 0x53, 0x4D, 0x41, 0x53, 0x54, 0x45, + 0x52 + ]: [u8; 161] +} + +pub fn create_property_request_command() -> [u8; 22] { + [ + 0x16, 0x01, 0x06, 0x04, 0x01, 0x30, 0x0f, 0x01, + 0x33, 0x08, 0x07, 0x31, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x03, 0x02, 0x32, 0x34 + ]: [u8; 22] +} diff --git a/src/server/room/mod.rs b/src/server/room/mod.rs new file mode 100644 index 0000000..7ceb58d --- /dev/null +++ b/src/server/room/mod.rs @@ -0,0 +1,3 @@ +pub mod cmd; +pub mod server; +pub mod utils; diff --git a/src/server/room/server.rs b/src/server/room/server.rs new file mode 100644 index 0000000..27a8b24 --- /dev/null +++ b/src/server/room/server.rs @@ -0,0 +1,181 @@ +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 crate::server::room::cmd::property::{create_property_update_command, create_property_request_command}; +use rand::Rng; +use crate::server::utils::broadcast_to_all_clients; + +pub struct RoomServer; +impl RoomServer { + 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 = HashMap::new(); + let mut requests: HashMap> = 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"), + // 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(); + // }, + _ => () + } + } + } + } +} diff --git a/src/server/room/utils.rs b/src/server/room/utils.rs new file mode 100644 index 0000000..e69de29 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 { - 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 "".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" => &4, -"IconViewRoom1Enter" => &3, -"ChatHall" => &9, -"IconViewRoom1" => &12, -"IconViewRoom1g" => &27230, -"ReceptionView1" => &6, -"ReceptionView2" => &5, -"Reception" => &1, -"staircase1" => &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 = HashMap::new(); - let mut requests: HashMap> = 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(); - // }, - _ => () - } - } - } - } -} -- cgit v1.2.3