aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFuwn <[email protected]>2021-04-26 13:29:26 +0000
committerFuwn <[email protected]>2021-04-26 13:29:26 +0000
commit5cd7ed3f61a713df0f8fe7c152bce6dfeea060c0 (patch)
tree6916dc4969f45ca2161042992a98470f0e1d984a /src
parentMerge branch 'develop' of https://github.com/Whirlsplash/whirl into develop (diff)
downloadwhirl-5cd7ed3f61a713df0f8fe7c152bce6dfeea060c0.tar.xz
whirl-5cd7ed3f61a713df0f8fe7c152bce6dfeea060c0.zip
fix: Actually remove legacy server module
Diffstat (limited to 'src')
-rw-r--r--src/server_dev/auto/____server.rs384
-rw-r--r--src/server_dev/auto/___server.rs266
-rw-r--r--src/server_dev/auto/__server.rs230
-rw-r--r--src/server_dev/auto/_server.rs182
-rw-r--r--src/server_dev/auto/cmd/mod.rs3
-rw-r--r--src/server_dev/auto/cmd/property.rs24
-rw-r--r--src/server_dev/auto/cmd/room.rs33
-rw-r--r--src/server_dev/auto/cmd/session.rs36
-rw-r--r--src/server_dev/auto/mod.rs2
-rw-r--r--src/server_dev/auto/server.rs319
-rw-r--r--src/server_dev/cmd/action.rs6
-rw-r--r--src/server_dev/cmd/buddy_list.rs14
-rw-r--r--src/server_dev/cmd/mod.rs5
-rw-r--r--src/server_dev/cmd/property.rs7
-rw-r--r--src/server_dev/cmd/session.rs6
-rw-r--r--src/server_dev/cmd/text.rs55
-rw-r--r--src/server_dev/mod.rs7
-rw-r--r--src/server_dev/parser.rs35
-rw-r--r--src/server_dev/room/__server.rs382
-rw-r--r--src/server_dev/room/_server.rs168
-rw-r--r--src/server_dev/room/cmd/mod.rs2
-rw-r--r--src/server_dev/room/cmd/property.rs37
-rw-r--r--src/server_dev/room/cmd/session.rs20
-rw-r--r--src/server_dev/room/mod.rs2
-rw-r--r--src/server_dev/room/server.rs434
-rw-r--r--src/server_dev/structures.rs15
26 files changed, 0 insertions, 2674 deletions
diff --git a/src/server_dev/auto/____server.rs b/src/server_dev/auto/____server.rs
deleted file mode 100644
index 586bc16..0000000
--- a/src/server_dev/auto/____server.rs
+++ /dev/null
@@ -1,384 +0,0 @@
-use std::error::Error;
-use crate::server::auto::cmd::property::{
- create_property_update_command,
- create_property_request_command
-};
-use crate::server::cmd::text::{create_text_command_with_action, create_text_command};
-use std::str::from_utf8;
-use crate::server::cmd::buddy_list::create_buddy_list_notify_command;
-use crate::server::auto::cmd::room::create_room_id_redirect_command;
-use crate::server::auto::cmd::session::parse_session_initialization_command;
-use crate::server::parser::get_commands_from_buffer;
-use crate::server::cmd::property::parse_property_set_command;
-use crate::config::get_config;
-use mio::{Poll, Events, Token, Interest, Registry};
-use mio::net::{TcpListener, TcpStream};
-use std::collections::{HashMap, HashSet};
-use mio::event::Event;
-use std::io::{Read, ErrorKind, Write};
-use bytes::BytesMut;
-
-const SERVER: Token = Token(0);
-
-pub struct AutoServer {
- pub clients: HashMap<Token, String>,
- pub connections: HashMap<Token, TcpStream>,
- pub room_ids: Vec<String>,
-}
-impl AutoServer {
- pub fn listen(&mut self, addr: &str) -> Result<(), Box<dyn Error>> {
- let mut listener = TcpListener::bind(addr.parse().unwrap())?;
- let mut poll = Poll::new()?;
- let mut events = Events::with_capacity(1024);
- let mut counter: usize = 0;
- // let mut sockets = HashMap::new();
- let mut requests = HashMap::new();
- let mut buffer = [0 as u8; 1024];
- // let mut room_ids = vec![];
-
- poll.registry().register(
- &mut listener,
- Token(0),
- Interest::READABLE,
- )?;
-
- debug!("AutoServer now listening on {}", listener.local_addr().unwrap());
-
- loop {
- poll.poll(&mut events, None)?;
-
- for event in &events {
- match event.token() {
- Token(0) => loop {
- match listener.accept() {
- Ok((mut stream, address)) => {
- counter += 1;
- let token = Token(counter);
-
- poll.registry().register(
- &mut stream,
- token,
- Interest::READABLE,
- )?;
-
- debug!("registered peer with address '{}' as '{}'", address, token.0);
-
- // sockets.insert(token, stream);
- self.connections.insert(token, stream);
- requests.insert(token, Vec::with_capacity(192));
- }
- Err(ref err) if err.kind() == ErrorKind::WouldBlock => break,
- Err(err) => {
- error!("unexpected error: {}", err);
- poll.registry().deregister(
- self.connections.get_mut(&Token(counter)).unwrap(),
- )?;
- break;
- }
- }
- },
- token if event.is_readable() => {
- loop {
- let read = self.connections.get_mut(&token).unwrap()
- .read(&mut buffer);
- match read {
- Ok(0) => { self.connections.remove(&token); break; }
- Ok(n) => {
- let req = requests.get_mut(&token).unwrap();
- for b in &buffer[0..n] { req.push(*b); }
-
- for cmd in get_commands_from_buffer(BytesMut::from(&buffer[..n])) {
- match cmd.get(2).unwrap() {
- 10 => { // PROPREQ
- debug!("received property request command from client 'null'");
- self.connections.get_mut(&token).unwrap()
- .write_all(&create_property_update_command()).unwrap();
- debug!("sent property update command to client 'null'");
- }
- 6 => { // SESSINIT
- let local_username =
- parse_session_initialization_command(cmd).username;
- self.clients.insert(token, local_username.clone());
- debug!(
- "received session initialization command from client '{}'",
- local_username,
- );
- self.connections.get_mut(&token).unwrap()
- .write_all(&create_property_request_command()).unwrap();
- debug!("sent session initialization command to client '{}'", local_username);
- }
- 15 => { // PROPSET
- let avatar = parse_property_set_command(cmd);
- debug!(
- "received property set command from client '{}': {}",
- self.clients.get(&token).unwrap(),
- avatar,
- );
- self.connections.get_mut(&token).unwrap()
- .write_all(&create_text_command_with_action(
- "WORLDSMASTER", &get_config().unwrap().worldsmaster_greeting,
- )).unwrap();
- debug!(
- "sent session initialization command to client '{}'",
- self.clients.get(&token).unwrap(),
- );
- }
- 29 => { // BUDDYLISTUPDATE
- let received_buddy = from_utf8(
- cmd.get(4..cmd.get(0).unwrap().to_owned() as usize - 1).unwrap()
- ).unwrap();
- debug!(
- "received buddy list update command from client '{}': {}",
- self.clients.get(&token).unwrap(),
- received_buddy,
- );
- self.connections.get_mut(&token).unwrap()
- .write_all(&create_buddy_list_notify_command(received_buddy)).unwrap();
- debug!(
- "sent buddy list notify command to client '{}'",
- self.clients.get(&token).unwrap(),
- );
- }
- 20 => { // ROOMIDRQ
- let room_name = from_utf8(
- cmd.get(4..cmd.get(0).unwrap().to_owned() as usize).unwrap()
- ).unwrap();
- debug!(
- "received room id request command from client '{}': {}",
- self.clients.get(&token).unwrap(),
- room_name,
- );
- let room_id;
- if !self.room_ids.contains(&room_name.to_string()) {
- self.room_ids.push(room_name.to_string());
- room_id = self.room_ids.iter()
- .position(|i| i == &room_name.to_string())
- .unwrap();
- trace!("inserted room '{}' as '{}'", room_name, room_id);
- } else {
- let position = self.room_ids.iter()
- .position(|i| i == &room_name.to_string())
- .unwrap();
- trace!("found room '{}' as '{}'", room_name, position);
- room_id = position;
- }
- trace!("room name: {}, room id: {}", room_name, room_id);
- trace!("{:?}", self.room_ids);
- self.connections.get_mut(&token).unwrap()
- .write_all(&create_room_id_redirect_command(
- room_name, room_id,
- )).unwrap();
- }
- 14 => { // TEXT
- let text = from_utf8(
- cmd.get(6..cmd.get(0).unwrap().to_owned() as usize).unwrap()
- ).unwrap();
- let username = self.clients.get(&token).unwrap().clone();
- debug!(
- "received text command from client '{}': {}",
- username, text,
- );
- self.connections.iter_mut().for_each(|t|
- t.1.write_all(&create_text_command(
- &username,
- text,
- )).unwrap()
- );
- debug!("broadcasted text command to clients");
- }
- 7 => { // SESSEXIT
- debug!(
- "received session exit command from client '{}'",
- self.clients.get(&token).unwrap(),
- );
- }
- _ => (),
- }
- }
- }
- Err(ref err) if err.kind() == ErrorKind::WouldBlock =>
- break,
- Err(err) => { error!("unexpected error: {}", err); break; }
- }
- }
- }
- _ => (),
- }
- }
- }
- }
-
- fn broadcast(
- sockets: &HashMap<Token, TcpStream>,
- cmd: &[u8],
- ) -> () {
- for mut socket in sockets {
- socket.1.write_all(cmd).unwrap();
- }
- }
-
- // fn process(
- // &mut self,
- // _registry: &Registry,
- // event: &Event,
- // token: Token,
- // ) -> Result<bool, Box<dyn Error>> {
- // if event.is_readable() {
- // let mut connection_closed = false;
- // let mut received_data = vec![0; 4096];
- // let mut bytes_read = 0;
- //
- // let stream = self.connections.get_mut(&token).unwrap();
- //
- // loop {
- // match stream.read(&mut received_data[bytes_read..]) {
- // Ok(0) => {
- // connection_closed = true;
- // break;
- // }
- // Ok(n) => {
- // bytes_read += n;
- // if bytes_read == received_data.len() {
- // received_data.resize(received_data.len() + 1024, 0);
- // }
- // }
- // Err(ref err) if err.kind() == ErrorKind::WouldBlock => break,
- // Err(ref err) if err.kind() == ErrorKind::Interrupted => continue,
- // Err(err) => return Err(Box::new(err)),
- // }
- // }
- //
- // if bytes_read != 0 {
- // self.handle(
- // &mut received_data[..bytes_read],
- // token,
- // );
- // }
- // if connection_closed {
- // println!("de-registered peer with token '{}'", token.0);
- // return Ok(true);
- // }
- // }
- //
- // Ok(false)
- // }
-
- // fn handle(
- // &mut self,
- // data: &[u8],
- // // stream: &mut TcpStream,
- // token: Token,
- // ) -> () {
- // // trace!("i am client: {:?}", self.clients.get(&token));
- // // debug!("{:?}", self.connections);
- // for cmd in get_commands_from_buffer(BytesMut::from(data)) {
- // debug!("received: {:?}", cmd);
- // match cmd.get(2).unwrap() {
- // 10 => { // PROPREQ
- // debug!("received property request command from client 'null'");
- // self.connections.get_mut(&token).unwrap()
- // .write_all(&create_property_update_command()).unwrap();
- // debug!("sent property update command to client 'null'");
- // }
- // 6 => { // SESSINIT
- // let local_username =
- // parse_session_initialization_command(cmd).username;
- // self.clients.insert(token, local_username.clone());
- // debug!(
- // "received session initialization command from client '{}'",
- // local_username,
- // );
- // self.connections.get_mut(&token).unwrap()
- // .write_all(&create_property_request_command()).unwrap();
- // debug!("sent session initialization command to client '{}'", local_username);
- // }
- // 15 => { // PROPSET
- // let avatar = parse_property_set_command(cmd);
- // debug!(
- // "received property set command from client '{}': {}",
- // self.clients.get(&token).unwrap(),
- // avatar,
- // );
- // self.connections.get_mut(&token).unwrap()
- // .write_all(&create_text_command_with_action(
- // "WORLDSMASTER", &get_config().unwrap().worldsmaster_greeting,
- // )).unwrap();
- // debug!(
- // "sent session initialization command to client '{}'",
- // self.clients.get(&token).unwrap(),
- // );
- // }
- // 29 => { // BUDDYLISTUPDATE
- // let received_buddy = from_utf8(
- // cmd.get(4..cmd.get(0).unwrap().to_owned() as usize - 1).unwrap()
- // ).unwrap();
- // debug!(
- // "received buddy list update command from client '{}': {}",
- // self.clients.get(&token).unwrap(),
- // received_buddy,
- // );
- // self.connections.get_mut(&token).unwrap()
- // .write_all(&create_buddy_list_notify_command(received_buddy)).unwrap();
- // debug!(
- // "sent buddy list notify command to client '{}'",
- // self.clients.get(&token).unwrap(),
- // );
- // }
- // 20 => { // ROOMIDRQ
- // let room_name = from_utf8(
- // cmd.get(4..cmd.get(0).unwrap().to_owned() as usize).unwrap()
- // ).unwrap();
- // debug!(
- // "received room id request command from client '{}': {}",
- // self.clients.get(&token).unwrap(),
- // room_name,
- // );
- // let room_id;
- // if !self.room_ids.contains(&room_name.to_string()) {
- // self.room_ids.push(room_name.to_string());
- // room_id = self.room_ids.iter()
- // .position(|i| i == &room_name.to_string())
- // .unwrap();
- // trace!("inserted room '{}' as '{}'", room_name, room_id);
- // } else {
- // let position = self.room_ids.iter()
- // .position(|i| i == &room_name.to_string())
- // .unwrap();
- // trace!("found room '{}' as '{}'", room_name, position);
- // room_id = position;
- // }
- // trace!("room name: {}, room id: {}", room_name, room_id);
- // trace!("{:?}", self.room_ids);
- // self.connections.get_mut(&token).unwrap()
- // .write_all(&create_room_id_redirect_command(
- // room_name, room_id,
- // )).unwrap();
- // }
- // 14 => { // TEXT
- // let text = from_utf8(
- // cmd.get(6..cmd.get(0).unwrap().to_owned() as usize).unwrap()
- // ).unwrap();
- // let username = self.clients.get(&token).unwrap().clone();
- // debug!(
- // "received text command from client '{}': {}",
- // username, text,
- // );
- // self.connections.iter_mut().for_each(|t|
- // t.1.write_all(&create_text_command(
- // &username,
- // text,
- // )).unwrap()
- // );
- // debug!("broadcasted text command to clients");
- // }
- // 7 => { // SESSEXIT
- // debug!(
- // "received session exit command from client '{}'",
- // self.clients.get(&token).unwrap(),
- // );
- // }
- // _ => (),
- // }
- // }
- // }
-}
diff --git a/src/server_dev/auto/___server.rs b/src/server_dev/auto/___server.rs
deleted file mode 100644
index 2f95952..0000000
--- a/src/server_dev/auto/___server.rs
+++ /dev/null
@@ -1,266 +0,0 @@
-use std::error::Error;
-use crate::server::auto::cmd::property::{
- create_property_update_command,
- create_property_request_command
-};
-use crate::server::cmd::text::{create_text_command_with_action, create_text_command};
-use std::str::from_utf8;
-use crate::server::cmd::buddy_list::create_buddy_list_notify_command;
-use crate::server::auto::cmd::room::create_room_id_redirect_command;
-use crate::server::auto::cmd::session::parse_session_initialization_command;
-use crate::server::parser::get_commands_from_buffer;
-use crate::server::cmd::property::parse_property_set_command;
-use crate::config::get_config;
-use mio::{Poll, Events, Token, Interest, Registry};
-use mio::net::{TcpListener, TcpStream};
-use std::collections::HashMap;
-use mio::event::Event;
-use std::io::{Read, ErrorKind, Write};
-use bytes::BytesMut;
-
-const SERVER: Token = Token(0);
-
-pub struct AutoServer {
- pub clients: HashMap<Token, String>,
- pub connections: HashMap<Token, TcpStream>,
- pub room_ids: Vec<String>,
-}
-impl AutoServer {
- pub fn listen(&mut self, addr: &str) -> Result<(), Box<dyn Error>> {
- let mut server = TcpListener::bind(addr.parse().unwrap())?;
- let mut poll = Poll::new()?;
- let mut events = Events::with_capacity(1024);
- let mut unique_token = Token(SERVER.0 + 1);
-
- poll.registry().register(
- &mut server,
- SERVER,
- Interest::READABLE
- )?;
-
- debug!("AutoServer now listening on {}", server.local_addr().unwrap());
-
- loop {
- poll.poll(&mut events, None)?;
-
- for event in &events {
- match event.token() {
- SERVER => loop {
- let (mut stream, address) = match server.accept() {
- Ok((stream, address)) => (stream, address),
- Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => break,
- Err(e) => return Err(Box::new(e)),
- };
-
- let token = AutoServer::next(&mut unique_token);
- poll.registry().register(
- &mut stream,
- token,
- Interest::READABLE, //.add(Interest::WRITABLE),
- )?;
-
- self.connections.insert(token, stream);
-
- debug!("registered peer with address '{}' as '{}'", address, token.0);
- },
- token => {
- // let done = if let Some(stream) = self.connections.get_mut(&token) {
- // self.process(
- // poll.registry(),
- // event,
- // token,
- // )?
- // } else {
- // false
- // };
-
- let done = self.process(
- poll.registry(),
- event,
- token,
- )?;
- if done { self.connections.remove(&token); }
- }
- }
- }
- }
- }
-
- fn next(current: &mut Token) -> Token {
- let next = current.0;
- current.0 += 1;
- Token(next)
- }
-
- fn broadcast(mut self, cmd: &[u8]) -> () {
- self.connections.iter_mut()
- .for_each(|c|
- c.1.write_all(cmd).unwrap()
- );
- }
-
- fn process(
- &mut self,
- _registry: &Registry,
- event: &Event,
- token: Token,
- ) -> Result<bool, Box<dyn Error>> {
- if event.is_readable() {
- let mut connection_closed = false;
- let mut received_data = vec![0; 4096];
- let mut bytes_read = 0;
-
- let stream = self.connections.get_mut(&token).unwrap();
-
- loop {
- match stream.read(&mut received_data[bytes_read..]) {
- Ok(0) => {
- connection_closed = true;
- break;
- }
- Ok(n) => {
- bytes_read += n;
- if bytes_read == received_data.len() {
- received_data.resize(received_data.len() + 1024, 0);
- }
- }
- Err(ref err) if err.kind() == ErrorKind::WouldBlock => break,
- Err(ref err) if err.kind() == ErrorKind::Interrupted => continue,
- Err(err) => return Err(Box::new(err)),
- }
- }
-
- if bytes_read != 0 {
- self.handle(
- &mut received_data[..bytes_read],
- token,
- );
- }
- if connection_closed {
- println!("de-registered peer with token '{}'", token.0);
- return Ok(true);
- }
- }
-
- Ok(false)
- }
-
- fn handle(
- &mut self,
- data: &[u8],
- // stream: &mut TcpStream,
- token: Token,
- ) -> () {
- // trace!("i am client: {:?}", self.clients.get(&token));
- // debug!("{:?}", self.connections);
- for cmd in get_commands_from_buffer(BytesMut::from(data)) {
- debug!("received: {:?}", cmd);
- match cmd.get(2).unwrap() {
- 10 => { // PROPREQ
- debug!("received property request command from client 'null'");
- self.connections.get_mut(&token).unwrap()
- .write_all(&create_property_update_command()).unwrap();
- debug!("sent property update command to client 'null'");
- }
- 6 => { // SESSINIT
- let local_username =
- parse_session_initialization_command(cmd).username;
- self.clients.insert(token, local_username.clone());
- debug!(
- "received session initialization command from client '{}'",
- local_username,
- );
- self.connections.get_mut(&token).unwrap()
- .write_all(&create_property_request_command()).unwrap();
- debug!("sent session initialization command to client '{}'", local_username);
- }
- 15 => { // PROPSET
- let avatar = parse_property_set_command(cmd);
- debug!(
- "received property set command from client '{}': {}",
- self.clients.get(&token).unwrap(),
- avatar,
- );
- self.connections.get_mut(&token).unwrap()
- .write_all(&create_text_command_with_action(
- "WORLDSMASTER", &get_config().unwrap().worldsmaster_greeting,
- )).unwrap();
- debug!(
- "sent session initialization command to client '{}'",
- self.clients.get(&token).unwrap(),
- );
- }
- 29 => { // BUDDYLISTUPDATE
- let received_buddy = from_utf8(
- cmd.get(4..cmd.get(0).unwrap().to_owned() as usize - 1).unwrap()
- ).unwrap();
- debug!(
- "received buddy list update command from client '{}': {}",
- self.clients.get(&token).unwrap(),
- received_buddy,
- );
- self.connections.get_mut(&token).unwrap()
- .write_all(&create_buddy_list_notify_command(received_buddy)).unwrap();
- debug!(
- "sent buddy list notify command to client '{}'",
- self.clients.get(&token).unwrap(),
- );
- }
- 20 => { // ROOMIDRQ
- let room_name = from_utf8(
- cmd.get(4..cmd.get(0).unwrap().to_owned() as usize).unwrap()
- ).unwrap();
- debug!(
- "received room id request command from client '{}': {}",
- self.clients.get(&token).unwrap(),
- room_name,
- );
- let room_id;
- if !self.room_ids.contains(&room_name.to_string()) {
- self.room_ids.push(room_name.to_string());
- room_id = self.room_ids.iter()
- .position(|i| i == &room_name.to_string())
- .unwrap();
- trace!("inserted room '{}' as '{}'", room_name, room_id);
- } else {
- let position = self.room_ids.iter()
- .position(|i| i == &room_name.to_string())
- .unwrap();
- trace!("found room '{}' as '{}'", room_name, position);
- room_id = position;
- }
- trace!("room name: {}, room id: {}", room_name, room_id);
- trace!("{:?}", self.room_ids);
- self.connections.get_mut(&token).unwrap()
- .write_all(&create_room_id_redirect_command(
- room_name, room_id,
- )).unwrap();
- }
- 14 => { // TEXT
- let text = from_utf8(
- cmd.get(6..cmd.get(0).unwrap().to_owned() as usize).unwrap()
- ).unwrap();
- let username = self.clients.get(&token).unwrap().clone();
- debug!(
- "received text command from client '{}': {}",
- username, text,
- );
- self.connections.iter_mut().for_each(|t|
- t.1.write_all(&create_text_command(
- &username,
- text,
- )).unwrap()
- );
- debug!("broadcasted text command to clients");
- }
- 7 => { // SESSEXIT
- debug!(
- "received session exit command from client '{}'",
- self.clients.get(&token).unwrap(),
- );
- }
- _ => (),
- }
- }
- }
-}
diff --git a/src/server_dev/auto/__server.rs b/src/server_dev/auto/__server.rs
deleted file mode 100644
index b72b7e7..0000000
--- a/src/server_dev/auto/__server.rs
+++ /dev/null
@@ -1,230 +0,0 @@
-use std::error::Error;
-use crate::server::auto::cmd::property::{
- create_property_update_command,
- create_property_request_command
-};
-use crate::server::cmd::text::{create_text_command_with_action, create_text_command};
-use std::str::from_utf8;
-use crate::server::cmd::buddy_list::create_buddy_list_notify_command;
-use crate::server::auto::cmd::room::create_room_id_redirect_command;
-use crate::server::auto::cmd::session::parse_session_initialization_command;
-use crate::server::parser::get_commands_from_buffer;
-use crate::server::cmd::property::parse_property_set_command;
-use crate::config::get_config;
-use mio::{Poll, Events, Token, Interest, Registry};
-use mio::net::{TcpListener, TcpStream};
-use std::collections::HashMap;
-use mio::event::Event;
-use std::io::{Read, ErrorKind, Write};
-use bytes::BytesMut;
-
-const SERVER: Token = Token(0);
-
-pub struct AutoServer {
- pub clients: HashMap<Token, String>,
- pub connections: HashMap<Token, TcpStream>,
-}
-impl AutoServer {
- pub fn listen(&mut self, addr: &str) -> Result<(), Box<dyn Error>> {
- let mut server = TcpListener::bind(addr.parse().unwrap())?;
- let mut poll = Poll::new()?;
- let mut events = Events::with_capacity(1024);
- let mut connections = HashMap::new();
- let mut unique_token = Token(SERVER.0 + 1);
-
- poll.registry().register(
- &mut server,
- SERVER,
- Interest::READABLE
- )?;
-
- debug!("AutoServer now listening on {}", server.local_addr().unwrap());
-
- loop {
- poll.poll(&mut events, None)?;
-
- for event in events.iter() {
- match event.token() {
- SERVER => loop {
- let (mut stream, address) = match server.accept() {
- Ok((stream, address)) => (stream, address),
- Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => break,
- Err(e) => return Err(Box::new(e)),
- };
-
- let token = AutoServer::next(&mut unique_token);
- poll.registry().register(
- &mut stream,
- token,
- Interest::READABLE, //.add(Interest::WRITABLE),
- )?;
-
- connections.insert(token, stream);
-
- println!("registered peer with address '{}' as '{}'", address, token.0);
- },
- token => {
- let done = if let Some(stream) = connections.get_mut(&token) {
- self.process(
- poll.registry(),
- stream,
- event,
- token,
- )?
- } else {
- false
- };
- if done { connections.remove(&token); }
- }
- }
- }
- }
- }
-
- fn next(current: &mut Token) -> Token {
- let next = current.0;
- current.0 += 1;
- Token(next)
- }
-
- fn broadcast(self, cmd: &[u8]) -> () {
- for mut connection in self.connections {
- connection.1.write(cmd).unwrap();
- }
- }
-
- fn process(
- &mut self,
- _registry: &Registry,
- stream: &mut TcpStream,
- event: &Event,
- token: Token,
- ) -> Result<bool, Box<dyn Error>> {
- if event.is_readable() {
- let mut connection_closed = false;
- let mut received_data = vec![0; 4096];
- let mut bytes_read = 0;
-
- loop {
- match stream.read(&mut received_data[bytes_read..]) {
- Ok(0) => {
- connection_closed = true;
- break;
- }
- Ok(n) => {
- bytes_read += n;
- if bytes_read == received_data.len() {
- received_data.resize(received_data.len() + 1024, 0);
- }
- }
- Err(ref err) if err.kind() == ErrorKind::WouldBlock => break,
- Err(ref err) if err.kind() == ErrorKind::Interrupted => continue,
- Err(err) => return Err(Box::new(err)),
- }
- }
-
- if bytes_read != 0 {
- self.handle(
- &mut received_data[..bytes_read],
- stream,
- token,
- );
- }
- if connection_closed {
- debug!("connection closed");
- return Ok(true);
- }
- }
-
- Ok(false)
- }
-
- fn handle(
- &mut self,
- data: &[u8],
- stream: &mut TcpStream,
- token: Token,
- ) -> () {
- trace!("i am client: {:?}", self.clients.get(&token));
- // let local_client = self.clients.get(&token)
- // .unwrap_or(&"null".to_string());
- for cmd in get_commands_from_buffer(BytesMut::from(data)) {
- debug!("received: {:?}", cmd);
- match cmd.get(2).unwrap() {
- 10 => { // PROPREQ
- debug!("received property request command from client 'null'");
- stream.write_all(&create_property_update_command()).unwrap();
- debug!("sent property update command to client 'null'");
- }
- 6 => { // SESSINIT
- let username =
- parse_session_initialization_command(cmd).username;
- self.clients.insert(token, username.clone());
- debug!(
- "received session initialization command from client '{}'",
- username,
- );
- stream.write_all(&create_property_request_command()).unwrap();
- debug!("sent session initialization command to client '{}'", username);
- }
- 15 => { // PROPSET
- let avatar = parse_property_set_command(cmd);
- debug!(
- "received property set command from client '{}': {}",
- self.clients.get(&token).unwrap(),
- avatar
- );
- stream.write_all(&create_text_command_with_action(
- "WORLDSMASTER", &get_config().unwrap().worldsmaster_greeting,
- )).unwrap();
- debug!(
- "sent session initialization command to client '{}'",
- self.clients.get(&token).unwrap(),
- );
- }
- 29 => { // BUDDYLISTUPDATE
- let received_buddy = from_utf8(
- cmd.get(4..cmd.get(0).unwrap().to_owned() as usize - 1).unwrap()
- ).unwrap();
- debug!(
- "received buddy list update command from client '{}': {}",
- self.clients.get(&token).unwrap(),
- received_buddy
- );
- stream.write_all(&create_buddy_list_notify_command(received_buddy)).unwrap();
- debug!(
- "sent buddy list notify command to client '{}'",
- self.clients.get(&token).unwrap(),
- );
- }
- 20 => { // ROOMIDRQ
- let room_name = from_utf8(
- cmd.get(4..cmd.get(0).unwrap().to_owned() as usize).unwrap()
- ).unwrap();
- debug!(
- "received room id request command from client '{}': {}",
- self.clients.get(&token).unwrap(), room_name,
- );
- }
- 14 => { // TEXT
- let text = from_utf8(
- cmd.get(6..cmd.get(0).unwrap().to_owned() as usize).unwrap()
- ).unwrap();
- debug!(
- "received text command from client '{}': {}",
- self.clients.get(&token).unwrap(),
- text,
- );
- debug!("broadcasted text command to clients");
- }
- 7 => { // SESSEXIT
- debug!(
- "received session exit command from client '{}'",
- self.clients.get(&token).unwrap(),
- );
- }
- _ => (),
- }
- }
- }
-}
diff --git a/src/server_dev/auto/_server.rs b/src/server_dev/auto/_server.rs
deleted file mode 100644
index 8b7fa6c..0000000
--- a/src/server_dev/auto/_server.rs
+++ /dev/null
@@ -1,182 +0,0 @@
-use std::error::Error;
-use tokio::net::{TcpListener, TcpStream};
-use tokio::io::AsyncWriteExt;
-use crate::server::auto::cmd::property::{
- create_property_update_command,
- create_property_request_command
-};
-use tokio_util::codec::{BytesCodec, Decoder};
-use tokio_stream::StreamExt;
-use crate::server::cmd::text::{create_text_command_with_action, create_text_command};
-use std::str::from_utf8;
-use crate::server::cmd::buddy_list::create_buddy_list_notify_command;
-use crate::server::auto::cmd::room::create_room_id_redirect_command;
-use std::sync::Arc;
-use tokio::sync::Mutex;
-use crate::server::shared::Shared;
-use crate::server::peer::Peer;
-use std::net::SocketAddr;
-use crate::server::auto::cmd::session::parse_session_initialization_command;
-use crate::server::parser::get_commands_from_buffer;
-use crate::server::cmd::property::parse_property_set_command;
-use crate::config::get_config;
-use crate::server::cmd::action::create_action_command;
-
-pub struct AutoServer;
-impl AutoServer {
- pub async fn listen(addr: &str) -> Result<(), Box<dyn Error>> {
- let listener = TcpListener::bind(addr).await?;
- debug!("AutoServer now listening on {}", listener.local_addr().unwrap());
- let state = Arc::new(Mutex::new(Shared::new()));
- let mut counter = 0;
-
- loop {
- let (stream, address) = listener.accept().await?;
- counter += 1;
- let state = Arc::clone(&state);
-
- tokio::spawn(async move {
- if let Err(e) = AutoServer::handle(
- state,
- stream,
- address,
- counter
- ).await {
- error!("an error occurred: {}", e);
- }
- });
- }
- }
-
- pub async fn handle(
- state: Arc<Mutex<Shared>>,
- stream: TcpStream,
- address: SocketAddr,
- count: usize,
- ) -> Result<(), Box<dyn Error>> {
- let bytes = BytesCodec::new().framed(stream);
- let mut peer = Peer::new(state.clone(), bytes, count.to_string()).await?;
- debug!("registered peer with address '{}' as '{}'", address, count);
- let mut room_ids: Vec<String> = Vec::new();
- let mut username: String = String::new();
-
- loop {
- tokio::select! {
- Some(msg) = peer.rx.recv() => {
- // debug!("received bytes from peer: {:?}", &msg);
- peer.bytes.get_mut().write_all(&msg).await?;
- }
- result = peer.bytes.next() => match result {
- Some(Ok(msg)) => {
- // let msg: BytesMut = msg;
- for msg in get_commands_from_buffer(msg) {
- match msg.get(2).unwrap() {
- 10 => { // PROPREQ
- debug!("received property request command from client");
- peer.bytes.get_mut()
- .write_all(&create_property_update_command()).await?;
- debug!("sent property update command to client");
- }
- 6 => { // SESSINIT
- username = parse_session_initialization_command(msg.clone()).username;
- debug!(
- "received session initialization command from client: {}",
- username
- );
- peer.bytes.get_mut()
- .write_all(&create_property_request_command()).await?;
- debug!("sent session initialization command to client");
- }
- 15 => { // PROPSET
- let avatar = parse_property_set_command(msg.clone());
- debug!("received property set command from client: {}", avatar);
- peer.bytes.get_mut()
- .write_all(&create_text_command(
- "WORLDSMASTER", &get_config()?.worldsmaster_greeting
- )).await?;
- peer.bytes.get_mut()
- .write_all(&create_action_command()).await?;
- debug!("sent worldsmaster greeting to client");
- }
- 29 => { // BUDDYLISTUPDATE
- let received_buddy = from_utf8(
- msg.get(4..msg.get(0).unwrap().to_owned() as usize - 1).unwrap()
- ).unwrap();
- debug!(
- "received buddy list update command from client: {}",
- received_buddy
- );
- let buddies = vec![
- "dosfox",
- "Fallen_Angel",
- "Internet_Man",
- "Nexialist",
- "SirGemini",
- "SirGrandpa",
- "Wirlaburla",
- ];
- if buddies.contains(&received_buddy) {
- peer.bytes.get_mut()
- .write_all(&create_buddy_list_notify_command(received_buddy))
- .await?;
- debug!("sent buddy list notify command to client: {}", received_buddy);
- }
- }
- 20 => { // ROOMIDRQ
- let room_name = from_utf8(
- msg.get(4..msg.get(0).unwrap().to_owned() as usize).unwrap()
- ).unwrap();
- debug!("received room id request command from client: {}", room_name);
- let room_id;
- if !room_ids.contains(&room_name.to_string()) {
- room_ids.push(room_name.to_string());
- room_id = room_ids.iter()
- .position(|i| i == &room_name.to_string())
- .unwrap();
- trace!("inserted room '{}' as '{}'", room_name, room_id);
- } else {
- let position = room_ids.iter()
- .position(|i| i == &room_name.to_string())
- .unwrap();
- trace!("found room '{}' as '{}'", room_name, position);
- room_id = position;
- }
- trace!("room name: {}, room id: {}", room_name, room_id);
- trace!("{:?}", room_ids);
- peer.bytes.get_mut()
- .write_all(&create_room_id_redirect_command(room_name, room_id))
- .await?;
- debug!("sent redirect id command to client: {} == {}", room_name, room_id);
- }
- 14 => {
- let text = from_utf8(
- msg.get(6..msg.get(0).unwrap().to_owned() as usize).unwrap()
- ).unwrap();
- debug!("received text command from client: {}", text);
- let mut state = state.lock().await;
- state.broadcast(&create_text_command(&username, text)).await;
- debug!("broadcasted text command from client");
- }
- 7 => { // SESSEXIT
- debug!("received session exit command from client")
- }
- _ => (),
- }
- }
- }
- Some(Err(e)) => {
- error!("error while processing messages: {}", e); break;
- }
- None => break,
- }
- }
- }
-
- { // De-register client
- state.lock().await.peers.remove(&count.to_string());
- debug!("removed peer: {}", count)
- }
-
- Ok(())
- }
-}
diff --git a/src/server_dev/auto/cmd/mod.rs b/src/server_dev/auto/cmd/mod.rs
deleted file mode 100644
index d2345c6..0000000
--- a/src/server_dev/auto/cmd/mod.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-pub mod property;
-pub mod room;
-pub mod session;
diff --git a/src/server_dev/auto/cmd/property.rs b/src/server_dev/auto/cmd/property.rs
deleted file mode 100644
index e266757..0000000
--- a/src/server_dev/auto/cmd/property.rs
+++ /dev/null
@@ -1,24 +0,0 @@
-pub fn create_property_update_command() -> [u8; 147] {
- [
- 0x93, 0xFF, 0x10, 0x1B, 0x80, 0x01, 0x0C, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x73, 0x33, 0x64, 0x2E,
- 0x63, 0x6F, 0x6D, 0x1A, 0x80, 0x01, 0x12, 0x6D, 0x61, 0x69, 0x6C, 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, 0x31, 0x03, 0x80, 0x01,
- 0x02, 0x32, 0x34, 0x01, 0x80, 0x01, 0x0C, 0x57, 0x4F, 0x52, 0x4C, 0x44, 0x53, 0x4D, 0x41, 0x53,
- 0x54, 0x45, 0x52,
- ]: [u8; 147]
-}
-
-pub fn create_property_request_command() -> [u8; 61] {
- [
- 0x3D, 0x01, 0x06, 0x04, 0x01, 0x30, 0x01, 0x0C, 0x57, 0x4F, 0x52, 0x4C, 0x44, 0x53, 0x4D, 0x41,
- 0x53, 0x54, 0x45, 0x52, 0x03, 0x02, 0x32, 0x34, 0x0F, 0x01, 0x31, 0x0A, 0x10,
- // VAR_SERIAL: DWLV000000000000
- 0x44, 0x57, 0x4c, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x16, 0x01, 0x30, 0x05, 0x0B, 0x64, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x2D, 0x31,
- ]: [u8; 61]
-}
diff --git a/src/server_dev/auto/cmd/room.rs b/src/server_dev/auto/cmd/room.rs
deleted file mode 100644
index 79786ef..0000000
--- a/src/server_dev/auto/cmd/room.rs
+++ /dev/null
@@ -1,33 +0,0 @@
-pub fn create_room_id_redirect_command(room_name: &str, room_id: usize) -> Vec<u8> {
- let mut room_id_redirect = vec![
- 0x01, // ?
- 0x1A, // Command type
- ];
-
- // room_id_redirect.push(room_id_redirect.len() as u8 + 1); // Data length
- 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
- for byte in 5673_u16.to_be_bytes().iter() {
- room_id_redirect.push(*byte);
- }
-
- room_id_redirect.insert(0, room_id_redirect.len() as u8 + 1); // Data length
-
- room_id_redirect
-}
diff --git a/src/server_dev/auto/cmd/session.rs b/src/server_dev/auto/cmd/session.rs
deleted file mode 100644
index 19969dc..0000000
--- a/src/server_dev/auto/cmd/session.rs
+++ /dev/null
@@ -1,36 +0,0 @@
-use std::str::from_utf8;
-
-use bytes::BytesMut;
-
-use crate::server::cmd::session::SessionInitializationCommand;
-
-struct _SessionInitializationCommandServer {
- pub error: usize,
- pub app_name: String,
- pub protocol: usize,
- pub server_type: usize,
- pub serial: String,
- pub private: usize,
- pub channel: String,
-}
-
-pub fn parse_session_initialization_command(command: BytesMut) -> SessionInitializationCommand {
- SessionInitializationCommand {
- // protocol: command.get(4..4 + command.get(4)).unwrap().to_owned() as usize,
- // client: "".to_string(),
- username: from_utf8(
- command
- .get(21..(20 + command.get(20).unwrap().to_owned() as usize + 1))
- .unwrap(),
- )
- .unwrap()
- .to_string(),
- // password: "".to_string()
- }
-}
-
-// pub fn create_session_initialization_command() ->
-// SessionInitializationCommandServer { SessionInitializationCommandServer {
-//
-// }
-// }
diff --git a/src/server_dev/auto/mod.rs b/src/server_dev/auto/mod.rs
deleted file mode 100644
index 24606ea..0000000
--- a/src/server_dev/auto/mod.rs
+++ /dev/null
@@ -1,2 +0,0 @@
-pub mod cmd;
-pub mod server;
diff --git a/src/server_dev/auto/server.rs b/src/server_dev/auto/server.rs
deleted file mode 100644
index 164b271..0000000
--- a/src/server_dev/auto/server.rs
+++ /dev/null
@@ -1,319 +0,0 @@
-use std::{
- collections::HashMap,
- error::Error,
- io::{ErrorKind, Read, Write},
- ops::Deref,
- str::from_utf8,
-};
-
-use bytes::BytesMut;
-use mio::{
- event::Event,
- net::{TcpListener, TcpStream},
- Events,
- Interest,
- Poll,
- Registry,
- Token,
-};
-
-use crate::{
- config::get_config,
- server::{
- auto::cmd::{
- property::{create_property_request_command, create_property_update_command},
- room::create_room_id_redirect_command,
- session::parse_session_initialization_command,
- },
- cmd::{
- action::create_action_command,
- buddy_list::create_buddy_list_notify_command,
- property::parse_property_set_command,
- text::{create_text_command, create_text_command_with_action},
- },
- parser::get_commands_from_buffer,
- },
-};
-
-const SERVER: Token = Token(0);
-
-pub struct AutoServer {
- pub clients: HashMap<Token, String>,
- pub connections: HashMap<Token, TcpStream>,
- pub room_ids: Vec<String>,
-}
-impl AutoServer {
- pub fn listen(&mut self, addr: &str) -> Result<(), Box<dyn Error>> {
- let mut server = TcpListener::bind(addr.parse().unwrap())?;
- let mut poll = Poll::new()?;
- let mut events = Events::with_capacity(1024);
- let mut unique_token = Token(SERVER.0 + 1);
-
- poll
- .registry()
- .register(&mut server, SERVER, Interest::READABLE)?;
-
- debug!(
- "AutoServer now listening on {}",
- server.local_addr().unwrap()
- );
-
- loop {
- poll.poll(&mut events, None)?;
-
- for event in &events {
- match event.token() {
- SERVER => {
- loop {
- let (mut stream, address) = match server.accept() {
- Ok((stream, address)) => (stream, address),
- Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => break,
- Err(e) => return Err(Box::new(e)),
- };
-
- let token = AutoServer::next(&mut unique_token);
- poll.registry().register(
- &mut stream,
- token,
- Interest::READABLE, //.add(Interest::WRITABLE),
- )?;
-
- self.connections.insert(token, stream);
-
- debug!(
- "registered peer with address '{}' as '{}'",
- address, token.0
- );
- }
- }
- token => {
- let done = self.process(poll.registry(), event, token)?;
- if done {
- self.connections.remove(&token);
- }
- }
- }
- }
- }
- }
-
- fn next(current: &mut Token) -> Token {
- let next = current.0;
- current.0 += 1;
- Token(next)
- }
-
- fn broadcast(mut self, cmd: &[u8]) -> () {
- self
- .connections
- .iter_mut()
- .for_each(|c| c.1.write_all(cmd).unwrap());
- }
-
- fn process(
- &mut self,
- _registry: &Registry,
- event: &Event,
- token: Token,
- ) -> Result<bool, Box<dyn Error>> {
- if event.is_readable() {
- let mut connection_closed = false;
- let mut received_data = vec![0; 4096];
- let mut bytes_read = 0;
-
- let stream = self.connections.get_mut(&token).unwrap();
-
- loop {
- match stream.read(&mut received_data[bytes_read..]) {
- Ok(0) => {
- connection_closed = true;
- break;
- }
- Ok(n) => {
- bytes_read += n;
- if bytes_read == received_data.len() {
- received_data.resize(received_data.len() + 1024, 0);
- }
- }
- Err(ref err) if err.kind() == ErrorKind::WouldBlock => break,
- Err(ref err) if err.kind() == ErrorKind::Interrupted => continue,
- Err(err) => return Err(Box::new(err)),
- }
- }
-
- if bytes_read != 0 {
- self.handle(&mut received_data[..bytes_read], token);
- }
- if connection_closed {
- println!("de-registered peer with token '{}'", token.0);
- return Ok(true);
- }
- }
-
- Ok(false)
- }
-
- fn handle(&mut self, data: &[u8], token: Token) -> () {
- // trace!("i am client: {:?}", self.clients.get(&token));
- // debug!("{:?}", self.connections);
- for cmd in get_commands_from_buffer(BytesMut::from(data)) {
- debug!("received: {:?}", cmd);
- match cmd.get(2).unwrap() {
- 10 => {
- // PROPREQ
- debug!("received property request command from client 'null'");
- self
- .connections
- .get_mut(&token)
- .unwrap()
- .write_all(&create_property_update_command())
- .unwrap();
- debug!("sent property update command to client 'null'");
- }
- 6 => {
- // SESSINIT
- let local_username = parse_session_initialization_command(cmd).username;
- self.clients.insert(token, local_username.clone());
- debug!(
- "received session initialization command from client '{}'",
- local_username,
- );
- self
- .connections
- .get_mut(&token)
- .unwrap()
- .write_all(&create_property_request_command())
- .unwrap();
- debug!(
- "sent session initialization command to client '{}'",
- local_username
- );
- }
- 15 => {
- // PROPSET
- let avatar = parse_property_set_command(cmd);
- debug!(
- "received property set command from client '{}': {}",
- self.clients.get(&token).unwrap(),
- avatar,
- );
- self
- .connections
- .get_mut(&token)
- .unwrap()
- .write_all(&create_text_command(
- "WORLDSMASTER",
- &get_config().unwrap().worldsmaster_greeting,
- ))
- .unwrap();
- self
- .connections
- .get_mut(&token)
- .unwrap()
- .write_all(&create_action_command())
- .unwrap();
- debug!(
- "sent session initialization command to client '{}'",
- self.clients.get(&token).unwrap(),
- );
- }
- 29 => {
- // BUDDYLISTUPDATE
- let received_buddy = from_utf8(
- cmd
- .get(4..cmd.get(0).unwrap().to_owned() as usize - 1)
- .unwrap(),
- )
- .unwrap();
- debug!(
- "received buddy list update command from client '{}': {}",
- self.clients.get(&token).unwrap(),
- received_buddy,
- );
- let buddies = vec![
- "dosfox",
- "Fallen_Angel",
- "Internet_Man",
- "Nexialist",
- "SirGemini",
- "SirGrandpa",
- "Wirlaburla",
- ];
- if buddies.contains(&received_buddy) {
- self
- .connections
- .get_mut(&token)
- .unwrap()
- .write_all(&create_buddy_list_notify_command(received_buddy))
- .unwrap();
- debug!(
- "sent buddy list notify command to client '{}'",
- self.clients.get(&token).unwrap(),
- );
- }
- }
- 20 => {
- // ROOMIDRQ
- let room_name =
- from_utf8(cmd.get(4..cmd.get(0).unwrap().to_owned() as usize).unwrap()).unwrap();
- debug!(
- "received room id request command from client '{}': {}",
- self.clients.get(&token).unwrap(),
- room_name,
- );
- let room_id;
- if !self.room_ids.contains(&room_name.to_string()) {
- self.room_ids.push(room_name.to_string());
- room_id = self
- .room_ids
- .iter()
- .position(|i| i == &room_name.to_string())
- .unwrap();
- trace!("inserted room '{}' as '{}'", room_name, room_id);
- } else {
- let position = self
- .room_ids
- .iter()
- .position(|i| i == &room_name.to_string())
- .unwrap();
- trace!("found room '{}' as '{}'", room_name, position);
- room_id = position;
- }
- trace!("room name: {}, room id: {}", room_name, room_id);
- trace!("{:?}", self.room_ids);
- self
- .connections
- .get_mut(&token)
- .unwrap()
- .write_all(&create_room_id_redirect_command(room_name, room_id))
- .unwrap();
- }
- 14 => {
- // TEXT
- let text =
- from_utf8(cmd.get(6..cmd.get(0).unwrap().to_owned() as usize).unwrap()).unwrap();
- let username = self.clients.get(&token).unwrap().clone();
- debug!(
- "received text command from client '{}': {}",
- username,
- format!("auto {}", text),
- );
- self.connections.iter_mut().for_each(|t| {
- t.1
- .write_all(&create_text_command(&username, text))
- .unwrap()
- });
- debug!("broadcasted text command to clients");
- }
- 7 => {
- // SESSEXIT
- debug!(
- "received session exit command from client '{}'",
- self.clients.get(&token).unwrap(),
- );
- }
- _ => (),
- }
- }
- }
-}
diff --git a/src/server_dev/cmd/action.rs b/src/server_dev/cmd/action.rs
deleted file mode 100644
index 1cf9086..0000000
--- a/src/server_dev/cmd/action.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-pub fn create_action_command() -> [u8; 18] {
- [
- 0x12, 0x01, 0x11, 0x00, 0x05, 0x54, 0x52, 0x41, 0x44, 0x45, 0x07, 0x26, 0x7c, 0x2b, 0x69, 0x6e,
- 0x76, 0x3e,
- ]
-}
diff --git a/src/server_dev/cmd/buddy_list.rs b/src/server_dev/cmd/buddy_list.rs
deleted file mode 100644
index ba938f5..0000000
--- a/src/server_dev/cmd/buddy_list.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-pub fn create_buddy_list_notify_command(buddy: &str) -> Vec<u8> {
- let mut buddy_list_notify = Vec::with_capacity(5 + buddy.len());
- buddy_list_notify.push(0x01); // ?
- buddy_list_notify.push(0x1E); // BUDDYLISTNOTIFY
- buddy_list_notify.push(buddy.len() as u8); // Buddy name length
- for i in buddy.bytes() {
- buddy_list_notify.push(i);
- } // Buddy name
- buddy_list_notify.push(0x01); // Is buddy logged on?
- // Insert data length as first byte.
- buddy_list_notify.insert(0, buddy_list_notify.len() as u8 + 1); // ^
-
- buddy_list_notify // Return created array
-}
diff --git a/src/server_dev/cmd/mod.rs b/src/server_dev/cmd/mod.rs
deleted file mode 100644
index 6db7826..0000000
--- a/src/server_dev/cmd/mod.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-pub mod action;
-pub mod buddy_list;
-pub mod property;
-pub mod session;
-pub mod text;
diff --git a/src/server_dev/cmd/property.rs b/src/server_dev/cmd/property.rs
deleted file mode 100644
index 1530f58..0000000
--- a/src/server_dev/cmd/property.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use std::str::from_utf8;
-
-use bytes::BytesMut;
-
-pub fn parse_property_set_command(command: BytesMut) -> String {
- from_utf8(command.get(8..).unwrap()).unwrap().to_string()
-}
diff --git a/src/server_dev/cmd/session.rs b/src/server_dev/cmd/session.rs
deleted file mode 100644
index 97efc8f..0000000
--- a/src/server_dev/cmd/session.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-pub struct SessionInitializationCommand {
- // pub protocol: usize,
- // pub client: String,
- pub username: String,
- // pub password: String,
-}
diff --git a/src/server_dev/cmd/text.rs b/src/server_dev/cmd/text.rs
deleted file mode 100644
index cc306db..0000000
--- a/src/server_dev/cmd/text.rs
+++ /dev/null
@@ -1,55 +0,0 @@
-pub fn create_text_command(user: &str, message: &str) -> Vec<u8> {
- let mut text = Vec::with_capacity(6 + user.len() + message.len());
- text.push(0x01); // ?
- text.push(0x0E); // Command type
- text.push(0x00); // Assumed to be a divider.
- text.push(user.len() as u8); // 'user' length
- for i in user.bytes() {
- text.push(i);
- } // Pushing 'user'
- text.push(message.len() as u8); // 'message' length
- for i in message.bytes() {
- text.push(i);
- } // Pushing `message`
- text.insert(0, text.len() as u8 + 1); // Insert data length as first byte.
-
- text // Return created array
-}
-
-// TODO: Get this working!
-// pub fn get_message_from_text_command(buffer: &'static [u8; 1024]) -> &'static
-// str { from_utf8(
-// &buffer[6..*&buffer.get(0).unwrap().to_owned() as usize]
-// ).unwrap()
-// }
-
-pub fn create_text_command_with_action(
- user: &str,
- message: &str,
- // action: &str // Not accepting input until I figure out how actions work.
-) -> Vec<u8> {
- let mut text = Vec::with_capacity(6 + user.len() + message.len());
- text.push(0x01); // ?
- text.push(0x0E); // Command type
- text.push(0x00); // Assumed to be a divider.
- text.push(user.len() as u8); // 'user' length
- for i in user.bytes() {
- text.push(i);
- } // Pushing 'user'
- text.push(message.len() as u8); // 'message' length
- for i in message.bytes() {
- text.push(i);
- } // Pushing `message`
-
- let action: [u8; 18] = [
- 0x12, 0x01, 0x11, 0x00, 0x05, 0x54, 0x52, 0x41, 0x44, 0x45, 0x07, 0x26, 0x7c, 0x2b, 0x69, 0x6e,
- 0x76, 0x3e,
- ];
- for i in action.iter() {
- text.push(*i);
- }
-
- text.insert(0, text.len() as u8 + 1); // Insert data length as first byte.
-
- text // Return created array
-}
diff --git a/src/server_dev/mod.rs b/src/server_dev/mod.rs
deleted file mode 100644
index 6f2a839..0000000
--- a/src/server_dev/mod.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use bytes::BytesMut;
-use tokio::sync::mpsc;
-
-pub mod auto;
-mod cmd;
-mod parser;
-pub mod room;
diff --git a/src/server_dev/parser.rs b/src/server_dev/parser.rs
deleted file mode 100644
index f856650..0000000
--- a/src/server_dev/parser.rs
+++ /dev/null
@@ -1,35 +0,0 @@
-use bytes::BytesMut;
-
-/// Read all commands from the given buffer.
-///
-/// # Process
-/// 1. Get a command from `buffer` based on first byte.
-/// 2. Push command to `commands`.
-/// 3. Remove command from `buffer`.
-/// 4. Iterate and do this for all commands within `buffer`.
-pub fn get_commands_from_buffer(mut buffer: BytesMut) -> Vec<BytesMut> {
- let mut commands: Vec<BytesMut> = Vec::new();
- trace!("initial buffer: {:?}, length: {}", buffer, buffer.len());
-
- let data_length = buffer.get(0).unwrap().to_owned() as usize;
- if buffer.len() > data_length {
- loop {
- trace!("loop: {:?}, length: {}", buffer, buffer.len());
- let command_length = buffer.get(0).unwrap().to_owned() as usize;
- commands.push(BytesMut::from(buffer.get(0..command_length).unwrap()));
-
- // Remove command from buffer
- buffer = buffer.split_off(command_length);
-
- // Check if any more commands are present
- if buffer.is_empty() {
- break;
- }
- }
- } else {
- // There will always be at least one command, push it.
- commands.push(BytesMut::from(buffer.get(0..data_length).unwrap()));
- }
-
- commands // Return command (s)
-}
diff --git a/src/server_dev/room/__server.rs b/src/server_dev/room/__server.rs
deleted file mode 100644
index 0923e1b..0000000
--- a/src/server_dev/room/__server.rs
+++ /dev/null
@@ -1,382 +0,0 @@
-use std::error::Error;
-use crate::server::auto::cmd::property::{
- create_property_update_command,
- create_property_request_command
-};
-use crate::server::cmd::text::{create_text_command_with_action, create_text_command};
-use std::str::from_utf8;
-use crate::server::cmd::buddy_list::create_buddy_list_notify_command;
-use crate::server::auto::cmd::room::create_room_id_redirect_command;
-use crate::server::room::cmd::session::parse_session_initialization_command;
-use crate::server::parser::get_commands_from_buffer;
-use crate::server::cmd::property::parse_property_set_command;
-use crate::config::get_config;
-use mio::{Poll, Events, Token, Interest, Registry};
-use mio::net::{TcpListener, TcpStream};
-use std::collections::{HashMap, HashSet};
-use mio::event::Event;
-use std::io::{Read, ErrorKind, Write};
-use bytes::BytesMut;
-
-pub struct RoomServer {
- pub clients: HashMap<Token, String>,
- pub connections: HashMap<Token, TcpStream>,
- pub room_ids: Vec<String>,
-}
-impl RoomServer {
- pub fn listen(&mut self, addr: &str) -> Result<(), Box<dyn Error>> {
- let mut listener = TcpListener::bind(addr.parse().unwrap())?;
- let mut poll = Poll::new()?;
- let mut events = Events::with_capacity(1024);
- let mut counter: usize = 0;
- // let mut sockets = HashMap::new();
- let mut requests = HashMap::new();
- let mut buffer = [0 as u8; 1024];
- // let mut room_ids = vec![];
-
- poll.registry().register(
- &mut listener,
- Token(0),
- Interest::READABLE,
- )?;
-
- debug!("RoomServer now listening on {}", listener.local_addr().unwrap());
-
- loop {
- poll.poll(&mut events, None)?;
-
- for event in &events {
- match event.token() {
- Token(0) => loop {
- match listener.accept() {
- Ok((mut stream, address)) => {
- counter += 1;
- let token = Token(counter);
-
- poll.registry().register(
- &mut stream,
- token,
- Interest::READABLE,
- )?;
-
- debug!("registered peer with address '{}' as '{}'", address, token.0);
-
- // sockets.insert(token, stream);
- self.connections.insert(token, stream);
- requests.insert(token, Vec::with_capacity(192));
- }
- Err(ref err) if err.kind() == ErrorKind::WouldBlock => break,
- Err(err) => {
- error!("unexpected error: {}", err);
- poll.registry().deregister(
- self.connections.get_mut(&Token(counter)).unwrap(),
- )?;
- break;
- }
- }
- },
- token if event.is_readable() => {
- loop {
- let read = self.connections.get_mut(&token).unwrap()
- .read(&mut buffer);
- match read {
- Ok(0) => { self.connections.remove(&token); break; }
- Ok(n) => {
- let req = requests.get_mut(&token).unwrap();
- for b in &buffer[0..n] { req.push(*b); }
-
- for cmd in get_commands_from_buffer(BytesMut::from(&buffer[..n])) {
- match cmd.get(2).unwrap() {
- 10 => { // PROPREQ
- debug!("received property request command from client 'null'");
- self.connections.get_mut(&token).unwrap()
- .write_all(&create_property_update_command()).unwrap();
- debug!("sent property update command to client 'null'");
- }
- 6 => { // SESSINIT
- let local_username =
- parse_session_initialization_command(cmd).username;
- self.clients.insert(token, local_username.clone());
- debug!(
- "received session initialization command from client '{}'",
- local_username,
- );
- self.connections.get_mut(&token).unwrap()
- .write_all(&create_property_request_command()).unwrap();
- debug!("sent session initialization command to client '{}'", local_username);
- }
- 15 => { // PROPSET
- let avatar = parse_property_set_command(cmd);
- debug!(
- "received property set command from client '{}': {}",
- self.clients.get(&token).unwrap(),
- avatar,
- );
- self.connections.get_mut(&token).unwrap()
- .write_all(&create_text_command_with_action(
- "WORLDSMASTER", &get_config().unwrap().worldsmaster_greeting,
- )).unwrap();
- debug!(
- "sent session initialization command to client '{}'",
- self.clients.get(&token).unwrap(),
- );
- }
- 29 => { // BUDDYLISTUPDATE
- let received_buddy = from_utf8(
- cmd.get(4..cmd.get(0).unwrap().to_owned() as usize - 1).unwrap()
- ).unwrap();
- debug!(
- "received buddy list update command from client '{}': {}",
- self.clients.get(&token).unwrap(),
- received_buddy,
- );
- self.connections.get_mut(&token).unwrap()
- .write_all(&create_buddy_list_notify_command(received_buddy)).unwrap();
- debug!(
- "sent buddy list notify command to client '{}'",
- self.clients.get(&token).unwrap(),
- );
- }
- // 20 => { // ROOMIDRQ
- // let room_name = from_utf8(
- // cmd.get(4..cmd.get(0).unwrap().to_owned() as usize).unwrap()
- // ).unwrap();
- // debug!(
- // "received room id request command from client '{}': {}",
- // self.clients.get(&token).unwrap(),
- // room_name,
- // );
- // let room_id;
- // if !self.room_ids.contains(&room_name.to_string()) {
- // self.room_ids.push(room_name.to_string());
- // room_id = self.room_ids.iter()
- // .position(|i| i == &room_name.to_string())
- // .unwrap();
- // trace!("inserted room '{}' as '{}'", room_name, room_id);
- // } else {
- // let position = self.room_ids.iter()
- // .position(|i| i == &room_name.to_string())
- // .unwrap();
- // trace!("found room '{}' as '{}'", room_name, position);
- // room_id = position;
- // }
- // trace!("room name: {}, room id: {}", room_name, room_id);
- // trace!("{:?}", self.room_ids);
- // self.connections.get_mut(&token).unwrap()
- // .write_all(&create_room_id_redirect_command(
- // room_name, room_id,
- // )).unwrap();
- // }
- 14 => { // TEXT
- let text = from_utf8(
- cmd.get(6..cmd.get(0).unwrap().to_owned() as usize).unwrap()
- ).unwrap();
- let username = self.clients.get(&token).unwrap().clone();
- debug!(
- "received text command from client '{}': {}",
- username, format!("room: {}", text),
- );
- self.connections.iter_mut().for_each(|t|
- t.1.write_all(&create_text_command(
- &username,
- text,
- )).unwrap()
- );
- debug!("broadcasted text command to clients");
- }
- 7 => { // SESSEXIT
- debug!(
- "received session exit command from client '{}'",
- self.clients.get(&token).unwrap(),
- );
- }
- _ => (),
- }
- }
- }
- Err(ref err) if err.kind() == ErrorKind::WouldBlock =>
- break,
- Err(err) => { error!("unexpected error: {}", err); break; }
- }
- }
- }
- _ => (),
- }
- }
- }
- }
-
- fn broadcast(
- sockets: &HashMap<Token, TcpStream>,
- cmd: &[u8],
- ) -> () {
- for mut socket in sockets {
- socket.1.write_all(cmd).unwrap();
- }
- }
-
- // fn process(
- // &mut self,
- // _registry: &Registry,
- // event: &Event,
- // token: Token,
- // ) -> Result<bool, Box<dyn Error>> {
- // if event.is_readable() {
- // let mut connection_closed = false;
- // let mut received_data = vec![0; 4096];
- // let mut bytes_read = 0;
- //
- // let stream = self.connections.get_mut(&token).unwrap();
- //
- // loop {
- // match stream.read(&mut received_data[bytes_read..]) {
- // Ok(0) => {
- // connection_closed = true;
- // break;
- // }
- // Ok(n) => {
- // bytes_read += n;
- // if bytes_read == received_data.len() {
- // received_data.resize(received_data.len() + 1024, 0);
- // }
- // }
- // Err(ref err) if err.kind() == ErrorKind::WouldBlock => break,
- // Err(ref err) if err.kind() == ErrorKind::Interrupted => continue,
- // Err(err) => return Err(Box::new(err)),
- // }
- // }
- //
- // if bytes_read != 0 {
- // self.handle(
- // &mut received_data[..bytes_read],
- // token,
- // );
- // }
- // if connection_closed {
- // println!("de-registered peer with token '{}'", token.0);
- // return Ok(true);
- // }
- // }
- //
- // Ok(false)
- // }
-
- // fn handle(
- // &mut self,
- // data: &[u8],
- // // stream: &mut TcpStream,
- // token: Token,
- // ) -> () {
- // // trace!("i am client: {:?}", self.clients.get(&token));
- // // debug!("{:?}", self.connections);
- // for cmd in get_commands_from_buffer(BytesMut::from(data)) {
- // debug!("received: {:?}", cmd);
- // match cmd.get(2).unwrap() {
- // 10 => { // PROPREQ
- // debug!("received property request command from client 'null'");
- // self.connections.get_mut(&token).unwrap()
- // .write_all(&create_property_update_command()).unwrap();
- // debug!("sent property update command to client 'null'");
- // }
- // 6 => { // SESSINIT
- // let local_username =
- // parse_session_initialization_command(cmd).username;
- // self.clients.insert(token, local_username.clone());
- // debug!(
- // "received session initialization command from client '{}'",
- // local_username,
- // );
- // self.connections.get_mut(&token).unwrap()
- // .write_all(&create_property_request_command()).unwrap();
- // debug!("sent session initialization command to client '{}'", local_username);
- // }
- // 15 => { // PROPSET
- // let avatar = parse_property_set_command(cmd);
- // debug!(
- // "received property set command from client '{}': {}",
- // self.clients.get(&token).unwrap(),
- // avatar,
- // );
- // self.connections.get_mut(&token).unwrap()
- // .write_all(&create_text_command_with_action(
- // "WORLDSMASTER", &get_config().unwrap().worldsmaster_greeting,
- // )).unwrap();
- // debug!(
- // "sent session initialization command to client '{}'",
- // self.clients.get(&token).unwrap(),
- // );
- // }
- // 29 => { // BUDDYLISTUPDATE
- // let received_buddy = from_utf8(
- // cmd.get(4..cmd.get(0).unwrap().to_owned() as usize - 1).unwrap()
- // ).unwrap();
- // debug!(
- // "received buddy list update command from client '{}': {}",
- // self.clients.get(&token).unwrap(),
- // received_buddy,
- // );
- // self.connections.get_mut(&token).unwrap()
- // .write_all(&create_buddy_list_notify_command(received_buddy)).unwrap();
- // debug!(
- // "sent buddy list notify command to client '{}'",
- // self.clients.get(&token).unwrap(),
- // );
- // }
- // 20 => { // ROOMIDRQ
- // let room_name = from_utf8(
- // cmd.get(4..cmd.get(0).unwrap().to_owned() as usize).unwrap()
- // ).unwrap();
- // debug!(
- // "received room id request command from client '{}': {}",
- // self.clients.get(&token).unwrap(),
- // room_name,
- // );
- // let room_id;
- // if !self.room_ids.contains(&room_name.to_string()) {
- // self.room_ids.push(room_name.to_string());
- // room_id = self.room_ids.iter()
- // .position(|i| i == &room_name.to_string())
- // .unwrap();
- // trace!("inserted room '{}' as '{}'", room_name, room_id);
- // } else {
- // let position = self.room_ids.iter()
- // .position(|i| i == &room_name.to_string())
- // .unwrap();
- // trace!("found room '{}' as '{}'", room_name, position);
- // room_id = position;
- // }
- // trace!("room name: {}, room id: {}", room_name, room_id);
- // trace!("{:?}", self.room_ids);
- // self.connections.get_mut(&token).unwrap()
- // .write_all(&create_room_id_redirect_command(
- // room_name, room_id,
- // )).unwrap();
- // }
- // 14 => { // TEXT
- // let text = from_utf8(
- // cmd.get(6..cmd.get(0).unwrap().to_owned() as usize).unwrap()
- // ).unwrap();
- // let username = self.clients.get(&token).unwrap().clone();
- // debug!(
- // "received text command from client '{}': {}",
- // username, text,
- // );
- // self.connections.iter_mut().for_each(|t|
- // t.1.write_all(&create_text_command(
- // &username,
- // text,
- // )).unwrap()
- // );
- // debug!("broadcasted text command to clients");
- // }
- // 7 => { // SESSEXIT
- // debug!(
- // "received session exit command from client '{}'",
- // self.clients.get(&token).unwrap(),
- // );
- // }
- // _ => (),
- // }
- // }
- // }
-}
diff --git a/src/server_dev/room/_server.rs b/src/server_dev/room/_server.rs
deleted file mode 100644
index e08c3d7..0000000
--- a/src/server_dev/room/_server.rs
+++ /dev/null
@@ -1,168 +0,0 @@
-use std::error::Error;
-use tokio::net::{TcpListener, TcpStream};
-use tokio::io::AsyncWriteExt;
-use crate::server::room::cmd::property::{
- create_property_update_command,
- create_property_request_command
-};
-use tokio_util::codec::{BytesCodec, Decoder};
-use tokio_stream::StreamExt;
-use crate::server::cmd::text::{create_text_command_with_action, create_text_command};
-use std::str::from_utf8;
-use crate::server::cmd::buddy_list::create_buddy_list_notify_command;
-use crate::server::auto::cmd::room::create_room_id_redirect_command;
-use std::sync::Arc;
-use tokio::sync::Mutex;
-use crate::server::shared::Shared;
-use crate::server::peer::Peer;
-use std::net::SocketAddr;
-use crate::server::room::cmd::session::parse_session_initialization_command;
-use crate::server::parser::get_commands_from_buffer;
-use crate::server::cmd::property::parse_property_set_command;
-
-
-pub struct RoomServer;
-impl RoomServer {
- pub async fn listen(addr: &str) -> Result<(), Box<dyn Error>> {
- let listener = TcpListener::bind(addr).await?;
- debug!("RoomServer now listening on {}", listener.local_addr().unwrap());
- let state = Arc::new(Mutex::new(Shared::new()));
- let mut counter = 0;
-
- loop {
- let (stream, address) = listener.accept().await?;
- counter += 1;
- let state = Arc::clone(&state);
-
- tokio::spawn(async move {
- if let Err(e) = RoomServer::handle(
- state,
- stream,
- address,
- counter
- ).await {
- error!("an error occurred: {}", e);
- }
- });
- }
- }
-
- pub async fn handle(
- state: Arc<Mutex<Shared>>,
- stream: TcpStream,
- address: SocketAddr,
- count: usize,
- ) -> Result<(), Box<dyn Error>> {
- let bytes = BytesCodec::new().framed(stream);
- let mut peer = Peer::new(state.clone(), bytes, count.to_string()).await?;
- debug!("registered peer with address '{}' as '{}'", address, count);
- let mut room_ids: Vec<String> = Vec::new();
- let mut username: String = String::new();
-
- loop {
- tokio::select! {
- Some(msg) = peer.rx.recv() => {
- // debug!("received bytes from peer: {:?}", &msg);
- peer.bytes.get_mut().write_all(&msg).await?;
- }
- result = peer.bytes.next() => match result {
- Some(Ok(msg)) => {
- // let msg: BytesMut = msg;
- for msg in get_commands_from_buffer(msg) {
- match msg.get(2).unwrap() {
- 10 => { // PROPREQ
- debug!("received property request command from client");
- peer.bytes.get_mut()
- .write_all(&create_property_update_command()).await?;
- debug!("sent property update command to client");
- }
- 6 => { // SESSINIT
- username = parse_session_initialization_command(msg.clone()).username;
- debug!(
- "received session initialization command from client: {}",
- username
- );
- peer.bytes.get_mut()
- .write_all(&create_property_request_command()).await?;
- debug!("sent session initialization command to client");
- }
- 15 => { // PROPSET
- let avatar = parse_property_set_command(msg.clone());
- debug!("received property set command from client: {}", avatar);
- peer.bytes.get_mut()
- .write_all(&create_text_command_with_action(
- "WORLDSMASTER", &std::env::var("WORLDSMASTER_GREETING")?
- )).await?;
- debug!("sent worldsmaster greeting to client");
- }
- 29 => { // BUDDYLISTUPDATE
- let received_buddy = from_utf8(
- msg.get(4..msg.get(0).unwrap().to_owned() as usize - 1).unwrap()
- ).unwrap();
- debug!(
- "received buddy list update command from client: {}",
- received_buddy
- );
- peer.bytes.get_mut()
- .write_all(&create_buddy_list_notify_command(received_buddy))
- .await?;
- debug!("sent buddy list notify command to client: {}", received_buddy);
- }
- 20 => { // ROOMIDRQ
- let room_name = from_utf8(
- msg.get(4..msg.get(0).unwrap().to_owned() as usize).unwrap()
- ).unwrap();
- debug!("received room id request command from client: {}", room_name);
- let room_id;
- if !room_ids.contains(&room_name.to_string()) {
- room_ids.push(room_name.to_string());
- room_id = room_ids.iter()
- .position(|i| i == &room_name.to_string())
- .unwrap();
- trace!("inserted room '{}' as '{}'", room_name, room_id);
- } else {
- let position = room_ids.iter()
- .position(|i| i == &room_name.to_string())
- .unwrap();
- trace!("found room '{}' as '{}'", room_name, position);
- room_id = position;
- }
- trace!("room name: {}, room id: {}", room_name, room_id);
- trace!("{:?}", room_ids);
- peer.bytes.get_mut()
- .write_all(&create_room_id_redirect_command(room_name, room_id))
- .await?;
- debug!("sent redirect id command to client: {} == {}", room_name, room_id);
- }
- 14 => {
- let text = from_utf8(
- msg.get(6..msg.get(0).unwrap().to_owned() as usize).unwrap()
- ).unwrap();
- debug!("received text command from client: {}", text);
- let mut state = state.lock().await;
- state.broadcast(&create_text_command(&username, text)).await;
- debug!("broadcasted text command from client");
- }
- 7 => { // SESSEXIT
- debug!("received session exit command from client")
- }
- _ => (),
- }
- }
- }
- Some(Err(e)) => {
- error!("error while processing messages: {}", e); break;
- }
- None => break,
- }
- }
- }
-
- { // De-register client
- state.lock().await.peers.remove(&count.to_string());
- debug!("removed peer: {}", count)
- }
-
- Ok(())
- }
-}
diff --git a/src/server_dev/room/cmd/mod.rs b/src/server_dev/room/cmd/mod.rs
deleted file mode 100644
index 1d123c0..0000000
--- a/src/server_dev/room/cmd/mod.rs
+++ /dev/null
@@ -1,2 +0,0 @@
-pub mod property;
-pub mod session;
diff --git a/src/server_dev/room/cmd/property.rs b/src/server_dev/room/cmd/property.rs
deleted file mode 100644
index 3135d0a..0000000
--- a/src/server_dev/room/cmd/property.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-pub fn create_property_update_command() -> [u8; 161] {
- // Vec<u8>
- // 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_dev/room/cmd/session.rs b/src/server_dev/room/cmd/session.rs
deleted file mode 100644
index dee3931..0000000
--- a/src/server_dev/room/cmd/session.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-use std::str::from_utf8;
-
-use bytes::BytesMut;
-
-use crate::server::cmd::session::SessionInitializationCommand;
-
-pub fn parse_session_initialization_command(command: BytesMut) -> SessionInitializationCommand {
- SessionInitializationCommand {
- // protocol: command.get(4..4 + command.get(4)).unwrap().to_owned() as usize,
- // client: "".to_string(),
- username: from_utf8(
- command
- .get(25..(24 + command.get(24).unwrap().to_owned() as usize + 1))
- .unwrap(),
- )
- .unwrap()
- .to_string(),
- // password: "".to_string()
- }
-}
diff --git a/src/server_dev/room/mod.rs b/src/server_dev/room/mod.rs
deleted file mode 100644
index 24606ea..0000000
--- a/src/server_dev/room/mod.rs
+++ /dev/null
@@ -1,2 +0,0 @@
-pub mod cmd;
-pub mod server;
diff --git a/src/server_dev/room/server.rs b/src/server_dev/room/server.rs
deleted file mode 100644
index 63a13f6..0000000
--- a/src/server_dev/room/server.rs
+++ /dev/null
@@ -1,434 +0,0 @@
-use std::{
- collections::{HashMap, HashSet},
- error::Error,
- io::{ErrorKind, Read, Write},
- str::from_utf8,
-};
-
-use bytes::BytesMut;
-use mio::{
- event::Event,
- net::{TcpListener, TcpStream},
- Events,
- Interest,
- Poll,
- Registry,
- Token,
-};
-
-use crate::{
- config::get_config,
- server::{
- auto::cmd::{
- property::{create_property_request_command, create_property_update_command},
- room::create_room_id_redirect_command,
- },
- cmd::{
- buddy_list::create_buddy_list_notify_command,
- property::parse_property_set_command,
- text::{create_text_command, create_text_command_with_action},
- },
- parser::get_commands_from_buffer,
- room::cmd::session::parse_session_initialization_command,
- },
-};
-
-const SERVER: Token = Token(0);
-
-pub struct RoomServer {
- pub clients: HashMap<Token, String>,
- pub connections: HashMap<Token, TcpStream>,
- pub room_ids: Vec<String>,
-}
-impl RoomServer {
- pub fn listen(&mut self, addr: &str) -> Result<(), Box<dyn Error>> {
- let mut listener = TcpListener::bind(addr.parse().unwrap())?;
- let mut poll = Poll::new()?;
- let mut events = Events::with_capacity(1024);
- let mut counter: usize = 0;
- // let mut sockets = HashMap::new();
- let mut requests = HashMap::new();
- let mut buffer = [0 as u8; 1024];
- // let mut room_ids = vec![];
-
- poll
- .registry()
- .register(&mut listener, Token(0), Interest::READABLE)?;
-
- debug!(
- "RoomServer now listening on {}",
- listener.local_addr().unwrap()
- );
-
- loop {
- poll.poll(&mut events, None)?;
-
- for event in &events {
- match event.token() {
- Token(0) => {
- loop {
- match listener.accept() {
- Ok((mut stream, address)) => {
- counter += 1;
- let token = Token(counter);
-
- poll
- .registry()
- .register(&mut stream, token, Interest::READABLE)?;
-
- debug!(
- "registered peer with address '{}' as '{}'",
- address, token.0
- );
-
- // sockets.insert(token, stream);
- self.connections.insert(token, stream);
- requests.insert(token, Vec::with_capacity(192));
- }
- Err(ref err) if err.kind() == ErrorKind::WouldBlock => break,
- Err(err) => {
- error!("unexpected error: {}", err);
- poll
- .registry()
- .deregister(self.connections.get_mut(&Token(counter)).unwrap())?;
- break;
- }
- }
- }
- }
- token if event.is_readable() => {
- loop {
- let read = self.connections.get_mut(&token).unwrap().read(&mut buffer);
- match read {
- Ok(0) => {
- self.connections.remove(&token);
- break;
- }
- Ok(n) => {
- let req = requests.get_mut(&token).unwrap();
- for b in &buffer[0..n] {
- req.push(*b);
- }
-
- for cmd in get_commands_from_buffer(BytesMut::from(&buffer[..n])) {
- match cmd.get(2).unwrap() {
- 10 => {
- // PROPREQ
- debug!("received property request command from client 'null'");
- self
- .connections
- .get_mut(&token)
- .unwrap()
- .write_all(&create_property_update_command())
- .unwrap();
- debug!("sent property update command to client 'null'");
- }
- 6 => {
- // SESSINIT
- let local_username = parse_session_initialization_command(cmd).username;
- self.clients.insert(token, local_username.clone());
- debug!(
- "received session initialization command from client '{}'",
- local_username,
- );
- self
- .connections
- .get_mut(&token)
- .unwrap()
- .write_all(&create_property_request_command())
- .unwrap();
- debug!(
- "sent session initialization command to client '{}'",
- local_username
- );
- }
- 15 => {
- // PROPSET
- let avatar = parse_property_set_command(cmd);
- debug!(
- "received property set command from client '{}': {}",
- self.clients.get(&token).unwrap(),
- avatar,
- );
- self
- .connections
- .get_mut(&token)
- .unwrap()
- .write_all(&create_text_command_with_action(
- "WORLDSMASTER",
- &get_config().unwrap().worldsmaster_greeting,
- ))
- .unwrap();
- debug!(
- "sent session initialization command to client '{}'",
- self.clients.get(&token).unwrap(),
- );
- }
- 29 => {
- // BUDDYLISTUPDATE
- let received_buddy = from_utf8(
- cmd
- .get(4..cmd.get(0).unwrap().to_owned() as usize - 1)
- .unwrap(),
- )
- .unwrap();
- debug!(
- "received buddy list update command from client '{}': {}",
- self.clients.get(&token).unwrap(),
- received_buddy,
- );
- self
- .connections
- .get_mut(&token)
- .unwrap()
- .write_all(&create_buddy_list_notify_command(received_buddy))
- .unwrap();
- debug!(
- "sent buddy list notify command to client '{}'",
- self.clients.get(&token).unwrap(),
- );
- }
- // 20 => { // ROOMIDRQ
- // let room_name = from_utf8(
- // cmd.get(4..cmd.get(0).unwrap().to_owned() as usize).unwrap()
- // ).unwrap();
- // debug!(
- // "received room id request command from client '{}': {}",
- // self.clients.get(&token).unwrap(),
- // room_name,
- // );
- // let room_id;
- // if !self.room_ids.contains(&room_name.to_string()) {
- // self.room_ids.push(room_name.to_string());
- // room_id = self.room_ids.iter()
- // .position(|i| i == &room_name.to_string())
- // .unwrap();
- // trace!("inserted room '{}' as '{}'", room_name, room_id);
- // } else {
- // let position = self.room_ids.iter()
- // .position(|i| i == &room_name.to_string())
- // .unwrap();
- // trace!("found room '{}' as '{}'", room_name, position);
- // room_id = position;
- // }
- // trace!("room name: {}, room id: {}", room_name, room_id);
- // trace!("{:?}", self.room_ids);
- // self.connections.get_mut(&token).unwrap()
- // .write_all(&create_room_id_redirect_command(
- // room_name, room_id,
- // )).unwrap();
- // }
- 14 => {
- // TEXT
- let text =
- from_utf8(cmd.get(6..cmd.get(0).unwrap().to_owned() as usize).unwrap())
- .unwrap();
- let username = self.clients.get(&token).unwrap().clone();
- debug!(
- "received text command from client '{}': {}",
- username,
- format!("room: {}", text),
- );
- self.connections.iter_mut().for_each(|t| {
- t.1
- .write_all(&create_text_command(&username, text))
- .unwrap()
- });
- debug!("broadcasted text command to clients");
- }
- 7 => {
- // SESSEXIT
- debug!(
- "received session exit command from client '{}'",
- self.clients.get(&token).unwrap(),
- );
- }
- _ => (),
- }
- }
- }
- Err(ref err) if err.kind() == ErrorKind::WouldBlock => break,
- Err(err) => {
- error!("unexpected error: {}", err);
- break;
- }
- }
- }
- }
- _ => (),
- }
- }
- }
- }
-
- fn broadcast(sockets: &HashMap<Token, TcpStream>, cmd: &[u8]) -> () {
- for mut socket in sockets {
- socket.1.write_all(cmd).unwrap();
- }
- }
-
- // fn process(
- // &mut self,
- // _registry: &Registry,
- // event: &Event,
- // token: Token,
- // ) -> Result<bool, Box<dyn Error>> {
- // if event.is_readable() {
- // let mut connection_closed = false;
- // let mut received_data = vec![0; 4096];
- // let mut bytes_read = 0;
- //
- // let stream = self.connections.get_mut(&token).unwrap();
- //
- // loop {
- // match stream.read(&mut received_data[bytes_read..]) {
- // Ok(0) => {
- // connection_closed = true;
- // break;
- // }
- // Ok(n) => {
- // bytes_read += n;
- // if bytes_read == received_data.len() {
- // received_data.resize(received_data.len() + 1024, 0);
- // }
- // }
- // Err(ref err) if err.kind() == ErrorKind::WouldBlock => break,
- // Err(ref err) if err.kind() == ErrorKind::Interrupted => continue,
- // Err(err) => return Err(Box::new(err)),
- // }
- // }
- //
- // if bytes_read != 0 {
- // self.handle(
- // &mut received_data[..bytes_read],
- // token,
- // );
- // }
- // if connection_closed {
- // println!("de-registered peer with token '{}'", token.0);
- // return Ok(true);
- // }
- // }
- //
- // Ok(false)
- // }
-
- // fn handle(
- // &mut self,
- // data: &[u8],
- // // stream: &mut TcpStream,
- // token: Token,
- // ) -> () {
- // // trace!("i am client: {:?}", self.clients.get(&token));
- // // debug!("{:?}", self.connections);
- // for cmd in get_commands_from_buffer(BytesMut::from(data)) {
- // debug!("received: {:?}", cmd);
- // match cmd.get(2).unwrap() {
- // 10 => { // PROPREQ
- // debug!("received property request command from client 'null'");
- // self.connections.get_mut(&token).unwrap()
- // .write_all(&create_property_update_command()).unwrap();
- // debug!("sent property update command to client 'null'");
- // }
- // 6 => { // SESSINIT
- // let local_username =
- // parse_session_initialization_command(cmd).username;
- // self.clients.insert(token, local_username.clone());
- // debug!(
- // "received session initialization command from client '{}'",
- // local_username,
- // );
- // self.connections.get_mut(&token).unwrap()
- // .write_all(&create_property_request_command()).unwrap();
- // debug!("sent session initialization command to client '{}'", local_username);
- // }
- // 15 => { // PROPSET
- // let avatar = parse_property_set_command(cmd);
- // debug!(
- // "received property set command from client '{}': {}",
- // self.clients.get(&token).unwrap(),
- // avatar,
- // );
- // self.connections.get_mut(&token).unwrap()
- // .write_all(&create_text_command_with_action(
- // "WORLDSMASTER", &get_config().unwrap().worldsmaster_greeting,
- // )).unwrap();
- // debug!(
- // "sent session initialization command to client '{}'",
- // self.clients.get(&token).unwrap(),
- // );
- // }
- // 29 => { // BUDDYLISTUPDATE
- // let received_buddy = from_utf8(
- // cmd.get(4..cmd.get(0).unwrap().to_owned() as usize - 1).unwrap()
- // ).unwrap();
- // debug!(
- // "received buddy list update command from client '{}': {}",
- // self.clients.get(&token).unwrap(),
- // received_buddy,
- // );
- // self.connections.get_mut(&token).unwrap()
- // .write_all(&create_buddy_list_notify_command(received_buddy)).unwrap();
- // debug!(
- // "sent buddy list notify command to client '{}'",
- // self.clients.get(&token).unwrap(),
- // );
- // }
- // 20 => { // ROOMIDRQ
- // let room_name = from_utf8(
- // cmd.get(4..cmd.get(0).unwrap().to_owned() as usize).unwrap()
- // ).unwrap();
- // debug!(
- // "received room id request command from client '{}': {}",
- // self.clients.get(&token).unwrap(),
- // room_name,
- // );
- // let room_id;
- // if !self.room_ids.contains(&room_name.to_string()) {
- // self.room_ids.push(room_name.to_string());
- // room_id = self.room_ids.iter()
- // .position(|i| i == &room_name.to_string())
- // .unwrap();
- // trace!("inserted room '{}' as '{}'", room_name, room_id);
- // } else {
- // let position = self.room_ids.iter()
- // .position(|i| i == &room_name.to_string())
- // .unwrap();
- // trace!("found room '{}' as '{}'", room_name, position);
- // room_id = position;
- // }
- // trace!("room name: {}, room id: {}", room_name, room_id);
- // trace!("{:?}", self.room_ids);
- // self.connections.get_mut(&token).unwrap()
- // .write_all(&create_room_id_redirect_command(
- // room_name, room_id,
- // )).unwrap();
- // }
- // 14 => { // TEXT
- // let text = from_utf8(
- // cmd.get(6..cmd.get(0).unwrap().to_owned() as usize).unwrap()
- // ).unwrap();
- // let username = self.clients.get(&token).unwrap().clone();
- // debug!(
- // "received text command from client '{}': {}",
- // username, text,
- // );
- // self.connections.iter_mut().for_each(|t|
- // t.1.write_all(&create_text_command(
- // &username,
- // text,
- // )).unwrap()
- // );
- // debug!("broadcasted text command to clients");
- // }
- // 7 => { // SESSEXIT
- // debug!(
- // "received session exit command from client '{}'",
- // self.clients.get(&token).unwrap(),
- // );
- // }
- // _ => (),
- // }
- // }
- // }
-}
diff --git a/src/server_dev/structures.rs b/src/server_dev/structures.rs
deleted file mode 100644
index 25fcf00..0000000
--- a/src/server_dev/structures.rs
+++ /dev/null
@@ -1,15 +0,0 @@
-// Unused struct, purely for reference.
-// struct RoomSubscribeInfo {
-// pub x: f64,
-// pub y: f64,
-// pub z: f64,
-// pub d: f64,
-// }
-
-pub struct Room {
- distance: i16,
- x: i16,
- y: i16,
- z: i16,
- room_number: i16,
-}