gameServer2/src/main.rs
author Wuzzy <Wuzzy2@mail.ru>
Tue, 28 Aug 2018 05:46:33 +0200
changeset 13715 0da36902e5b6
parent 13671 09f4a30e50cc
child 13801 59ea2403f62d
permissions -rw-r--r--
Space Invasion: Continue playing rounds in case the teams are tied at the end Rules in case of a tie: 1) Eliminate all teams not tied for the lead 2) Play another round with the remaining teams 3) Check for the winner again at the end of that round. If there's another tie, repeat the procedure
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13124
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12858
diff changeset
     1
#![allow(unused_imports)]
13426
d1368c776a4f Enable all lints from the rust-2018-idioms suite.
marmistrz
parents: 13419
diff changeset
     2
#![deny(bare_trait_objects)]
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13534
diff changeset
     3
#![feature(rust_2018_preview)]
13124
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12858
diff changeset
     4
12130
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
     5
extern crate rand;
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
     6
extern crate mio;
12131
4348997e502b Refactor code to add more structure to it
unc0rr
parents: 12130
diff changeset
     7
extern crate slab;
12132
36ac9c075d0d - Use netbuf buffers for client connection stream
unc0rr
parents: 12131
diff changeset
     8
extern crate netbuf;
13428
87a6cad20c90 Implement game start & engine messages
alfadur
parents: 13426
diff changeset
     9
extern crate base64;
12138
81df2e1f9ae9 Some parsing using nom
unc0rr
parents: 12134
diff changeset
    10
#[macro_use]
81df2e1f9ae9 Some parsing using nom
unc0rr
parents: 12134
diff changeset
    11
extern crate nom;
12142
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12138
diff changeset
    12
#[macro_use]
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12138
diff changeset
    13
extern crate log;
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12138
diff changeset
    14
extern crate env_logger;
13124
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12858
diff changeset
    15
#[macro_use] extern crate proptest;
13527
282e5e54386f Something down in the food chain already uses bitflags, so might as well switch to them
alfadur
parents: 13435
diff changeset
    16
#[macro_use] extern crate bitflags;
13534
662f7df89d06 Implement room config export
alfadur
parents: 13527
diff changeset
    17
extern crate serde;
662f7df89d06 Implement room config export
alfadur
parents: 13527
diff changeset
    18
extern crate serde_yaml;
662f7df89d06 Implement room config export
alfadur
parents: 13527
diff changeset
    19
#[macro_use] extern crate serde_derive;
12130
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    20
12131
4348997e502b Refactor code to add more structure to it
unc0rr
parents: 12130
diff changeset
    21
//use std::io::*;
12130
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    22
//use rand::Rng;
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    23
//use std::cmp::Ordering;
12858
a9d105dc5c95 Improve this code a bit more
unc0rr
parents: 12857
diff changeset
    24
use mio::net::*;
12130
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    25
use mio::*;
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    26
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    27
mod utils;
12131
4348997e502b Refactor code to add more structure to it
unc0rr
parents: 12130
diff changeset
    28
mod server;
12134
07972a8c2433 - Start protocol parser implementation
unc0rr
parents: 12133
diff changeset
    29
mod protocol;
12130
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    30
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13534
diff changeset
    31
use crate::server::network::NetworkLayer;
13419
28b314ad566d handle edge polling properly
alfadur
parents: 13124
diff changeset
    32
use std::time::Duration;
13124
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12858
diff changeset
    33
