module TD.Query.SendEphemeralMessage
  (SendEphemeralMessage(..)
  , defaultSendEphemeralMessage
  ) where

import qualified Data.Aeson as A
import qualified Data.Aeson.Types as AT
import qualified TD.Lib.Internal as I
import qualified TD.Data.MessageTopic as MessageTopic
import qualified TD.Data.InputMessageReplyTo as InputMessageReplyTo
import qualified TD.Data.ReplyMarkup as ReplyMarkup
import qualified TD.Data.InputMessageContent as InputMessageContent

-- | Sends an ephemeral message which will be received only by one bot in a chat. Currently, only ephemeral bot commands and replies to bot ephemeral messages can be sent using the method. The message is persistent across application restarts only if the message database is used. Returns the sent message. Returns 'TD.Data.Message.Message'
data SendEphemeralMessage
  = SendEphemeralMessage
    { SendEphemeralMessage -> Maybe Int
chat_id               :: Maybe Int                                     -- ^ Target chat
    , SendEphemeralMessage -> Maybe MessageTopic
topic_id              :: Maybe MessageTopic.MessageTopic               -- ^ Topic in which the message will be sent; pass null if none
    , SendEphemeralMessage -> Maybe Int
receiver_user_id      :: Maybe Int                                     -- ^ Identifier of the user who will receive the message
    , SendEphemeralMessage -> Maybe Int
callback_query_id     :: Maybe Int                                     -- ^ Identifier of the callback query which triggered the message; for bots only
    , SendEphemeralMessage -> Maybe InputMessageReplyTo
reply_to              :: Maybe InputMessageReplyTo.InputMessageReplyTo -- ^ Information about the message to be replied; pass null if none. The message can be an incoming ephemeral message
    , SendEphemeralMessage -> Maybe Int
sending_id            :: Maybe Int                                     -- ^ Non-persistent identifier, which will be returned back in messageSendingStatePending object and can be used to match sent messages and corresponding updateNewMessage updates
    , SendEphemeralMessage -> Maybe Bool
only_preview          :: Maybe Bool                                    -- ^ Pass true to get a fake message instead of actually sending them
    , SendEphemeralMessage -> Maybe ReplyMarkup
reply_markup          :: Maybe ReplyMarkup.ReplyMarkup                 -- ^ Markup for replying to the message; pass null if none; for bots only
    , SendEphemeralMessage -> Maybe InputMessageContent
input_message_content :: Maybe InputMessageContent.InputMessageContent -- ^ The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageAnimation, inputMessageAudio, inputMessageDocument, inputMessagePhoto, inputMessageSticker, inputMessageVideo, inputMessageVideoNote, inputMessageVoiceNote, inputMessageLocation, inputMessageVenue, inputMessageContact
    }
  deriving (SendEphemeralMessage -> SendEphemeralMessage -> Bool
(SendEphemeralMessage -> SendEphemeralMessage -> Bool)
-> (SendEphemeralMessage -> SendEphemeralMessage -> Bool)
-> Eq SendEphemeralMessage
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SendEphemeralMessage -> SendEphemeralMessage -> Bool
== :: SendEphemeralMessage -> SendEphemeralMessage -> Bool
$c/= :: SendEphemeralMessage -> SendEphemeralMessage -> Bool
/= :: SendEphemeralMessage -> SendEphemeralMessage -> Bool
Eq, Int -> SendEphemeralMessage -> ShowS
[SendEphemeralMessage] -> ShowS
SendEphemeralMessage -> String
(Int -> SendEphemeralMessage -> ShowS)
-> (SendEphemeralMessage -> String)
-> ([SendEphemeralMessage] -> ShowS)
-> Show SendEphemeralMessage
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SendEphemeralMessage -> ShowS
showsPrec :: Int -> SendEphemeralMessage -> ShowS
$cshow :: SendEphemeralMessage -> String
show :: SendEphemeralMessage -> String
$cshowList :: [SendEphemeralMessage] -> ShowS
showList :: [SendEphemeralMessage] -> ShowS
Show)

instance I.ShortShow SendEphemeralMessage where
  shortShow :: SendEphemeralMessage -> String
shortShow
    SendEphemeralMessage
      { chat_id :: SendEphemeralMessage -> Maybe Int
chat_id               = Maybe Int
chat_id_
      , topic_id :: SendEphemeralMessage -> Maybe MessageTopic
topic_id              = Maybe MessageTopic
topic_id_
      , receiver_user_id :: SendEphemeralMessage -> Maybe Int
receiver_user_id      = Maybe Int
receiver_user_id_
      , callback_query_id :: SendEphemeralMessage -> Maybe Int
callback_query_id     = Maybe Int
callback_query_id_
      , reply_to :: SendEphemeralMessage -> Maybe InputMessageReplyTo
reply_to              = Maybe InputMessageReplyTo
reply_to_
      , sending_id :: SendEphemeralMessage -> Maybe Int
sending_id            = Maybe Int
sending_id_
      , only_preview :: SendEphemeralMessage -> Maybe Bool
only_preview          = Maybe Bool
only_preview_
      , reply_markup :: SendEphemeralMessage -> Maybe ReplyMarkup
reply_markup          = Maybe ReplyMarkup
reply_markup_
      , input_message_content :: SendEphemeralMessage -> Maybe InputMessageContent
input_message_content = Maybe InputMessageContent
input_message_content_
      }
        = String
