|  |  |  | @ -1,15 +1,17 @@ | 
			
		
	
		
			
				
					|  |  |  |  | use std::{ | 
			
		
	
		
			
				
					|  |  |  |  |     io::{Read as _, Write as _}, | 
			
		
	
		
			
				
					|  |  |  |  |     net::TcpStream, | 
			
		
	
		
			
				
					|  |  |  |  |     io::{Read as _, Write as _, stdin, stdout}, | 
			
		
	
		
			
				
					|  |  |  |  |     net::{Shutdown, TcpStream}, | 
			
		
	
		
			
				
					|  |  |  |  | }; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | use varint_rs::{VarintReader, VarintWriter as _}; | 
			
		
	
		
			
				
					|  |  |  |  | use serde_json::json; | 
			
		
	
		
			
				
					|  |  |  |  | use varint_rs::{VarintReader, VarintWriter}; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | use crate::{ | 
			
		
	
		
			
				
					|  |  |  |  |     Connected, Server, | 
			
		
	
		
			
				
					|  |  |  |  |     error::Result, | 
			
		
	
		
			
				
					|  |  |  |  |     readers::{read_packet, read_string}, | 
			
		
	
		
			
				
					|  |  |  |  |     text::Message, | 
			
		
	
		
			
				
					|  |  |  |  |     writers::{write_packet, write_string}, | 
			
		
	
		
			
				
					|  |  |  |  | }; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | pub enum Packet { | 
			
		
	
	
		
			
				
					|  |  |  | @ -24,22 +26,36 @@ impl Server<Connected> { | 
			
		
	
		
			
				
					|  |  |  |  |         let Self { | 
			
		
	
		
			
				
					|  |  |  |  |             mut stream, | 
			
		
	
		
			
				
					|  |  |  |  |             lang, | 
			
		
	
		
			
				
					|  |  |  |  |             state: Connected { .. }, | 
			
		
	
		
			
				
					|  |  |  |  |             state: Connected { username, .. }, | 
			
		
	
		
			
				
					|  |  |  |  |             .. | 
			
		
	
		
			
				
					|  |  |  |  |         } = self; | 
			
		
	
		
			
				
					|  |  |  |  |         loop { | 
			
		
	
		
			
				
					|  |  |  |  |             let packet = read_packet(&mut stream, parse_packet)?; | 
			
		
	
		
			
				
					|  |  |  |  |             match packet { | 
			
		
	
		
			
				
					|  |  |  |  |                 Packet::KeepAlive(id) => handle_keepalive(&mut stream, id)?, | 
			
		
	
		
			
				
					|  |  |  |  |                 Packet::Chat(m) => { | 
			
		
	
		
			
				
					|  |  |  |  |                     for m in m { | 
			
		
	
		
			
				
					|  |  |  |  |                         println!("{}", m.format(&lang)) | 
			
		
	
		
			
				
					|  |  |  |  |         let mut recv_stream = stream.try_clone().unwrap(); | 
			
		
	
		
			
				
					|  |  |  |  |         std::thread::spawn(move || -> Result<()> { | 
			
		
	
		
			
				
					|  |  |  |  |             loop { | 
			
		
	
		
			
				
					|  |  |  |  |                 let packet = read_packet(&mut recv_stream, parse_packet)?; | 
			
		
	
		
			
				
					|  |  |  |  |                 match packet { | 
			
		
	
		
			
				
					|  |  |  |  |                     Packet::KeepAlive(id) => handle_keepalive(&mut recv_stream, id)?, | 
			
		
	
		
			
				
					|  |  |  |  |                     Packet::Chat(m) => { | 
			
		
	
		
			
				
					|  |  |  |  |                         for m in m { | 
			
		
	
		
			
				
					|  |  |  |  |                             println!("{}", m.format(&lang)) | 
			
		
	
		
			
				
					|  |  |  |  |                         } | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  |                     Packet::Disconnect => break, | 
			
		
	
		
			
				
					|  |  |  |  |                     Packet::Other(_, _) => {} | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |                 Packet::Disconnect => break, | 
			
		
	
		
			
				
					|  |  |  |  |                 Packet::Other(_, _) => {} | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             Ok(()) | 
			
		
	
		
			
				
					|  |  |  |  |         }); | 
			
		
	
		
			
				
					|  |  |  |  |         for line in stdin().lines() { | 
			
		
	
		
			
				
					|  |  |  |  |             print!("\x1b[1F\x1b[0K"); | 
			
		
	
		
			
				
					|  |  |  |  |             let line = &line?; | 
			
		
	
		
			
				
					|  |  |  |  |             write_packet(&mut stream, move |buf| { | 
			
		
	
		
			
				
					|  |  |  |  |                 buf.write_usize_varint(0x01)?; | 
			
		
	
		
			
				
					|  |  |  |  |                 write_string(buf, line)?; | 
			
		
	
		
			
				
					|  |  |  |  |                 Ok(()) | 
			
		
	
		
			
				
					|  |  |  |  |             })?; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         stream.shutdown(Shutdown::Both)?; | 
			
		
	
		
			
				
					|  |  |  |  |         Ok(()) | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
	
		
			
				
					|  |  |  | 
 |