gameServer2/src/server/client.rs
author Wuzzy <Wuzzy2@mail.ru>
Thu, 26 Oct 2017 22:49:39 +0200
changeset 12779 1f8a62d1609d
parent 12147 03ccb89820f3
child 12852 bd35cb2302b3
permissions -rw-r--r--
ACF5: Fix final animation being stuck when the cyborg's way to the right is blocked Fixed with the new maxMoveTime parameter in AnimMove. If cyborg didn't reach its destination in 7000ms, the move anim is skipped and the sequence just continues.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12128
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
     1
use mio::tcp::*;
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
     2
use mio::*;
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
     3
use std::io::Write;
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
     4
use std::io;
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
     5
use netbuf;
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
     6
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
     7
use utils;
12136
e25a82ce2374 - Render messages to string
unc0rr
parents: 12129
diff changeset
     8
use protocol::ProtocolDecoder;
12142
4d7d41be1993 Start refactoring path from getting message from client to reacting to it
unc0rr
parents: 12141
diff changeset
     9
use protocol::messages::*;
12144
589a2d7d3dc5 More refactoring
unc0rr
parents: 12143
diff changeset
    10
use super::actions::Action::*;
589a2d7d3dc5 More refactoring
unc0rr
parents: 12143
diff changeset
    11
