packages feed

proof-assistant-bot-0.2.1: src/Proof/Assistant/Response.hs

{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE OverloadedStrings #-}
module Proof.Assistant.Response where

import Data.ByteString (ByteString)
import Data.Text.Encoding (decodeUtf8)
import Telegram.Bot.API
  (ChatId, MessageId, ParseMode (..), SendMessageRequest (..), SomeChatId (..))

import Proof.Assistant.Request

-- | Response for Telegram.
data InterpreterResponse = InterpreterResponse
  { interpreterResponseTelegramChatId :: !ChatId -- ^ Telegram ChatId (for reply).
  , interpreterResponseTelegramMessageId :: !MessageId -- ^ Telegram MessageId (for reply).
  , interpreterResponseResponse :: !ByteString -- ^ output data.
  }

-- | Cast 'InterpreterResponse' to 'SendMessageRequest'.
-- If first argument is 'True'
-- then it will wrap message in Monospace font and mark it with @MarkdownV2@ parse mode.
-- Otherwise, text message will be sent.
-- For all responses from Backends 'True' should be specified.
toSendMessageRequest :: Bool -> InterpreterResponse -> SendMessageRequest
toSendMessageRequest isMonospace InterpreterResponse{..} = SendMessageRequest
  { sendMessageChatId                   = SomeChatId interpreterResponseTelegramChatId
  , sendMessageMessageThreadId          = Nothing
  , sendMessageText
      = if isMonospace
        then "```\n" <> decodeUtf8 interpreterResponseResponse <> "\n```\n"
        else decodeUtf8 interpreterResponseResponse <> "\n"
  , sendMessageParseMode                = if isMonospace then Just MarkdownV2 else Nothing
  , sendMessageEntities                 = Nothing
  , sendMessageDisableWebPagePreview    = Nothing
  , sendMessageDisableNotification      = Nothing
  , sendMessageProtectContent           = Nothing
  , sendMessageReplyToMessageId         = Just interpreterResponseTelegramMessageId
  , sendMessageAllowSendingWithoutReply = Nothing
  , sendMessageReplyMarkup              = Nothing
  }

-- | Cast 'InterpreterRequest' and output data to 'InterpreterResponse'.
makeTelegramResponse :: InterpreterRequest -> ByteString -> InterpreterResponse
makeTelegramResponse InterpreterRequest{..} response =
  InterpreterResponse
    { interpreterResponseTelegramChatId    = interpreterRequestTelegramChatId
    , interpreterResponseTelegramMessageId = interpreterRequestTelegramMessageId
    , interpreterResponseResponse          = response
    }