aboutsummaryrefslogtreecommitdiff
path: root/games/rstnode/rst-core/src/net
diff options
context:
space:
mode:
Diffstat (limited to 'games/rstnode/rst-core/src/net')
-rw-r--r--games/rstnode/rst-core/src/net/endpoint.rs49
-rw-r--r--games/rstnode/rst-core/src/net/gen.rs52
-rw-r--r--games/rstnode/rst-core/src/net/handler.rs17
-rw-r--r--games/rstnode/rst-core/src/net/mod.rs20
-rw-r--r--games/rstnode/rst-core/src/net/parser.rs17
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(),
+ }
+}