Browse Source

Add RoomListResponse, refactor control, room.

wip
Titouan Rigoudy 9 years ago
parent
commit
9facd88362
6 changed files with 94 additions and 53 deletions
  1. +59
    -45
      src/client.rs
  2. +4
    -2
      src/control/mod.rs
  3. +2
    -4
      src/control/request.rs
  4. +15
    -2
      src/control/response.rs
  5. +1
    -0
      src/main.rs
  6. +13
    -0
      src/room.rs

+ 59
- 45
src/client.rs View File

@ -4,46 +4,34 @@ use std::sync::mpsc;
use mio; use mio;
use config; use config;
use control::request::ControlRequest;
use control::response::ControlResponse;
use control;
use proto::{Response, Request}; use proto::{Response, Request};
use proto::server::*; use proto::server::*;
enum RoomKind {
Public,
PrivateOwned,
PrivateOther,
}
struct Room {
kind: RoomKind,
user_count: usize,
operated: bool,
}
use room;
#[derive(Debug)] #[derive(Debug)]
enum IncomingMessage { enum IncomingMessage {
ServerResponse(ServerResponse), ServerResponse(ServerResponse),
ControlRequest(ControlRequest),
ControlRequest(control::ControlRequest),
} }
#[derive(Debug, Clone, Copy)]
enum State {
NotLoggedIn,
LoggingIn,
LoggedIn,
#[derive(Debug, Clone)]
enum LoginStatus {
Pending,
Success(String),
Failure(String),
} }
pub struct Client { pub struct Client {
state: State,
proto_tx: mio::Sender<Request>, proto_tx: mio::Sender<Request>,
proto_rx: mpsc::Receiver<Response>, proto_rx: mpsc::Receiver<Response>,
control_tx: mpsc::Sender<ControlResponse>,
control_rx: mpsc::Receiver<ControlRequest>,
control_tx: mpsc::Sender<control::ControlResponse>,
control_rx: mpsc::Receiver<control::ControlRequest>,
rooms: collections::HashMap<String, Room>,
login_status: LoginStatus,
rooms: collections::HashMap<String, room::Room>,
privileged_users: collections::HashSet<String>, privileged_users: collections::HashSet<String>,
} }
@ -51,16 +39,18 @@ impl Client {
pub fn new( pub fn new(
proto_tx: mio::Sender<Request>, proto_tx: mio::Sender<Request>,
proto_rx: mpsc::Receiver<Response>, proto_rx: mpsc::Receiver<Response>,
control_tx: mpsc::Sender<ControlResponse>,
control_rx: mpsc::Receiver<ControlRequest>)
control_tx: mpsc::Sender<control::ControlResponse>,
control_rx: mpsc::Receiver<control::ControlRequest>)
-> Self -> Self
{ {
Client { Client {
state: State::NotLoggedIn,
proto_tx: proto_tx, proto_tx: proto_tx,
proto_rx: proto_rx, proto_rx: proto_rx,
control_tx: control_tx, control_tx: control_tx,
control_rx: control_rx, control_rx: control_rx,
login_status: LoginStatus::Pending,
rooms: collections::HashMap::new(), rooms: collections::HashMap::new(),
privileged_users: collections::HashSet::new(), privileged_users: collections::HashSet::new(),
} }
@ -68,7 +58,6 @@ impl Client {
pub fn run(&mut self) { pub fn run(&mut self) {
info!("Logging in..."); info!("Logging in...");
self.state = State::LoggingIn;
let server_request = ServerRequest::LoginRequest(LoginRequest::new( let server_request = ServerRequest::LoginRequest(LoginRequest::new(
config::USERNAME, config::USERNAME,
config::PASSWORD, config::PASSWORD,
@ -103,14 +92,40 @@ impl Client {
} }
} }
fn handle_control_request(&mut self, request: ControlRequest) {
fn handle_control_request(&mut self, request: control::ControlRequest) {
match request { match request {
_ => {
control::ControlRequest::LoginStatusRequest =>
self.handle_login_status_request(),
_ =>{
error!("Unhandled control request: {:?}", request); error!("Unhandled control request: {:?}", request);
}, },
} }
} }
fn handle_login_status_request(&mut self) {
let username = config::USERNAME.to_string();
let response = match self.login_status {
LoginStatus::Pending =>
control::LoginStatusResponse::Pending{ username: username },
LoginStatus::Success(ref motd) =>
control::LoginStatusResponse::Success{
username: username,
motd: motd.clone(),
},
LoginStatus::Failure(ref reason) =>
control::LoginStatusResponse::Failure{
username: username,
reason: reason.clone(),
},
};
debug!("Sending control response: {:?}", response);
self.control_tx.send(control::ControlResponse::LoginStatusResponse(response));
}
fn handle_server_response(&mut self, response: ServerResponse) { fn handle_server_response(&mut self, response: ServerResponse) {
match response { match response {
ServerResponse::LoginResponse(response) => ServerResponse::LoginResponse(response) =>
@ -131,11 +146,9 @@ impl Client {
} }
fn handle_login_response(&mut self, login: LoginResponse) { fn handle_login_response(&mut self, login: LoginResponse) {
if let State::LoggingIn = self.state {
if let LoginStatus::Pending = self.login_status {
match login { match login {
LoginResponse::LoginOk { motd, ip, password_md5_opt } => {
self.state = State::LoggedIn;
LoginResponse::LoginOk{ motd, ip, password_md5_opt } => {
info!("Login successful!"); info!("Login successful!");
info!("MOTD: \"{}\"", motd); info!("MOTD: \"{}\"", motd);
info!("External IP address: {}", ip); info!("External IP address: {}", ip);
@ -150,16 +163,17 @@ impl Client {
"Connected to official server ", "Connected to official server ",
"as unofficial client")), "as unofficial client")),
} }
self.login_status = LoginStatus::Success(motd);
}, },
LoginResponse::LoginFail { reason } => {
self.state = State::NotLoggedIn;
LoginResponse::LoginFail{ reason } => {
error!("Login failed: \"{}\"", reason); error!("Login failed: \"{}\"", reason);
self.login_status = LoginStatus::Failure(reason);
} }
} }
} else { } else {
error!("Received unexpected login response, state = {:?}",
self.state);
error!("Received unexpected login response, status = {:?}",
self.login_status);
} }
} }
@ -168,15 +182,15 @@ impl Client {
{ {
self.rooms.clear(); self.rooms.clear();
for (name, user_count) in response.rooms.drain(..) { for (name, user_count) in response.rooms.drain(..) {
self.rooms.insert(name, Room{
kind: RoomKind::Public,
self.rooms.insert(name, room::Room{
kind: room::RoomKind::Public,
operated: false, operated: false,
user_count: user_count as usize, user_count: user_count as usize,
}); });
} }
for (name, user_count) in response.owned_private_rooms.drain(..) { for (name, user_count) in response.owned_private_rooms.drain(..) {
let room = Room {
kind: RoomKind::PrivateOwned,
let room = room::Room {
kind: room::RoomKind::PrivateOwned,
operated: false, operated: false,
user_count: user_count as usize, user_count: user_count as usize,
}; };
@ -185,8 +199,8 @@ impl Client {
} }
} }
for (name, user_count) in response.other_private_rooms.drain(..) { for (name, user_count) in response.other_private_rooms.drain(..) {
let room = Room {
kind: RoomKind::PrivateOther,
let room = room::Room {
kind: room::RoomKind::PrivateOther,
operated: false, operated: false,
user_count: user_count as usize, user_count: user_count as usize,
}; };


+ 4
- 2
src/control/mod.rs View File

@ -1,5 +1,7 @@
mod controller; mod controller;
pub mod request;
pub mod response;
mod request;
mod response;
pub use self::controller::Controller; pub use self::controller::Controller;
pub use self::request::*;
pub use self::response::*;

+ 2
- 4
src/control/request.rs View File

@ -1,7 +1,5 @@
#[derive(Debug, RustcDecodable, RustcEncodable)] #[derive(Debug, RustcDecodable, RustcEncodable)]
pub enum ControlRequest { pub enum ControlRequest {
LoginStatusRequest(LoginStatusRequest),
LoginStatusRequest,
RoomListRequest,
} }
#[derive(Debug, RustcDecodable, RustcEncodable)]
pub struct LoginStatusRequest;

+ 15
- 2
src/control/response.rs View File

@ -1,16 +1,29 @@
use room;
#[derive(Debug, RustcDecodable, RustcEncodable)] #[derive(Debug, RustcDecodable, RustcEncodable)]
pub enum ControlResponse { pub enum ControlResponse {
LoginStatusResponse(LoginStatusResponse), LoginStatusResponse(LoginStatusResponse),
RoomListResponse(RoomListResponse),
} }
#[derive(Debug, RustcDecodable, RustcEncodable)] #[derive(Debug, RustcDecodable, RustcEncodable)]
pub enum LoginStatusResponse { pub enum LoginStatusResponse {
LoginOk {
Pending {
username: String,
},
Success {
username: String, username: String,
motd: String, motd: String,
}, },
LoginFail {
Failure {
username: String, username: String,
reason: String, reason: String,
} }
} }
#[derive(Debug, RustcDecodable, RustcEncodable)]
pub struct RoomListResponse {
rooms: Vec<room::Room>,
}

+ 1
- 0
src/main.rs View File

@ -5,6 +5,7 @@ mod config;
mod control; mod control;
mod handler; mod handler;
mod proto; mod proto;
mod room;
extern crate byteorder; extern crate byteorder;
extern crate core; extern crate core;


+ 13
- 0
src/room.rs View File

@ -0,0 +1,13 @@
#[derive(Clone, Copy, Debug, RustcDecodable, RustcEncodable)]
pub enum RoomKind {
Public,
PrivateOwned,
PrivateOther,
}
#[derive(Clone, Copy, Debug, RustcDecodable, RustcEncodable)]
pub struct Room {
pub kind: RoomKind,
pub operated: bool,
pub user_count: usize,
}

Loading…
Cancel
Save