odyssey-server/src/main.rs

91 lines
2.1 KiB
Rust

mod components;
mod config;
mod systems;
use crate::config::Settings;
use actix::prelude::*;
use env_logger::Env;
use log::info;
use shipyard::World;
use std::time::Duration;
use tokio::net::{TcpListener, TcpStream};
use tokio_tungstenite::WebSocketStream;
// Minimum delay between updates, in nanoseconds
const MIN_UPDATE_NS: u32 = 1000; // 1ms
struct Game {
world: World,
}
impl Actor for Game {
type Context = Context<Game>;
fn started(&mut self, ctx: &mut Self::Context) {
// Start update loop
ctx.run_interval(Duration::new(0, MIN_UPDATE_NS), |game, _ctx| {
game.world.run_workload("update");
});
}
}
struct NetworkConnection {
stream: WebSocketStream<TcpStream>,
}
impl Actor for NetworkConnection {
type Context = Context<NetworkConnection>;
fn started(&mut self, _ctx: &mut Self::Context) {
//TODO Read
}
}
struct NetworkManager {}
impl Actor for NetworkManager {
type Context = Context<NetworkManager>;
}
fn main() {
let env = Env::default().filter_or("LOG_LEVEL", "trace");
env_logger::init_from_env(env);
let settings = Settings::new().unwrap();
let system = System::new("main");
Game::create(|ctx| {
// Create world
let world = World::default();
// Create workload
world.add_workload("update").build();
Game { world }
});
Arbiter::spawn(listen_websocket(settings.bind));
system.run().unwrap();
}
async fn listen_websocket(bind: String) {
let try_socket = TcpListener::bind(&bind).await;
let mut listener = try_socket.expect("Failed to bind");
info!("Listening on: {}", bind);
while let Ok((stream, _)) = listener.accept().await {
let addr = stream
.peer_addr()
.expect("connected streams should have a peer address");
info!("Peer address: {}", addr);
let stream = tokio_tungstenite::accept_async(stream)
.await
.expect("Error during the websocket handshake occurred");
info!("New WebSocket connection: {}", addr);
NetworkConnection::create(|_ctx| NetworkConnection { stream });
}
}