12130
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    34
fn main() {
12142
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12138
diff changeset
    35
    env_logger::init().unwrap();
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12138
diff changeset
    36
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12138
diff changeset
    37
    info!("Hedgewars game server, protocol {}", utils::PROTOCOL_VERSION);
12130
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    38
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    39
    let address = "0.0.0.0:46631".parse().unwrap();
12131
4348997e502b Refactor code to add more structure to it
unc0rr
parents: 12130
diff changeset
    40
    let listener = TcpListener::bind(&address).unwrap();
12130
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    41
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    42
    let poll = Poll::new().unwrap();
13124
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12858
diff changeset
    43
    let mut hw_network = NetworkLayer::new(listener, 1024, 512);
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12858
diff changeset
    44
    hw_network.register_server(&poll).unwrap();
12130
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    45
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    46
    let mut events = Events::with_capacity(1024);
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    47
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    48
    loop {
13419
28b314ad566d handle edge polling properly
alfadur
parents: 13124
diff changeset
    49
        let timeout = if hw_network.has_pending_operations() {
28b314ad566d handle edge polling properly
alfadur
parents: 13124
diff changeset
    50
            Some(Duration::from_millis(1))
28b314ad566d handle edge polling properly
alfadur
parents: 13124
diff changeset
    51
        } else {
28b314ad566d handle edge polling properly
alfadur
parents: 13124
diff changeset
    52
            None
28b314ad566d handle edge polling properly
alfadur
parents: 13124
diff changeset
    53
        };
28b314ad566d handle edge polling properly
alfadur
parents: 13124
diff changeset
    54
        poll.poll(&mut events, timeout).unwrap();
12130
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    55
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    56
        for event in events.iter() {
12858
a9d105dc5c95 Improve this code a bit more
unc0rr
parents: 12857
diff changeset
    57
            if event.readiness() & Ready::readable() == Ready::readable() {
12132
36ac9c075d0d - Use netbuf buffers for client connection stream
unc0rr
parents: 12131
diff changeset
    58
                match event.token() {
13124
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12858
diff changeset
    59
                    utils::SERVER => hw_network.accept_client(&poll).unwrap(),
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12858
diff changeset
    60
                    Token(tok) => hw_network.client_readable(&poll, tok).unwrap(),
12132
36ac9c075d0d - Use netbuf buffers for client connection stream
unc0rr
parents: 12131
diff changeset
    61
                }
36ac9c075d0d - Use netbuf buffers for client connection stream
unc0rr
parents: 12131
diff changeset
    62
            }
12858
a9d105dc5c95 Improve this code a bit more
unc0rr
parents: 12857
diff changeset
    63
            if event.readiness() & Ready::writable() == Ready::writable() {
12132
36ac9c075d0d - Use netbuf buffers for client connection stream
unc0rr
parents: 12131
diff changeset
    64
                match event.token() {
36ac9c075d0d - Use netbuf buffers for client connection stream
unc0rr
parents: 12131
diff changeset
    65
                    utils::SERVER => unreachable!(),
13124
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12858
diff changeset
    66
                    Token(tok) => hw_network.client_writable(&poll, tok).unwrap(),
12132
36ac9c075d0d - Use netbuf buffers for client connection stream
unc0rr
parents: 12131
diff changeset
    67
                }
12130
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    68
            }
12858
a9d105dc5c95 Improve this code a bit more
unc0rr
parents: 12857
diff changeset
    69
//            if event.kind().is_hup() || event.kind().is_error() {
a9d105dc5c95 Improve this code a bit more
unc0rr
parents: 12857
diff changeset
    70
//                match event.token() {
a9d105dc5c95 Improve this code a bit more
unc0rr
parents: 12857
diff changeset
    71
//                    utils::SERVER => unreachable!(),
a9d105dc5c95 Improve this code a bit more
unc0rr
parents: 12857
diff changeset
    72
//                    Token(tok) => server.client_error(&poll, tok).unwrap(),
a9d105dc5c95 Improve this code a bit more
unc0rr
parents: 12857
diff changeset
    73
//                }
a9d105dc5c95 Improve this code a bit more
unc0rr
parents: 12857
diff changeset
    74
//            }
12130
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    75
        }
13419
28b314ad566d handle edge polling properly
alfadur
parents: 13124
diff changeset
    76
        hw_network.on_idle(&poll).unwrap();
12130
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    77
    }
858bf4d04c54 Start server implementation in rust
unc0rr
parents:
diff changeset
    78
}