{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
module Telegram.Bot.API.Methods.SendVoice where
import Control.Monad.IO.Class (liftIO)
import Data.Aeson (ToJSON (..))
import Data.Aeson.Text (encodeToLazyText)
import Data.Bool
import Data.Maybe (catMaybes)
import Data.Functor ((<&>))
import Data.Proxy
import Data.Text
import GHC.Generics (Generic)
import Servant.API
import Servant.Multipart.API
import Servant.Multipart.Client
import Servant.Client hiding (Response)
import qualified Data.Text.Lazy as TL
import Telegram.Bot.API.Internal.Utils
import Telegram.Bot.API.MakingRequests
import Telegram.Bot.API.Types
import Telegram.Bot.API.Types.ParseMode
import Telegram.Bot.API.Internal.TH
data SendVoiceRequest = SendVoiceRequest
{ SendVoiceRequest -> Maybe BusinessConnectionId
sendVoiceBusinessConnectionId :: Maybe BusinessConnectionId
, SendVoiceRequest -> SomeChatId
sendVoiceChatId :: SomeChatId
, SendVoiceRequest -> Maybe MessageThreadId
sendVoiceMessageThreadId :: Maybe MessageThreadId
, SendVoiceRequest -> InputFile
sendVoiceVoice :: InputFile
, SendVoiceRequest -> Maybe Text
sendVoiceCaption :: Maybe Text
, SendVoiceRequest -> Maybe ParseMode
sendVoiceParseMode :: Maybe ParseMode
, SendVoiceRequest -> Maybe [MessageEntity]
sendVoiceCaptionEntities :: Maybe [MessageEntity]
, SendVoiceRequest -> Maybe Int
sendVoiceDuration :: Maybe Int
, SendVoiceRequest -> Maybe Bool
sendVoiceDisableNotification :: Maybe Bool
, SendVoiceRequest -> Maybe Bool
sendVoiceProtectContent :: Maybe Bool
, SendVoiceRequest -> Maybe Text
sendVoiceMessageEffectId :: Maybe Text
, SendVoiceRequest -> Maybe MessageId
sendVoiceReplyToMessageId :: Maybe MessageId
, SendVoiceRequest -> Maybe ReplyParameters
sendVoiceReplyParameters :: Maybe ReplyParameters
, SendVoiceRequest -> Maybe InlineKeyboardMarkup
sendVoiceReplyMarkup :: Maybe InlineKeyboardMarkup
}
deriving (forall x. SendVoiceRequest -> Rep SendVoiceRequest x)
-> (forall x. Rep SendVoiceRequest x -> SendVoiceRequest)
-> Generic SendVoiceRequest
forall x. Rep SendVoiceRequest x -> SendVoiceRequest
forall x. SendVoiceRequest -> Rep SendVoiceRequest x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. SendVoiceRequest -> Rep SendVoiceRequest x
from :: forall x. SendVoiceRequest -> Rep SendVoiceRequest x
$cto :: forall x. Rep SendVoiceRequest x -> SendVoiceRequest
to :: forall x. Rep SendVoiceRequest x -> SendVoiceRequest
Generic
instance ToJSON SendVoiceRequest where toJSON :: SendVoiceRequest -> Value
toJSON = SendVoiceRequest -> Value
forall a (d :: Meta) (f :: * -> *).
(Generic a, GToJSON Zero (Rep a), Rep a ~ D1 d f, Datatype d) =>
a -> Value
gtoJSON
instance ToMultipart Tmp SendVoiceRequest where
toMultipart :: SendVoiceRequest -> MultipartData Tmp
toMultipart SendVoiceRequest{Maybe Bool
Maybe Int
Maybe [MessageEntity]
Maybe Text
Maybe BusinessConnectionId
Maybe MessageThreadId
Maybe MessageId
Maybe ParseMode
Maybe InlineKeyboardMarkup
Maybe ReplyParameters
SomeChatId
InputFile
sendVoiceBusinessConnectionId :: SendVoiceRequest -> Maybe BusinessConnectionId
sendVoiceChatId :: SendVoiceRequest -> SomeChatId
sendVoiceMessageThreadId :: SendVoiceRequest -> Maybe MessageThreadId
sendVoiceVoice :: SendVoiceRequest -> InputFile
sendVoiceCaption :: SendVoiceRequest -> Maybe Text
sendVoiceParseMode :: SendVoiceRequest -> Maybe ParseMode
sendVoiceCaptionEntities :: SendVoiceRequest -> Maybe [MessageEntity]
sendVoiceDuration :: SendVoiceRequest -> Maybe Int
sendVoiceDisableNotification :: SendVoiceRequest -> Maybe Bool
sendVoiceProtectContent :: SendVoiceRequest -> Maybe Bool
sendVoiceMessageEffectId :: SendVoiceRequest -> Maybe Text
sendVoiceReplyToMessageId :: SendVoiceRequest -> Maybe MessageId
sendVoiceReplyParameters :: SendVoiceRequest -> Maybe ReplyParameters
sendVoiceReplyMarkup :: SendVoiceRequest -> Maybe InlineKeyboardMarkup
sendVoiceBusinessConnectionId :: Maybe BusinessConnectionId
sendVoiceChatId :: SomeChatId
sendVoiceMessageThreadId :: Maybe MessageThreadId
sendVoiceVoice :: InputFile
sendVoiceCaption :: Maybe Text
sendVoiceParseMode :: Maybe ParseMode
sendVoiceCaptionEntities :: Maybe [MessageEntity]
sendVoiceDuration :: Maybe Int
sendVoiceDisableNotification :: Maybe Bool
sendVoiceProtectContent :: Maybe Bool
sendVoiceMessageEffectId :: Maybe Text
sendVoiceReplyToMessageId :: Maybe MessageId
sendVoiceReplyParameters :: Maybe ReplyParameters
sendVoiceReplyMarkup :: Maybe InlineKeyboardMarkup
..} =
Text -> InputFile -> MultipartData Tmp -> MultipartData Tmp
makeFile Text
"voice" InputFile
sendVoiceVoice (MultipartData Tmp -> MultipartData Tmp)
-> MultipartData Tmp -> MultipartData Tmp
forall a b. (a -> b) -> a -> b
$
[Input] -> [FileData Tmp] -> MultipartData Tmp
forall tag. [Input] -> [FileData tag] -> MultipartData tag
MultipartData [Input]
fields [] where
fields :: [Input]
fields =
[ Text -> Text -> Input
Input Text
"chat_id" (Text -> Input) -> Text -> Input
forall a b. (a -> b) -> a -> b
$ case SomeChatId
sendVoiceChatId of
SomeChatId (ChatId Integer
chat_id) -> Integer -> Text
forall a. Show a => a -> Text
showText Integer
chat_id
SomeChatUsername Text
txt -> Text
txt
] [Input] -> [Input] -> [Input]
forall a. Semigroup a => a -> a -> a
<> [Maybe Input] -> [Input]
forall a. [Maybe a] -> [a]
catMaybes
[ Maybe MessageThreadId
sendVoiceMessageThreadId Maybe MessageThreadId -> (MessageThreadId -> Input) -> Maybe Input
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&>
\MessageThreadId
t -> Text -> Text -> Input
Input Text
"message_thread_id" (MessageThreadId -> Text
forall a. Show a => a -> Text
showText MessageThreadId
t)
, Maybe Text
sendVoiceCaption Maybe Text -> (Text -> Input) -> Maybe Input
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&>
\Text
t -> Text -> Text -> Input
Input Text
"caption" Text
t
, Maybe ParseMode
sendVoiceParseMode Maybe ParseMode -> (ParseMode -> Input) -> Maybe Input
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&>
\ParseMode
t -> Text -> Text -> Input
Input Text
"parse_mode" (Text -> Text
TL.toStrict (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
TL.replace Text
"\"" Text
"" (Text -> Text) -> Text -> Text
forall a b. (a -> b) -> a -> b
$ ParseMode -> Text
forall a. ToJSON a => a -> Text
encodeToLazyText ParseMode
t)
, Maybe [MessageEntity]
sendVoiceCaptionEntities Maybe [MessageEntity] -> ([MessageEntity] -> Input) -> Maybe Input
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&>
\[MessageEntity]
t -> Text -> Text -> Input
Input Text
"caption_entities" (Text -> Text
TL.toStrict (Text -> Text) -> Text -> Text
forall a b. (a -> b) -> a -> b
$ [MessageEntity] -> Text
forall a. ToJSON a => a -> Text
encodeToLazyText [MessageEntity]
t)
, Maybe Int
sendVoiceDuration Maybe Int -> (Int -> Input) -> Maybe Input
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&>
\Int
t -> Text -> Text -> Input
Input Text
"duration" (Text -> Text
TL.toStrict (Text -> Text) -> Text -> Text
forall a b. (a -> b) -> a -> b
$ Int -> Text
forall a. ToJSON a => a -> Text
encodeToLazyText Int
t)
, Maybe Bool
sendVoiceProtectContent Maybe Bool -> (Bool -> Input) -> Maybe Input
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&>
\Bool
t -> Text -> Text -> Input
Input Text
"protect_content" (Text -> Text -> Bool -> Text
forall a. a -> a -> Bool -> a
bool Text
"false" Text
"true" Bool
t)
, Maybe Bool
sendVoiceDisableNotification Maybe Bool -> (Bool -> Input) -> Maybe Input
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&>
\Bool
t -> Text -> Text -> Input
Input Text
"disable_notification" (Text -> Text -> Bool -> Text
forall a. a -> a -> Bool -> a
bool Text
"false" Text
"true" Bool
t)
, Maybe MessageId
sendVoiceReplyToMessageId Maybe MessageId -> (MessageId -> Input) -> Maybe Input
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&>
\MessageId
t -> Text -> Text -> Input
Input Text
"reply_to_message_id" (Text -> Text
TL.toStrict (Text -> Text) -> Text -> Text
forall a b. (a -> b) -> a -> b
$ MessageId -> Text
forall a. ToJSON a => a -> Text
encodeToLazyText MessageId
t)
, Maybe ReplyParameters
sendVoiceReplyParameters Maybe ReplyParameters -> (ReplyParameters -> Input) -> Maybe Input
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&>
\ReplyParameters
t -> Text -> Text -> Input
Input Text
"reply_parameters" (Text -> Text
TL.toStrict (Text -> Text) -> Text -> Text
forall a b. (a -> b) -> a -> b
$ ReplyParameters -> Text
forall a. ToJSON a => a -> Text
encodeToLazyText ReplyParameters
t)
, Maybe InlineKeyboardMarkup
sendVoiceReplyMarkup Maybe InlineKeyboardMarkup
-> (InlineKeyboardMarkup -> Input) -> Maybe Input
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&>
\InlineKeyboardMarkup
t -> Text -> Text -> Input
Input Text
"reply_markup" (Text -> Text
TL.toStrict (Text -> Text) -> Text -> Text
forall a b. (a -> b) -> a -> b
$ InlineKeyboardMarkup -> Text
forall a. ToJSON a => a -> Text
encodeToLazyText InlineKeyboardMarkup
t)
]
type SendVoiceContent
= "sendVoice"
:> MultipartForm Tmp SendVoiceRequest
:> Post '[JSON] (Response Message)
type SendVoiceLink
= "sendVoice"
:> ReqBody '[JSON] SendVoiceRequest
:> Post '[JSON] (Response Message)
sendVoice :: SendVoiceRequest -> ClientM (Response Message)
sendVoice :: SendVoiceRequest -> ClientM (Response Message)
sendVoice SendVoiceRequest
r = case SendVoiceRequest -> InputFile
sendVoiceVoice SendVoiceRequest
r of
InputFile{} -> do
ByteString
boundary <- IO ByteString -> ClientM ByteString
forall a. IO a -> ClientM a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO ByteString
genBoundary
Proxy SendVoiceContent -> Client ClientM SendVoiceContent
forall api.
HasClient ClientM api =>
Proxy api -> Client ClientM api
client (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @SendVoiceContent) (ByteString
boundary, SendVoiceRequest
r)
InputFile
_ -> Proxy SendVoiceLink -> Client ClientM SendVoiceLink
forall api.
HasClient ClientM api =>
Proxy api -> Client ClientM api
client (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @SendVoiceLink) SendVoiceRequest
r
makeDefault ''SendVoiceRequest