respect server error
This commit is contained in:
parent
86e519ed63
commit
2eb187a8c1
30
src/data.rs
30
src/data.rs
@ -1,13 +1,13 @@
|
||||
use std::{error::Error, fmt::Display};
|
||||
|
||||
use rust_mc_proto::ProtocolError;
|
||||
|
||||
// Ошибки сервера
|
||||
#[derive(Debug)]
|
||||
pub enum ServerError {
|
||||
ReadPacketError,
|
||||
ConnectionClosedError,
|
||||
ReadError,
|
||||
BindError,
|
||||
VarIntIsTooBig,
|
||||
PacketIsEnd
|
||||
UnknownPacket(String),
|
||||
Protocol(ProtocolError),
|
||||
ConnectionClosed
|
||||
}
|
||||
|
||||
impl Display for ServerError {
|
||||
@ -16,4 +16,20 @@ impl Display for ServerError {
|
||||
}
|
||||
}
|
||||
|
||||
impl Error for ServerError {}
|
||||
impl Error for ServerError {}
|
||||
|
||||
// Делаем чтобы ProtocolError мог переделываться в наш ServerError
|
||||
impl From<ProtocolError> for ServerError {
|
||||
fn from(error: ProtocolError) -> ServerError {
|
||||
match error {
|
||||
// Если просто закрыто соединение, пеерделываем в нашу ошибку этого
|
||||
ProtocolError::ConnectionClosedError => {
|
||||
ServerError::ConnectionClosed
|
||||
},
|
||||
// Все остальное просто засовываем в обертку
|
||||
error => {
|
||||
ServerError::Protocol(error)
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
18
src/main.rs
18
src/main.rs
@ -1,8 +1,10 @@
|
||||
use std::{error::Error, io::{Read, Write}, net::TcpListener, thread, time::Duration};
|
||||
use std::{io::{Read, Write}, net::TcpListener, thread, time::Duration};
|
||||
|
||||
use pohuy::Pohuy;
|
||||
use rust_mc_proto::{DataReader, DataWriter, MinecraftConnection, Packet};
|
||||
|
||||
use data::ServerError;
|
||||
use pohuy::Pohuy;
|
||||
|
||||
pub mod pohuy;
|
||||
pub mod data;
|
||||
|
||||
@ -37,11 +39,13 @@ fn main() {
|
||||
|
||||
fn handle_connection(
|
||||
mut conn: MinecraftConnection<impl Read + Write> // Подключение
|
||||
) -> Result<(), Box<dyn Error>> {
|
||||
) -> Result<(), ServerError> {
|
||||
// Чтение рукопожатия
|
||||
let mut packet = conn.read_packet()?;
|
||||
|
||||
if packet.id() != 0x00 { return Ok(()); } // Айди пакета не рукопожатное - выходим из функции
|
||||
if packet.id() != 0x00 {
|
||||
return Err(ServerError::UnknownPacket(format!("Неизвестный пакет рукопожатия")));
|
||||
} // Айди пакета не рукопожатное - выходим из функции
|
||||
|
||||
let protocol_version = packet.read_varint()?; // Получаем версия протокола, может быть отрицательным если наш клиент дэбил
|
||||
let server_address = packet.read_string()?; // Получаем домен/адрес сервера к которому пытается подключиться клиент, например "play.example.com", а не айпи
|
||||
@ -92,7 +96,7 @@ fn handle_connection(
|
||||
// ID такой-же, содержание тоже, так почему бы и нет?
|
||||
},
|
||||
_ => {
|
||||
break;
|
||||
return Err(ServerError::UnknownPacket(format!("Неизвестный пакет при чтении запросов статуса")));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -107,7 +111,9 @@ fn handle_connection(
|
||||
// TODO: Чтение Configuration (возможно с примешиванием Listener'ов)
|
||||
// TODO: Обработчик пакетов Play (тоже трейт), который уже будет дергать Listener'ы
|
||||
},
|
||||
_ => {} // Тип подключения не рукопожатный
|
||||
_ => {
|
||||
return Err(ServerError::UnknownPacket(format!("Неизвестный NextState при рукопожатии")));
|
||||
} // Тип подключения не рукопожатный
|
||||
}
|
||||
|
||||
Ok(())
|
||||
|
Loading…
Reference in New Issue
Block a user