|
|
|
@ -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,13 +26,15 @@ impl Server<Connected> {
|
|
|
|
|
let Self {
|
|
|
|
|
mut stream,
|
|
|
|
|
lang,
|
|
|
|
|
state: Connected { .. },
|
|
|
|
|
state: Connected { username, .. },
|
|
|
|
|
..
|
|
|
|
|
} = self;
|
|
|
|
|
let mut recv_stream = stream.try_clone().unwrap();
|
|
|
|
|
std::thread::spawn(move || -> Result<()> {
|
|
|
|
|
loop {
|
|
|
|
|
let packet = read_packet(&mut stream, parse_packet)?;
|
|
|
|
|
let packet = read_packet(&mut recv_stream, parse_packet)?;
|
|
|
|
|
match packet {
|
|
|
|
|
Packet::KeepAlive(id) => handle_keepalive(&mut stream, id)?,
|
|
|
|
|
Packet::KeepAlive(id) => handle_keepalive(&mut recv_stream, id)?,
|
|
|
|
|
Packet::Chat(m) => {
|
|
|
|
|
for m in m {
|
|
|
|
|
println!("{}", m.format(&lang))
|
|
|
|
@ -41,6 +45,18 @@ impl Server<Connected> {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
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(())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|