Cmdline chat

main
Avery 3 weeks ago
parent ead62f7036
commit c82e1ffd2f
Signed by: Avery
GPG Key ID: 4E53F4CB69B2CC8D

@ -7,9 +7,8 @@ use varint_rs::{VarintReader, VarintWriter};
use crate::{
Connected, Server, Status,
error::ChatError,
error::Result,
readers::{read_packet, read_plugin_msg, read_string},
error::{ChatError, Result},
readers::{read_packet, read_plugin_msg, read_string, try_read_plugin_msg},
status::ServerType,
writers::{write_packet, write_plugin_msg, write_string},
};
@ -200,27 +199,19 @@ impl Server<Status> {
Ok(())
})?;
// Serrver FluidIdmap
read_plugin_msg(&mut stream, "FORGE", |packet| {
let discriminant = VarintReader::read(packet)?;
assert_eq!(discriminant, 2);
Ok(())
})?;
// HandshakeAck pendingcomplete
write_plugin_msg(&mut stream, "FML|HS", |body| {
body.write_all(&[0xFF, 0x04])?;
Ok(())
})?;
// Server HandshakeAck complete
read_plugin_msg(&mut stream, "FML|HS", |packet| {
// Server Mod registried
while try_read_plugin_msg(&mut stream, |channel, packet| {
dbg!(channel);
if channel != "FML|HS" {
Ok(true)
} else {
let discriminant = VarintReader::read(packet)?;
assert_eq!(discriminant, 255);
let phrase = VarintReader::read(packet)?;
assert_eq!(phrase, 3);
Ok(())
})?;
Ok(false)
}
})? {}
// HandshakeAck complete
write_plugin_msg(&mut stream, "FML|HS", |body| {

@ -1,11 +1,15 @@
use serde_json::Value;
use std::{io, result::Result as StdResult, string::FromUtf8Error};
use std::{
env::VarError, io, num::ParseIntError, result::Result as StdResult, string::FromUtf8Error,
};
#[derive(Debug)]
pub enum ChatError {
IoError(io::Error),
FromUtf8Error(FromUtf8Error),
ParseIntError(ParseIntError),
JsonError(JsonError),
VarError(VarError),
}
#[derive(Debug)]
@ -35,6 +39,18 @@ impl From<JsonError> for ChatError {
}
}
impl From<VarError> for ChatError {
fn from(value: VarError) -> Self {
Self::VarError(value)
}
}
impl From<ParseIntError> for ChatError {
fn from(value: ParseIntError) -> Self {
Self::ParseIntError(value)
}
}
impl From<serde_json::Error> for JsonError {
fn from(value: serde_json::Error) -> Self {
Self::SerdeError(value)

@ -57,14 +57,7 @@ impl Server<Disconnected> {
}
fn main() -> Result<()> {
let server = Server::new("localhost".to_string(), 25565)?;
dbg!(&server);
let server = server.status()?;
dbg!(&server);
let server = server.connect()?;
dbg!(&server);
server.run()
let addr = std::env::var("ADDR")?;
let port: u16 = std::env::var("PORT")?.parse()?;
Server::new(addr, port)?.status()?.connect()?.run()
}

@ -45,3 +45,23 @@ pub fn read_plugin_msg<T, F: Fn(&mut &[u8]) -> Result<T>>(
read_body(&mut packet)
})
}
pub fn try_read_plugin_msg<T, F: Fn(&str, &mut &[u8]) -> Result<T>>(
stream: &mut TcpStream,
read_body: F,
) -> Result<T> {
read_packet(stream, |packet| {
let id = packet.read_usize_varint()?;
assert!(id == 63);
let channel_read = read_string(packet)?;
let mut buf = [0u8; 2];
packet.read_exact(&mut buf)?;
let len = u16::from_be_bytes(buf);
let mut buf = vec![0u8; len as usize];
packet.read_exact(&mut buf)?;
let mut packet = &buf[..];
read_body(&channel_read, &mut packet)
})
}

@ -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(())
}
}

Loading…
Cancel
Save