aboutsummaryrefslogtreecommitdiff
path: root/karld/src/interface/generic.rs
diff options
context:
space:
mode:
Diffstat (limited to 'karld/src/interface/generic.rs')
-rw-r--r--karld/src/interface/generic.rs35
1 files changed, 27 insertions, 8 deletions
diff --git a/karld/src/interface/generic.rs b/karld/src/interface/generic.rs
index 4c35fdf..e9d57b5 100644
--- a/karld/src/interface/generic.rs
+++ b/karld/src/interface/generic.rs
@@ -1,23 +1,42 @@
-use crate::handle_packet;
+use crate::{handle_packet, CLIENTS, CLIENT_ID_COUNTER};
+use crossbeam_channel::{Receiver, Sender};
use karlcommon::{version, ClientboundPacket, ProtoError, ServerboundPacket};
-use log::{debug, error, warn};
+use log::{debug, error, info, warn};
use std::{
io::{self, BufRead, BufReader, ErrorKind, Read, Write},
thread,
};
-pub fn generic_handle_connection<ReadStream: Read, WriteStream: Write + Send + 'static>(
- id: u32,
- rstream: ReadStream,
- wstream: WriteStream,
-) -> io::Result<()> {
- let mut reader = BufReader::new(rstream);
+pub fn handle_connection<F, T>(handle_client: F, arg: T)
+where
+ F: FnOnce(
+ u32,
+ (Sender<ClientboundPacket>, Receiver<ClientboundPacket>),
+ T,
+ ) -> anyhow::Result<()>,
+{
+ let id = CLIENT_ID_COUNTER.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
let (responder, responses) = crossbeam_channel::unbounded();
responder
.send(ClientboundPacket::Handshake {
version: version!(),
})
.unwrap();
+ info!("client connected: {id}");
+ CLIENTS.write().unwrap().insert(id, responder.clone());
+ match handle_client(id, (responder, responses), arg) {
+ Ok(_) => info!("client ({id}) dropped properly"),
+ Err(e) => error!("client ({id}) dropped bc error: {e}"),
+ }
+ CLIENTS.write().unwrap().remove(&id);
+}
+
+pub fn stream<ReadStream: Read, WriteStream: Write + Send + 'static>(
+ id: u32,
+ (responder, responses): (Sender<ClientboundPacket>, Receiver<ClientboundPacket>),
+ (rstream, wstream): (ReadStream, WriteStream),
+) -> anyhow::Result<()> {
+ let mut reader = BufReader::new(rstream);
thread::spawn(move || {
let mut wstream = wstream;