use super::actions::Action;
12128
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    12
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    13
pub struct HWClient {
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    14
    sock: TcpStream,
12136
e25a82ce2374 - Render messages to string
unc0rr
parents: 12129
diff changeset
    15
    decoder: ProtocolDecoder,
12141
78925eff02c2 Basic support for NICK message
unc0rr
parents: 12139
diff changeset
    16
    buf_out: netbuf::Buf,
12144
589a2d7d3dc5 More refactoring
unc0rr
parents: 12143
diff changeset
    17
12146
8d8fb85bc09c SendAllButMe action, list all clients in lobby in LobbyJoined message to newcomers
unc0rr
parents: 12144
diff changeset
    18
    pub id: Token,
8d8fb85bc09c SendAllButMe action, list all clients in lobby in LobbyJoined message to newcomers
unc0rr
parents: 12144
diff changeset
    19
    pub room_id: Option<Token>,
12141
78925eff02c2 Basic support for NICK message
unc0rr
parents: 12139
diff changeset
    20
    pub nick: String,
12146
8d8fb85bc09c SendAllButMe action, list all clients in lobby in LobbyJoined message to newcomers
unc0rr
parents: 12144
diff changeset
    21
    pub protocol_number: u32,
12147
03ccb89820f3 Room creation halfplemented
unc0rr
parents: 12146
diff changeset
    22
    pub is_master: bool,
03ccb89820f3 Room creation halfplemented
unc0rr
parents: 12146
diff changeset
    23
    pub is_ready: bool,
03ccb89820f3 Room creation halfplemented
unc0rr
parents: 12146
diff changeset
    24
    pub is_joined_mid_game: bool,
12128
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    25
}
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    26
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    27
impl HWClient {
12146
8d8fb85bc09c SendAllButMe action, list all clients in lobby in LobbyJoined message to newcomers
unc0rr
parents: 12144
diff changeset
    28
    pub fn new(sock: TcpStream) -> HWClient {
12128
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    29
        HWClient {
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    30
            sock: sock,
12136
e25a82ce2374 - Render messages to string
unc0rr
parents: 12129
diff changeset
    31
            decoder: ProtocolDecoder::new(),
12128
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    32
            buf_out: netbuf::Buf::new(),
12146
8d8fb85bc09c SendAllButMe action, list all clients in lobby in LobbyJoined message to newcomers
unc0rr
parents: 12144
diff changeset
    33
            room_id: None,
8d8fb85bc09c SendAllButMe action, list all clients in lobby in LobbyJoined message to newcomers
unc0rr
parents: 12144
diff changeset
    34
            id: Token(0),
12144
589a2d7d3dc5 More refactoring
unc0rr
parents: 12143
diff changeset
    35
12141
78925eff02c2 Basic support for NICK message
unc0rr
parents: 12139
diff changeset
    36
            nick: String::new(),
12146
8d8fb85bc09c SendAllButMe action, list all clients in lobby in LobbyJoined message to newcomers
unc0rr
parents: 12144
diff changeset
    37
            protocol_number: 0,
12147
03ccb89820f3 Room creation halfplemented
unc0rr
parents: 12146
diff changeset
    38
            is_master: false,
03ccb89820f3 Room creation halfplemented
unc0rr
parents: 12146
diff changeset
    39
            is_ready: false,
03ccb89820f3 Room creation halfplemented
unc0rr
parents: 12146
diff changeset
    40
            is_joined_mid_game: false,
12128
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    41
        }
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    42
    }
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    43
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    44
    pub fn register(&mut self, poll: &Poll, token: Token) {
12137
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12136
diff changeset
    45
        poll.register(&self.sock, token, Ready::all(),
12128
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    46
                      PollOpt::edge())
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    47
            .ok().expect("could not register socket with event loop");
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    48
12142
4d7d41be1993 Start refactoring path from getting message from client to reacting to it
unc0rr
parents: 12141
diff changeset
    49
        self.send_msg(HWServerMessage::Connected(utils::PROTOCOL_VERSION));
12128
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    50
    }
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    51
12139
f3121d7dedec - Handle errors
unc0rr
parents: 12138
diff changeset
    52
    pub fn deregister(&mut self, poll: &Poll) {
12147
03ccb89820f3 Room creation halfplemented
unc0rr
parents: 12146
diff changeset
    53
        poll.deregister(&self.sock)
03ccb89820f3 Room creation halfplemented
unc0rr
parents: 12146
diff changeset
    54
            .ok().expect("could not deregister socket");
12139
f3121d7dedec - Handle errors
unc0rr
parents: 12138
diff changeset
    55
    }
f3121d7dedec - Handle errors
unc0rr
parents: 12138
diff changeset
    56
12138
e0bf51609062 Introduce actions, just like in the old server
unc0rr
parents: 12137
diff changeset
    57
    pub fn send_raw_msg(&mut self, msg: &[u8]) {
12128
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    58
        self.buf_out.write(msg).unwrap();
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    59
        self.flush();
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    60
    }
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    61
12138
e0bf51609062 Introduce actions, just like in the old server
unc0rr
parents: 12137
diff changeset
    62
    pub fn send_string(&mut self, msg: &String) {
e0bf51609062 Introduce actions, just like in the old server
unc0rr
parents: 12137
diff changeset
    63
        self.send_raw_msg(&msg.as_bytes());
e0bf51609062 Introduce actions, just like in the old server
unc0rr
parents: 12137
diff changeset
    64
    }
e0bf51609062 Introduce actions, just like in the old server
unc0rr
parents: 12137
diff changeset
    65
12142
4d7d41be1993 Start refactoring path from getting message from client to reacting to it
unc0rr
parents: 12141
diff changeset
    66
    pub fn send_msg(&mut self, msg: HWServerMessage) {
12138
e0bf51609062 Introduce actions, just like in the old server
unc0rr
parents: 12137
diff changeset
    67
        self.send_string(&msg.to_raw_protocol());
12136
e25a82ce2374 - Render messages to string
unc0rr
parents: 12129
diff changeset
    68
    }
e25a82ce2374 - Render messages to string
unc0rr
parents: 12129
diff changeset
    69
12128
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    70
    fn flush(&mut self) {
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    71
        self.buf_out.write_to(&mut self.sock).unwrap();
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    72
        self.sock.flush();
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    73
    }
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    74
12138
e0bf51609062 Introduce actions, just like in the old server
unc0rr
parents: 12137
diff changeset
    75
    pub fn readable(&mut self, poll: &Poll) -> Vec<Action> {
e0bf51609062 Introduce actions, just like in the old server
unc0rr
parents: 12137
diff changeset
    76
        let v = self.decoder.read_from(&mut self.sock).unwrap();
12137
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12136
diff changeset
    77
        debug!("Read {} bytes", v);
12136
e25a82ce2374 - Render messages to string
unc0rr
parents: 12129
diff changeset
    78
        let mut response = Vec::new();
e25a82ce2374 - Render messages to string
unc0rr
parents: 12129
diff changeset
    79
        {
12142
4d7d41be1993 Start refactoring path from getting message from client to reacting to it
unc0rr
parents: 12141
diff changeset
    80
            for msg in self.decoder.extract_messages() {
4d7d41be1993 Start refactoring path from getting message from client to reacting to it
unc0rr
parents: 12141
diff changeset
    81
                response.push(ReactProtocolMessage(msg));
12136
e25a82ce2374 - Render messages to string
unc0rr
parents: 12129
diff changeset
    82
            }
e25a82ce2374 - Render messages to string
unc0rr
parents: 12129
diff changeset
    83
        }
e25a82ce2374 - Render messages to string
unc0rr
parents: 12129
diff changeset
    84
        self.decoder.sweep();
12138
e0bf51609062 Introduce actions, just like in the old server
unc0rr
parents: 12137
diff changeset
    85
        response
12128
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    86
    }
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    87
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    88
    pub fn writable(&mut self, poll: &Poll) -> io::Result<()> {
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    89
        self.buf_out.write_to(&mut self.sock)?;
12139
f3121d7dedec - Handle errors
unc0rr
parents: 12138
diff changeset
    90
12128
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    91
        Ok(())
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    92
    }
12137
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12136
diff changeset
    93
12139
f3121d7dedec - Handle errors
unc0rr
parents: 12138
diff changeset
    94
    pub fn error(&mut self, poll: &Poll) -> Vec<Action> {
f3121d7dedec - Handle errors
unc0rr
parents: 12138
diff changeset
    95
        return vec![ByeClient("Connection reset".to_string())]
12137
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12136
diff changeset
    96
    }
12128
f50876f3eff8 Refactor modules layout
unc0rr
parents:
diff changeset
    97
}