packages feed

loshadka-0.2: Network/Loshadka/Server.hs

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)