module Network.Loshadka.Server (serve) where import Network.Loshadka.Protocol import Network.Loshadka.Settings import qualified Data.ByteString.Lazy.Char8 as B import System.Cmd (system) import Network (Socket, PortID(PortNumber), listenOn, sClose) import Network.Socket (accept) import Network.Socket.ByteString.Lazy (sendAll, recv) import Control.Concurrent (forkIO) serve :: Settings -> IO() serve settings = do sock <- listenOn $ PortNumber (port settings) loop sock settings loop :: Socket -> Settings -> IO() loop sock ss = do (conn, _) <- accept sock _ <- forkIO $ handleRequest sock conn ss loop sock ss handleRequest :: Socket -> Socket -> Settings -> IO() handleRequest sock conn ss = do handshake <- recv conn 256 respond sock conn ss $ B.last handshake sClose conn respond :: Socket -> Socket -> Settings -> Char -> IO() respond _ conn ss '\x01' = do _ <- recv conn 2 sendAll conn (ping $ responses ss) respond sock conn ss '\x02' = do --username <- recv conn 64 sendAll conn (start $ responses ss) sClose sock _ <- system $ command ss sClose conn respond _ conn ss _ = sendAll conn (denied $ responses ss)