From 592864de182dfeef8c639cfab6902e385a7c4595 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Thu, 18 Aug 2022 11:40:06 +0200 Subject: refactor networking --- karld/src/interface/generic.rs | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) (limited to 'karld/src/interface/generic.rs') 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( - id: u32, - rstream: ReadStream, - wstream: WriteStream, -) -> io::Result<()> { - let mut reader = BufReader::new(rstream); +pub fn handle_connection(handle_client: F, arg: T) +where + F: FnOnce( + u32, + (Sender, Receiver), + 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( + id: u32, + (responder, responses): (Sender, Receiver), + (rstream, wstream): (ReadStream, WriteStream), +) -> anyhow::Result<()> { + let mut reader = BufReader::new(rstream); thread::spawn(move || { let mut wstream = wstream; -- cgit v1.2.3-70-g09d2