diff options
| author | Fuwn <[email protected]> | 2021-04-26 13:30:51 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2021-04-26 13:30:51 +0000 |
| commit | af68ae63e4b0f5f6237bbda4fed9fd2a6022357d (patch) | |
| tree | 02bbd59bf0a54808e335c1d703d3dac4cdc0773b /src/server/interaction | |
| parent | fix: Actually remove legacy server module (diff) | |
| download | whirl-af68ae63e4b0f5f6237bbda4fed9fd2a6022357d.tar.xz whirl-af68ae63e4b0f5f6237bbda4fed9fd2a6022357d.zip | |
fmt: Rename re_server module to server
Diffstat (limited to 'src/server/interaction')
| -rw-r--r-- | src/server/interaction/mod.rs | 5 | ||||
| -rw-r--r-- | src/server/interaction/peer.rs | 49 | ||||
| -rw-r--r-- | src/server/interaction/shared.rs | 28 |
3 files changed, 82 insertions, 0 deletions
diff --git a/src/server/interaction/mod.rs b/src/server/interaction/mod.rs new file mode 100644 index 0000000..4f0f38b --- /dev/null +++ b/src/server/interaction/mod.rs @@ -0,0 +1,5 @@ +// Copyleft 2021-2021 Whirlsplash +// SPDX-License-Identifier: GPL-3.0-only + +pub mod peer; +pub mod shared; diff --git a/src/server/interaction/peer.rs b/src/server/interaction/peer.rs new file mode 100644 index 0000000..c0f5223 --- /dev/null +++ b/src/server/interaction/peer.rs @@ -0,0 +1,49 @@ +// Copyleft 2021-2021 Whirlsplash +// SPDX-License-Identifier: GPL-3.0-only + +use std::sync::Arc; + +use tokio::{ + net::TcpStream, + sync::{mpsc, Mutex}, +}; +use tokio_util::codec::{BytesCodec, Framed}; + +use crate::server::{interaction::shared::Shared, types::Rx}; + +pub struct Peer { + pub bytes: Framed<TcpStream, BytesCodec>, + pub rx: Rx, +} +impl Peer { + pub async fn new( + state: Arc<Mutex<Shared>>, + bytes: Framed<TcpStream, BytesCodec>, + username: String, + ) -> std::io::Result<Peer> { + let (tx, rx) = mpsc::unbounded_channel(); + state.lock().await.peers.insert(username, tx); + + Ok(Peer { + bytes, + rx, + }) + } + + pub async fn _change_username( + self, + state: Arc<Mutex<Shared>>, + username: &str, + new_username: &str, + ) { + // Remove peer from peers + { + state.lock().await.peers.remove(username); + } + + // Add the peer back with the new username + Self::new(state, self.bytes, new_username.to_string()) + .await + .unwrap(); + } +} diff --git a/src/server/interaction/shared.rs b/src/server/interaction/shared.rs new file mode 100644 index 0000000..fec5980 --- /dev/null +++ b/src/server/interaction/shared.rs @@ -0,0 +1,28 @@ +// Copyleft 2021-2021 Whirlsplash +// SPDX-License-Identifier: GPL-3.0-only + +use std::collections::HashMap; + +use bytes::BytesMut; + +use crate::server::types::Tx; + +pub struct Shared { + pub peers: HashMap<String, Tx>, +} +impl Shared { + pub fn new() -> Self { + Shared { + peers: HashMap::new(), + } + } + + pub async fn broadcast(&mut self, message: &[u8]) { + for peer in self.peers.iter_mut() { + peer.1.send(BytesMut::from(message)).unwrap(); + } + } +} +impl Default for Shared { + fn default() -> Self { Self::new() } +} |