#include #include #include "JsonObjects.hpp" #include #include #include #include #include namespace telebotxx { class SendMessageRequest::Impl { public: Impl(const std::string& telegramMainUrl, const ChatId& chat, const Text& text) : telegramMainUrl_(telegramMainUrl), chatId_(chat), text_(text) { } void setParseMode(ParseMode mode) { parseMode_ = mode; } void setDisableWebPagePreview(const DisableWebPagePreview& disableWebPagePreview) { disableWebPagePreview_ = disableWebPagePreview; } void setDisableNotification(const DisableNotification& disableNotification) { disableNotification_ = disableNotification; } void setReplyToMessageId(const ReplyTo& replyToMessageId) { replyToMessageId_ = replyToMessageId; } Message execute() { // Construct JSON body using namespace rapidjson; StringBuffer s; Writer writer(s); writer.StartObject(); // Add chat_id writer.String("chat_id"); if (chatId_.getType() == ChatId::Type::Id) writer.Int(chatId_.getId()); else writer.String(chatId_.getUsername().c_str()); writer.String("text"); writer.String(text_.getValue().c_str()); // Add parse_mode if (parseMode_) { writer.String("parse_mode"); writer.String( (parseMode_ == ParseMode::Markdown) ? "Markdown" : (parseMode_ == ParseMode::Html) ? "HTML" : "Plain"); } // Add disable_web_page_preview if (disableWebPagePreview_) { writer.String("disable_web_page_preview"); writer.Bool(disableWebPagePreview_->getValue()); } // Add disable_notification if (disableNotification_) { writer.String("disable_notification"); writer.Bool(disableNotification_->getValue()); } // Add reply_to_message_id if (replyToMessageId_) { writer.String("reply_to_message_id"); writer.Int(replyToMessageId_->value()); } /// \todo: Add reply_markup writer.EndObject(); // Execute POST and get response std::string request = s.GetString(); if (debugMode) std::cout << "Request: " << request << std::endl; auto r = cpr::Post(cpr::Url{telegramMainUrl_ + "/sendMessage"}, cpr::Header{{"Content-Type", "application/json"}}, cpr::Body{request} ); auto& response = r.text; if (debugMode) std::cout << "Response: " << response << std::endl; rapidjson::Document doc; doc.Parse(response.c_str()); /// \todo Parse message checkResponse(doc); return *parseMessage(doc, "result", REQUIRED); } private: std::string telegramMainUrl_; ChatId chatId_; Text text_; boost::optional parseMode_; boost::optional disableWebPagePreview_; boost::optional disableNotification_; boost::optional replyToMessageId_; }; SendMessageRequest::SendMessageRequest(const std::string& telegramMainUrl, const ChatId& chat, const Text& text) : impl_(std::make_unique(telegramMainUrl, chat, text)) { } SendMessageRequest::~SendMessageRequest() { } void SendMessageRequest::setParseMode(ParseMode mode) { impl_->setParseMode(mode); } void SendMessageRequest::setDisableWebPagePreview(const DisableWebPagePreview& disableWebPagePreview) { impl_->setDisableWebPagePreview(disableWebPagePreview); } void SendMessageRequest::setDisableNotification(const DisableNotification& disableNotification) { impl_->setDisableNotification(disableNotification); } void SendMessageRequest::setReplyToMessageId(const ReplyTo& replyToMessageId) { impl_->setReplyToMessageId(replyToMessageId); } void SendMessageRequest::setOption(ParseMode mode) { setParseMode(mode); } void SendMessageRequest::setOption(const DisableWebPagePreview& disableWebPagePreview) { setDisableWebPagePreview(disableWebPagePreview); } void SendMessageRequest::setOption(const DisableNotification& disableNotification) { setDisableNotification(disableNotification); } void SendMessageRequest::setOption(const ReplyTo& replyToMessageId) { setReplyToMessageId(replyToMessageId); } Message SendMessageRequest::execute() { return impl_->execute(); } }