game/src/Message.hs

31 lines
972 B
Haskell

{-# 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(..))
type Connected a = StateT Game (ReaderT Connection IO) a
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