2018-11-17 19:11:36 +01:00
|
|
|
{-# LANGUAGE FlexibleContexts #-}
|
|
|
|
module Message (
|
|
|
|
Connected
|
|
|
|
, receive
|
|
|
|
, send
|
|
|
|
) where
|
|
|
|
|
|
|
|
import Control.Monad.Reader (MonadReader, ReaderT, ask)
|
|
|
|
import Control.Monad.State (StateT)
|
|
|
|
import Control.Monad.IO.Class (MonadIO(..))
|
|
|
|
import Network.WebSockets (Connection, receiveData, sendTextData)
|
|
|
|
import Data.Aeson (encode, eitherDecode')
|
|
|
|
import Game (Game)
|
|
|
|
import qualified Message.Client as Client (Message)
|
|
|
|
import qualified Message.Server as Server (Message(..))
|
|
|
|
|
2018-12-02 19:43:24 +01:00
|
|
|
type Connected a = StateT Game (ReaderT Connection IO) a
|
2018-11-17 19:11:36 +01:00
|
|
|
|
|
|
|
send :: (MonadReader Connection t, MonadIO t) => Server.Message -> t ()
|
|
|
|
send message = do
|
|
|
|
connection <- ask
|
|
|
|
liftIO $ sendTextData connection $ encode message
|
|
|
|
|
|
|
|
receive :: (MonadReader Connection t, MonadIO t) => t Client.Message
|
|
|
|
receive = do
|
|
|
|
connection <- ask
|
|
|
|
received <- liftIO $ receiveData connection
|
|
|
|
case eitherDecode' received of
|
|
|
|
Left message -> send (Server.Error message) >> receive
|
|
|
|
Right message -> return message
|