module Eventloop.Module.Websocket.Keyboard.Keyboard
( defaultKeyboardModuleConfiguration
, defaultKeyboardModuleIOState
, keyboardModuleIdentifier
, keyboardInitializer
, keyboardEventRetriever
, keyboardTeardown
) where
import Data.Aeson
import Data.Maybe
import Control.Applicative
import qualified Data.ByteString.Lazy.Char8 as BL
import Eventloop.Types.EventTypes
import Eventloop.Module.Websocket.Keyboard.Types
import Eventloop.Utility.Config
import qualified Eventloop.Utility.BufferedWebsockets as WS
defaultKeyboardModuleConfiguration :: EventloopModuleConfiguration
defaultKeyboardModuleConfiguration = ( EventloopModuleConfiguration
keyboardModuleIdentifier
defaultKeyboardModuleIOState
(Just keyboardInitializer)
(Just keyboardEventRetriever)
Nothing
Nothing
(Just keyboardTeardown)
Nothing
)
defaultKeyboardModuleIOState :: IOState
defaultKeyboardModuleIOState = KeyboardState undefined undefined undefined
keyboardModuleIdentifier :: EventloopModuleIdentifier
keyboardModuleIdentifier = "keyboard"
instance FromJSON Keyboard where
parseJSON (Object v) = Key <$> v .: "key"
keyboardInitializer :: Initializer
keyboardInitializer sharedIO _ = do
(recvBuffer, clientConn, serverSock) <- WS.setupWebsocketConnection ipAddress keyboardPort
putStrLn "Keyboard connection successfull"
return (sharedIO, KeyboardState recvBuffer clientConn serverSock)
keyboardEventRetriever :: EventRetriever
keyboardEventRetriever sharedIO keyboardState = do
messages <- WS.takeMessages (receiveBuffer keyboardState)
return (sharedIO, keyboardState, map ((.) InKeyboard messageToKeyboardIn) messages)
messageToKeyboardIn :: WS.Message -> Keyboard
messageToKeyboardIn message = fromJust.decode $ BL.pack message
keyboardTeardown :: Teardown
keyboardTeardown sharedIO ks@(KeyboardState _ clientConn serverSock) = do
WS.closeWebsocketConnection serverSock clientConn
return (sharedIO, ks)