module Servant.API.SMSC.RU(
SMSCAPI
, SendResponse(..)
, PhoneResp(..)
, SendEndpoint
, genericSmsSend
, SmscConfig(..)
, defaultSmscConfig
, simpleSmsSend
, getSimpleSmsCost
) where
import Control.Monad.Except
import Data.ByteString.Lazy (ByteString)
import Data.Monoid
import Data.Proxy
import Data.Text
import GHC.Generics
import Network.HTTP.Client (Manager, newManager)
import Network.HTTP.Client.TLS
import Servant.API.SMSC.RU.API
import Servant.Client
import qualified Data.Text as T
genericSmsSend ::
Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Double
-> Maybe Word
-> Maybe Word
-> Maybe Text
-> Maybe Word
-> Maybe Word
-> Maybe Word
-> Maybe Word
-> Maybe Word
-> Maybe Word
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Word
-> Maybe Word
-> Maybe Text
-> Maybe Text
-> Maybe Word
-> Maybe Text
-> Maybe Text
-> Maybe Word
-> Maybe Word
-> Maybe Text
-> ByteString
-> Manager -> BaseUrl -> ClientM SendResponse
genericSmsSend = client (Proxy :: Proxy SMSCAPI)
data SmscConfig = SmscConfig {
smscLogin :: !Text
, smscPassword :: !Text
, smscManager :: !Manager
, smscBaseUrl :: !BaseUrl
} deriving (Generic)
instance Show SmscConfig where
show SmscConfig{..} = "SmscConfig {"
<> "smscLogin = " <> show smscLogin
<> ", smscPassword = " <> show smscPassword
<> ", smscManager = <object> "
<> ", smscBaseUrl = " <> show smscBaseUrl
<> " }"
defaultSmscConfig :: MonadIO m => m SmscConfig
defaultSmscConfig = do
mng <- liftIO $ newManager tlsManagerSettings
return SmscConfig {
smscLogin = ""
, smscPassword = ""
, smscManager = mng
, smscBaseUrl = BaseUrl {
baseUrlScheme = Https
, baseUrlHost = "smsc.ru"
, baseUrlPort = 443
, baseUrlPath = ""
}
}
simpleSmsSend :: MonadIO m
=> SmscConfig
-> Text
-> Text
-> m (Either Text SendResponse)
simpleSmsSend SmscConfig{..} phone msg = do
res <- liftIO . runExceptT $ genericSmsSend
(Just smscLogin)
(Just smscPassword)
(Just phone)
(Just msg)
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
(Just 3)
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
mempty
smscManager smscBaseUrl
return $ case res of
Left e -> Left (T.pack $ show e)
Right r -> Right r
getSimpleSmsCost :: MonadIO m
=> SmscConfig
-> Text
-> Text
-> m (Either Text Text)
getSimpleSmsCost SmscConfig{..} phone msg = do
res <- liftIO . runExceptT $ genericSmsSend
(Just smscLogin)
(Just smscPassword)
(Just phone)
(Just msg)
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
(Just 1)
(Just 3)
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
Nothing
mempty
smscManager smscBaseUrl
return $ case res of
Left e -> Left (T.pack $ show e)
Right r -> case r of
se@SendError{} -> Left (T.pack $ show se)
SendSuccess{..} -> case sendSuccCost of
Nothing -> Left "No cost in response"
Just c -> return c