use std::collections::{HashMap, VecDeque}; use log::{debug, info}; use mio::{Events, Poll, PollOpt, Ready, Token}; use crate::client::Client; use crate::config::Config; use crate::database::Db; use crate::game::Game; use crate::logger; use crate::result::*; use crate::server::Server; use crate::try_log; impl Game { pub fn new() -> RudeResult { let config = Config::load("config.toml")?; println!("Loading configuration from config.toml"); let log_level = config.logging.level.clone(); try_print(logger::init(log_level), "Unable to initialize logger")?; debug!("Initialized logging facility"); debug!("Opening database"); let db = Db::open(&config.database)?; let events = Events::with_capacity(config.server.event_capacity); let clients: HashMap = HashMap::new(); let mut tokens: VecDeque = VecDeque::with_capacity(config.server.connection_limit); for i in 1..=config.server.connection_limit { tokens.push_back(Token(i)); } let server_address = format!("{}:{}", config.server.ip, config.server.port); let server = Server::listen(server_address.clone(), Token(0))?; info!("Listening on {}", &server_address); let poll = try_log!(Poll::new(), "Unable to create Poll"); try_log!( poll.register(&server.socket, Token(0), Ready::readable(), PollOpt::edge()), "Unable to register poll" ); debug!("Accepting connections"); Ok(Self { config, server, poll, events, tokens, clients, db, }) } }