2018-11-17 19:11:36 +01:00
|
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
{-# LANGUAGE NamedFieldPuns #-}
|
|
|
|
module Main where
|
|
|
|
|
|
|
|
import Control.Monad.Reader (runReaderT)
|
|
|
|
import Control.Monad.State (evalStateT)
|
|
|
|
import Network.HTTP.Types.Status (badRequest400)
|
|
|
|
import Network.Wai (responseLBS)
|
|
|
|
import qualified Network.Wai.Handler.Warp as Warp (run)
|
|
|
|
import Network.Wai.Handler.WebSockets (websocketsOr)
|
2018-12-02 19:43:24 +01:00
|
|
|
import Network.WebSockets (ServerApp, acceptRequest, defaultConnectionOptions, forkPingThread)
|
2018-11-17 19:11:36 +01:00
|
|
|
import qualified Automaton (run)
|
|
|
|
import Config (listenPort)
|
2018-12-15 07:53:03 +01:00
|
|
|
import qualified Game (Game(..))
|
2018-11-17 19:11:36 +01:00
|
|
|
|
|
|
|
makeApp :: IO ServerApp
|
|
|
|
makeApp =
|
|
|
|
return $ \pending -> do
|
|
|
|
connection <- acceptRequest pending
|
|
|
|
putStrLn "New connection"
|
2018-12-02 19:43:24 +01:00
|
|
|
forkPingThread connection 20
|
2018-12-15 07:53:03 +01:00
|
|
|
runReaderT (evalStateT Automaton.run Game.Empty) connection
|
2018-11-17 19:11:36 +01:00
|
|
|
|
|
|
|
main :: IO ()
|
|
|
|
main = do
|
|
|
|
app <- makeApp
|
|
|
|
Warp.run Config.listenPort $ websocketsOr defaultConnectionOptions app blockNonWS
|
|
|
|
where
|
|
|
|
blockNonWS _ = ( $ responseLBS badRequest400 [] "Use a websocket")
|