diff options
Diffstat (limited to 'games/rstnode/rst-core/src/net')
-rw-r--r-- | games/rstnode/rst-core/src/net/endpoint.rs | 49 | ||||
-rw-r--r-- | games/rstnode/rst-core/src/net/gen.rs | 52 | ||||
-rw-r--r-- | games/rstnode/rst-core/src/net/handler.rs | 17 | ||||
-rw-r--r-- | games/rstnode/rst-core/src/net/mod.rs | 20 | ||||
-rw-r--r-- | games/rstnode/rst-core/src/net/parser.rs | 17 |
5 files changed, 155 insertions, 0 deletions
diff --git a/games/rstnode/rst-core/src/net/endpoint.rs b/games/rstnode/rst-core/src/net/endpoint.rs new file mode 100644 index 000000000000..0c8e2f912421 --- /dev/null +++ b/games/rstnode/rst-core/src/net/endpoint.rs @@ -0,0 +1,49 @@ +use crate::{server::Server, Id}; +use async_std::{ + net::UdpSocket, + sync::{Arc, RwLock}, + task, +}; +use std::{ + collections::BTreeMap, + net::SocketAddr, + sync::atomic::{AtomicBool, Ordering}, +}; + +pub struct Endpoint { + running: AtomicBool, + socket: UdpSocket, + bind: String, + clients: RwLock<BTreeMap<Id, Client>>, +} + +pub struct Client {} + +impl Endpoint { + pub async fn new(bind: &str) -> Arc<Self> { + let socket = UdpSocket::bind(bind).await.unwrap(); + Arc::new(Self { + running: true.into(), + socket, + bind: bind.into(), + clients: Default::default(), + }) + } + + /// Stop the endpoint + pub fn stop(self: &Arc<Self>) { + self.running.store(false, Ordering::Relaxed); + } + + pub async fn listen(self: &Arc<Self>, serv: Arc<Server>) { + let mut buf = vec![0; 1024]; + + info!("Listening for connections on {}", self.bind); + while self.running.load(Ordering::Relaxed) { + let (int, peer) = self.socket.recv_from(&mut buf).await.unwrap(); + if int > 1024 { + warn!("Read a larger chunk than buffer?"); + } + } + } +} diff --git a/games/rstnode/rst-core/src/net/gen.rs b/games/rstnode/rst-core/src/net/gen.rs new file mode 100644 index 000000000000..f0a1f58f1905 --- /dev/null +++ b/games/rstnode/rst-core/src/net/gen.rs @@ -0,0 +1,52 @@ +use crate::{ + error::Error, + wire::{ + AuthErr, Lobby, LobbyErr, LobbyId, LobbyUpdate, MatchErr, RegErr, Response, UpdateState, + User, UserId, + }, +}; +use chrono::{DateTime, Utc}; + +pub fn register(r: Result<UserId, RegErr>) -> Response { + Response::Register(r) +} + +pub fn login(r: Result<User, AuthErr>) -> Response { + Response::Login(r) +} + +pub fn logout(r: Result<(), AuthErr>) -> Response { + Response::Logout(r) +} + +pub fn rooms(r: Vec<(String, LobbyId)>) -> Response { + Response::Rooms(r) +} + +pub fn join(r: Result<Lobby, LobbyErr>) -> Response { + Response::Join(r) +} + +pub fn leave(r: Result<(), LobbyErr>) -> Response { + Response::Leave(r) +} + +pub fn ready(r: LobbyUpdate) -> Response { + Response::Ready(r) +} + +pub fn start_req(r: DateTime<Utc>) -> Response { + Response::StartReq(r) +} + +pub fn game_update(r: UpdateState) -> Response { + Response::GameUpdate(r) +} + +pub fn leave_game(r: Result<(), MatchErr>) -> Response { + Response::LeaveGame(r) +} + +pub fn invalid() -> Response { + Response::Invalid +} diff --git a/games/rstnode/rst-core/src/net/handler.rs b/games/rstnode/rst-core/src/net/handler.rs new file mode 100644 index 000000000000..aa0ab6a281c5 --- /dev/null +++ b/games/rstnode/rst-core/src/net/handler.rs @@ -0,0 +1,17 @@ +use crate::{ + net::Client, + server::Server, + wire::{Request, Response}, +}; +use async_std::sync::{Receiver, Sender}; + +pub struct Handler { + tx: Sender<Response>, +} + +impl Handler { + /// Start a message handler with a handle to send a reply back to the clients + pub fn start(req: Request) { + + } +} diff --git a/games/rstnode/rst-core/src/net/mod.rs b/games/rstnode/rst-core/src/net/mod.rs new file mode 100644 index 000000000000..f60cb3b97668 --- /dev/null +++ b/games/rstnode/rst-core/src/net/mod.rs @@ -0,0 +1,20 @@ +mod endpoint; +pub use endpoint::*; + +mod gen; +pub use gen::*; + +mod handler; +pub use handler::*; + +mod parser; +pub use parser::*; + +// #[async_std::test] +// async fn user_connection() { +// let serv = Server::new(); +// let ep = Endpoint::new("localhost:9999").await; +// task::spawn(async move { ep.listen(serv).await }); + +// // Create a fake client here +// } diff --git a/games/rstnode/rst-core/src/net/parser.rs b/games/rstnode/rst-core/src/net/parser.rs new file mode 100644 index 000000000000..d7fdf3de964a --- /dev/null +++ b/games/rstnode/rst-core/src/net/parser.rs @@ -0,0 +1,17 @@ +use crate::{ + error::Error, + wire::{Request, Response}, + GameIf, +}; +use std::sync::Arc; + +/// Parse a request and call a game interface function for it +pub async fn request(req: Request, game: Arc<impl GameIf>) -> Response { + use Request::*; + match req { + Register(name, pw) => super::register(game.register(name, pw).await), + Login(name, pw_hash) => super::login(game.login(name, pw_hash).await), + Logout(user) => super::logout(game.logout(user).await), + _ => super::invalid(), + } +} |