diff options
author | metamuffin <yvchraiqi@protonmail.com> | 2022-08-17 22:04:32 +0200 |
---|---|---|
committer | metamuffin <yvchraiqi@protonmail.com> | 2022-08-17 22:04:32 +0200 |
commit | 4cad1fc66422f84ade7ee29f86f5a43738c065f4 (patch) | |
tree | 815e44d69cc34d42669c866d043f7d09d3172290 /karld/src/interface/generic.rs | |
parent | e87219d47764f82d073f464a23aa18a6f7d0c9d3 (diff) | |
download | karlender-4cad1fc66422f84ade7ee29f86f5a43738c065f4.tar karlender-4cad1fc66422f84ade7ee29f86f5a43738c065f4.tar.bz2 karlender-4cad1fc66422f84ade7ee29f86f5a43738c065f4.tar.zst |
add more interfaces
Diffstat (limited to 'karld/src/interface/generic.rs')
-rw-r--r-- | karld/src/interface/generic.rs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/karld/src/interface/generic.rs b/karld/src/interface/generic.rs new file mode 100644 index 0000000..4c35fdf --- /dev/null +++ b/karld/src/interface/generic.rs @@ -0,0 +1,61 @@ +use crate::handle_packet; +use karlcommon::{version, ClientboundPacket, ProtoError, ServerboundPacket}; +use log::{debug, error, 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); + let (responder, responses) = crossbeam_channel::unbounded(); + responder + .send(ClientboundPacket::Handshake { + version: version!(), + }) + .unwrap(); + + thread::spawn(move || { + let mut wstream = wstream; + for m in responses { + debug!("{id} -> {m:?}"); + match wstream + .write_fmt(format_args!("{}\n", serde_json::to_string(&m).unwrap())) + .map_err(|e| e.kind()) + { + Ok(_) => (), + Err(ErrorKind::BrokenPipe) => break, + Err(e) => error!("network error: {:?}", e), + } + } + }); + { + let mut buf = String::new(); + loop { + if reader.read_line(&mut buf)? == 0 { + break Ok(()); + }; + match serde_json::from_str::<ServerboundPacket>(buf.as_str()) { + Ok(packet) => { + debug!("{id} <- {packet:?}"); + handle_packet(id, packet, responder.clone()); + } + Err(err) => { + warn!("client error: {:?}", &err); + responder + .send(ClientboundPacket::Error(ProtoError::FormatError(format!( + "{}", + &err + )))) + .map_err(|_| io::Error::from(ErrorKind::InvalidInput))? + } + } + + buf.clear(); + } + } +} |