packages feed

eventloop-0.5.0.0: src/Eventloop/Module/Websocket/Keyboard/Keyboard.hs

 {-# LANGUAGE OverloadedStrings #-}
module Eventloop.Module.Websocket.Keyboard.Keyboard
    ( setupKeyboardModuleConfiguration
    , keyboardModuleIdentifier
    , keyboardInitializer
    , keyboardEventRetriever
    , keyboardTeardown
    ) where

import Data.Aeson
import Data.Maybe
import Control.Applicative
import Control.Concurrent.SafePrint
import qualified Data.ByteString.Lazy.Char8 as BL

import Eventloop.Types.Common
import Eventloop.Types.Events
import Eventloop.Types.System
import Eventloop.Module.Websocket.Keyboard.Types
import Eventloop.Utility.Config
import qualified Eventloop.Utility.BufferedWebsockets as WS


setupKeyboardModuleConfiguration :: EventloopSetupModuleConfiguration
setupKeyboardModuleConfiguration = ( EventloopSetupModuleConfiguration 
                                        keyboardModuleIdentifier
                                        (Just keyboardInitializer)
                                        (Just keyboardEventRetriever)
                                        Nothing
                                        Nothing
                                        Nothing
                                        (Just keyboardTeardown)
                                      )

                                      
keyboardModuleIdentifier :: EventloopModuleIdentifier
keyboardModuleIdentifier = "keyboard"

                  
instance FromJSON Keyboard where
    parseJSON (Object v) = Key <$> v .: "key"

    
keyboardInitializer :: Initializer
keyboardInitializer sharedIO
    = do
        (recvBuffer, clientSocket, clientConn, serverSock, bufferedReaderThread) <- WS.setupWebsocketConnection ipAddress  keyboardPort
        safePrintLn (safePrintToken sharedIO) "Keyboard connection successfull"
        return (sharedIO, KeyboardState recvBuffer clientSocket clientConn serverSock bufferedReaderThread)

                            
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
    = do
        WS.closeWebsocketConnection (serverSocket ks) (clientSocket ks) (clientConnection ks) (bufferedReaderThread ks)
        return sharedIO