{-# LANGUAGE RecordWildCards #-} module Lambdabot.Plugin.Telegram.Shared where import Control.Concurrent.STM (TBQueue, atomically, readTBQueue, writeTBQueue) import Data.Text (Text) import Lambdabot.Module (ModuleT) import Lambdabot.Monad (LB) -- | Transport type used to communicate between Telegram and Lambdabot. data Msg = Msg { msgChatId :: !Text , msgMsgId :: !Text , msgMessage :: !Text } deriving Show -- | Shared state between Lambdabot and Telegram. data TelegramState = TelegramState { tgInput :: TBQueue Msg , tgOutput :: TBQueue Msg , tgCurrent :: Int , tgBotName :: Text } -- | Lambdabot Monad with embedded Telegram State. type Telegram = ModuleT TelegramState LB -- | Read input message from Telegram bot on Lambdabot side. readInput :: TelegramState -> IO Msg readInput TelegramState{..} = atomically $ readTBQueue tgInput -- | Read output message from Lambdabot on Telegram bot side. readOutput :: TelegramState -> IO Msg readOutput TelegramState{..} = atomically $ readTBQueue tgOutput -- | Send input message to Lambdabot from Telegram bot side. writeInput :: Msg -> TelegramState -> IO () writeInput msg TelegramState{..} = atomically $ writeTBQueue tgInput msg -- | Send output message to Telegram bot from Lambdabot side. writeOutput :: Msg -> TelegramState -> IO () writeOutput msg TelegramState{..} = atomically $ writeTBQueue tgOutput msg