game/src/Message.back.hs

27 lines
748 B
Haskell

module Message (
Connected
, receive
, send
) where
import Control.Monad.Reader (ReaderT, ask, lift)
import Network.WebSockets (Connection, receiveData, sendTextData)
import Data.Aeson (encode, eitherDecode')
import qualified Message.Client as Client (Message)
import qualified Message.Server as Server (Message(..))
type Connected a = ReaderT Connection IO a
send :: Server.Message -> Connected ()
send message = do
connection <- ask
lift $ sendTextData connection $ encode message
receive :: Connected Client.Message
receive = do
connection <- ask
received <- lift $ receiveData connection
case eitherDecode' received of
Left message -> send (Server.Error message) >> receive
Right message -> return message