91 lines
2.1 KiB
Rust
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 });
|
|
}
|
|
}
|