aboutsummaryrefslogtreecommitdiff
path: root/src/server/world
diff options
context:
space:
mode:
authorFuwn <[email protected]>2021-03-22 21:50:26 +0000
committerFuwn <[email protected]>2021-03-22 21:50:26 +0000
commitd4e5c30fd9d2eecdd2af55fd4ee5c0da4cda3f55 (patch)
tree32b33ace94dbb89cc67aa3cad6e06e9376902b88 /src/server/world
parentfeature: Use feature "hash_set_entry" (diff)
downloadwhirl-d4e5c30fd9d2eecdd2af55fd4ee5c0da4cda3f55.tar.xz
whirl-d4e5c30fd9d2eecdd2af55fd4ee5c0da4cda3f55.zip
etc: Correct struct names
Diffstat (limited to 'src/server/world')
-rw-r--r--src/server/world/cmd/mod.rs1
-rw-r--r--src/server/world/cmd/room.rs27
-rw-r--r--src/server/world/constants.rs13
-rw-r--r--src/server/world/mod.rs3
-rw-r--r--src/server/world/server.rs202
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();
- // },
- _ => ()
- }
- }
- }
- }
-}