"SendEphemeralMessage"
          String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
I.cc
          [ String
"chat_id"               String -> Maybe Int -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Int
chat_id_
          , String
"topic_id"              String -> Maybe MessageTopic -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe MessageTopic
topic_id_
          , String
"receiver_user_id"      String -> Maybe Int -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Int
receiver_user_id_
          , String
"callback_query_id"     String -> Maybe Int -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Int
callback_query_id_
          , String
"reply_to"              String -> Maybe InputMessageReplyTo -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe InputMessageReplyTo
reply_to_
          , String
"sending_id"            String -> Maybe Int -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Int
sending_id_
          , String
"only_preview"          String -> Maybe Bool -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Bool
only_preview_
          , String
"reply_markup"          String -> Maybe ReplyMarkup -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe ReplyMarkup
reply_markup_
          , String
"input_message_content" String -> Maybe InputMessageContent -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe InputMessageContent
input_message_content_
          ]

instance AT.ToJSON SendEphemeralMessage where
  toJSON :: SendEphemeralMessage -> Value
toJSON
    SendEphemeralMessage
      { chat_id :: SendEphemeralMessage -> Maybe Int
chat_id               = Maybe Int
chat_id_
      , topic_id :: SendEphemeralMessage -> Maybe MessageTopic
topic_id              = Maybe MessageTopic
topic_id_
      , receiver_user_id :: SendEphemeralMessage -> Maybe Int
receiver_user_id      = Maybe Int
receiver_user_id_
      , callback_query_id :: SendEphemeralMessage -> Maybe Int
callback_query_id     = Maybe Int
callback_query_id_
      , reply_to :: SendEphemeralMessage -> Maybe InputMessageReplyTo
reply_to              = Maybe InputMessageReplyTo
reply_to_
      , sending_id :: SendEphemeralMessage -> Maybe Int
sending_id            = Maybe Int
sending_id_
      , only_preview :: SendEphemeralMessage -> Maybe Bool
only_preview          = Maybe Bool
only_preview_
      , reply_markup :: SendEphemeralMessage -> Maybe ReplyMarkup
reply_markup          = Maybe ReplyMarkup
reply_markup_
      , input_message_content :: SendEphemeralMessage -> Maybe InputMessageContent
input_message_content = Maybe InputMessageContent
input_message_content_
      }
        = [Pair] -> Value
A.object
          [ Key
"@type"                 Key -> Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Text -> Value
AT.String Text
"sendEphemeralMessage"
          , Key
"chat_id"               Key -> Maybe Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe Int
chat_id_
          , Key
"topic_id"              Key -> Maybe MessageTopic -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe MessageTopic
topic_id_
          , Key
"receiver_user_id"      Key -> Maybe Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe Int
receiver_user_id_
          , Key
"callback_query_id"     Key -> Maybe Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= (Int -> Value) -> Maybe Int -> Maybe Value
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Int -> Value
I.writeInt64  Maybe Int
callback_query_id_
          , Key
"reply_to"              Key -> Maybe InputMessageReplyTo -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe InputMessageReplyTo
reply_to_
          , Key
"sending_id"            Key -> Maybe Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe Int
sending_id_
          , Key
"only_preview"          Key -> Maybe Bool -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe Bool
only_preview_
          , Key
"reply_markup"          Key -> Maybe ReplyMarkup -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe ReplyMarkup
reply_markup_
          , Key
"input_message_content" Key -> Maybe InputMessageContent -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe InputMessageContent
input_message_content_
          ]

defaultSendEphemeralMessage :: SendEphemeralMessage
defaultSendEphemeralMessage :: SendEphemeralMessage
defaultSendEphemeralMessage =
  SendEphemeralMessage
    { chat_id :: Maybe Int
chat_id               = Maybe Int
forall a. Maybe a
Nothing
    , topic_id :: Maybe MessageTopic
topic_id              = Maybe MessageTopic
forall a. Maybe a
Nothing
    , receiver_user_id :: Maybe Int
receiver_user_id      = Maybe Int
forall a. Maybe a
Nothing
    , callback_query_id :: Maybe Int
callback_query_id     = Maybe Int
forall a. Maybe a
Nothing
    , reply_to :: Maybe InputMessageReplyTo
reply_to              = Maybe InputMessageReplyTo
forall a. Maybe a
Nothing
    , sending_id :: Maybe Int
sending_id            = Maybe Int
forall a. Maybe a
Nothing
    , only_preview :: Maybe Bool
only_preview          = Maybe Bool
forall a. Maybe a
Nothing
    , reply_markup :: Maybe ReplyMarkup
reply_markup          = Maybe ReplyMarkup
forall a. Maybe a
Nothing
    , input_message_content :: Maybe InputMessageContent
input_message_content = Maybe InputMessageContent
forall a. Maybe a
Nothing
    }