aboutsummaryrefslogtreecommitdiff
path: root/src/server/interaction
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/interaction')
-rw-r--r--src/server/interaction/mod.rs5
-rw-r--r--src/server/interaction/peer.rs49
-rw-r--r--src/server/interaction/shared.rs28
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() }
+}