module Network.Telegram.API.Bot.Core (Telegram, telegram, ask', Token (..), Ok, result) where import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:)) import "base" Control.Exception (SomeException) import "text" Data.Text (Text) import "transformers" Control.Monad.Trans.Reader (ReaderT (runReaderT), ask) import "transformers" Control.Monad.Trans.Except (ExceptT, runExceptT) import "wreq" Network.Wreq.Session (Session) newtype Token = Token Text deriving Eq type Telegram e a = ReaderT (e, (Session, Token)) (ExceptT SomeException IO) a telegram :: Session -> Token -> e -> Telegram e a -> IO (Either SomeException a) telegram session token env = runExceptT . flip runReaderT (env, (session, token)) ask' :: Telegram e e ask' = fst <$> ask data Ok a = Ok Bool a deriving Show result :: Ok a -> Maybe a result (Ok True x) = Just x result (Ok False _ ) = Nothing instance FromJSON a => FromJSON (Ok a) where parseJSON = withObject "Ok" $ \v -> Ok <$> v .: "ok" <*> v .: "result"