diff --git a/src/data.rs b/src/data.rs index f6a8c6f..269a3fa 100644 --- a/src/data.rs +++ b/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 {} \ No newline at end of file +impl Error for ServerError {} + +// Делаем чтобы ProtocolError мог переделываться в наш ServerError +impl From for ServerError { + fn from(error: ProtocolError) -> ServerError { + match error { + // Если просто закрыто соединение, пеерделываем в нашу ошибку этого + ProtocolError::ConnectionClosedError => { + ServerError::ConnectionClosed + }, + // Все остальное просто засовываем в обертку + error => { + ServerError::Protocol(error) + }, + } + } +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 6aa4f1b..12678fa 100644 --- a/src/main.rs +++ b/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 // Подключение -) -> Result<(), Box> { +) -> 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(())