From ffc3c38882d669ea6b2abeea5c0f7c7b322fa6e7 Mon Sep 17 00:00:00 2001 From: sebest Date: Mon, 25 May 2020 15:49:44 -0300 Subject: * add SetMyCommand to the api --- include/tgbot/Api.h | 6 +++ include/tgbot/TgTypeParser.h | 4 ++ include/tgbot/tgbot.h | 2 + include/tgbot/types/BotCommand.h | 36 +++++++++++++ samples/echobot-setmycommands/CMakeLists.txt | 19 +++++++ samples/echobot-setmycommands/Dockerfile | 8 +++ samples/echobot-setmycommands/src/main.cpp | 75 ++++++++++++++++++++++++++++ src/Api.cpp | 18 +++++++ src/TgTypeParser.cpp | 17 +++++++ 9 files changed, 185 insertions(+) create mode 100644 include/tgbot/types/BotCommand.h create mode 100644 samples/echobot-setmycommands/CMakeLists.txt create mode 100644 samples/echobot-setmycommands/Dockerfile create mode 100644 samples/echobot-setmycommands/src/main.cpp diff --git a/include/tgbot/Api.h b/include/tgbot/Api.h index eddbe50..e48da6f 100644 --- a/include/tgbot/Api.h +++ b/include/tgbot/Api.h @@ -20,6 +20,7 @@ #include "tgbot/types/GameHighScore.h" #include "tgbot/types/LabeledPrice.h" #include "tgbot/types/ShippingOption.h" +#include "tgbot/types/BotCommand.h" #include #include @@ -811,6 +812,11 @@ public: Poll::Ptr stopPoll(std::int64_t chatId, std::int64_t messageId, InlineKeyboardMarkup::Ptr replyMarkup = std::make_shared()) const; + + bool setMyCommands(const std::vector& commands) const; + + std::vector getMyCommands() const; + private: boost::property_tree::ptree sendRequest(const std::string& method, const std::vector& args = std::vector()) const; diff --git a/include/tgbot/TgTypeParser.h b/include/tgbot/TgTypeParser.h index b080bc4..d8e2282 100644 --- a/include/tgbot/TgTypeParser.h +++ b/include/tgbot/TgTypeParser.h @@ -74,6 +74,7 @@ #include "tgbot/types/ShippingOption.h" #include "tgbot/types/SuccessfulPayment.h" #include "tgbot/types/LabeledPrice.h" +#include "tgbot/types/BotCommand.h" #include "tgbot/types/InputMedia.h" #include "tgbot/types/InputMediaPhoto.h" #include "tgbot/types/InputMediaVideo.h" @@ -302,6 +303,9 @@ public: LabeledPrice::Ptr parseJsonAndGetLabeledPrice(const boost::property_tree::ptree& data) const; std::string parseLabeledPrice(const LabeledPrice::Ptr& object) const; + BotCommand::Ptr parseJsonAndGetBotCommand(const boost::property_tree::ptree& data) const; + std::string parseBotCommand(const BotCommand::Ptr& object) const; + OrderInfo::Ptr parseJsonAndGetOrderInfo(const boost::property_tree::ptree& data) const; std::string parseOrderInfo(const OrderInfo::Ptr& object) const; diff --git a/include/tgbot/tgbot.h b/include/tgbot/tgbot.h index 8ebf51d..0868aa0 100644 --- a/include/tgbot/tgbot.h +++ b/include/tgbot/tgbot.h @@ -96,6 +96,8 @@ #include "tgbot/types/VideoNote.h" #include "tgbot/types/Voice.h" #include "tgbot/types/WebhookInfo.h" +#include "tgbot/types/BotCommand.h" + /** * @defgroup general diff --git a/include/tgbot/types/BotCommand.h b/include/tgbot/types/BotCommand.h new file mode 100644 index 0000000..5ad057b --- /dev/null +++ b/include/tgbot/types/BotCommand.h @@ -0,0 +1,36 @@ +#ifndef TGBOT_BOTCOMMAND_H +#define TGBOT_BOTCOMMAND_H + +#include +#include +#include + +namespace TgBot { + +/** + * @brief This object represents a bot command. + * + * https://core.telegram.org/bots/api#botcommand + * @ingroup types + */ +class BotCommand { +public: + typedef std::shared_ptr Ptr; + BotCommand() { } + + virtual ~BotCommand() { } + + /** + * @brief command label. + */ + std::string command; + + /** + * @brief description label. + */ + std::string description; + +}; +} + +#endif //TGBOT_BOTCOMMAND_H diff --git a/samples/echobot-setmycommands/CMakeLists.txt b/samples/echobot-setmycommands/CMakeLists.txt new file mode 100644 index 0000000..7019e8f --- /dev/null +++ b/samples/echobot-setmycommands/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 2.8.4) +project(echobot) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall") +set(Boost_USE_MULTITHREADED ON) + +find_package(Threads REQUIRED) +find_package(OpenSSL REQUIRED) +find_package(Boost COMPONENTS system REQUIRED) +find_package(CURL) +include_directories(/usr/local/include ${OPENSSL_INCLUDE_DIR} ${Boost_INCLUDE_DIR}) +if (CURL_FOUND) + include_directories(${CURL_INCLUDE_DIRS}) + add_definitions(-DHAVE_CURL) +endif() + +add_executable(echobot src/main.cpp) + +target_link_libraries(echobot /usr/local/lib/libTgBot.a ${CMAKE_THREAD_LIBS_INIT} ${OPENSSL_LIBRARIES} ${Boost_LIBRARIES} ${CURL_LIBRARIES}) diff --git a/samples/echobot-setmycommands/Dockerfile b/samples/echobot-setmycommands/Dockerfile new file mode 100644 index 0000000..a7aa61a --- /dev/null +++ b/samples/echobot-setmycommands/Dockerfile @@ -0,0 +1,8 @@ +FROM reo7sp/tgbot-cpp +MAINTAINER Oleg Morozenkov + +WORKDIR /usr/src/echobot +COPY . . +RUN cmake . +RUN make -j4 +CMD ./echobot diff --git a/samples/echobot-setmycommands/src/main.cpp b/samples/echobot-setmycommands/src/main.cpp new file mode 100644 index 0000000..afb9e35 --- /dev/null +++ b/samples/echobot-setmycommands/src/main.cpp @@ -0,0 +1,75 @@ +#include +#include +#include +#include +#include + +#include + +using namespace std; +using namespace TgBot; + +int main() { + string token(getenv("TOKEN")); + printf("Token: %s\n", token.c_str()); + + Bot bot(token); + + + vector commands; + BotCommand::Ptr cmdArray(new BotCommand); + cmdArray->command = "ccuno"; + cmdArray->description = "es el comando uno"; + + commands.push_back(cmdArray); + + cmdArray = BotCommand::Ptr(new BotCommand); + cmdArray->command = "dossendo"; + cmdArray->description = "es el comando dos"; + commands.push_back(cmdArray); + + cmdArray = BotCommand::Ptr(new BotCommand); + cmdArray->command = "tressss"; + cmdArray->description = "es el comando tres"; + commands.push_back(cmdArray); + + bot.getApi().setMyCommands(commands); + + vector vectCmd; + vectCmd = bot.getApi().getMyCommands(); + + for(std::vector::iterator it = vectCmd.begin(); it != vectCmd.end(); ++it) { + printf("cmd: %s -> %s\r",(*it)->command.c_str(),(*it)->description.c_str()); + } + + bot.getEvents().onCommand("start", [&bot](Message::Ptr message) { + bot.getApi().sendMessage(message->chat->id, "Hi!"); + }); + bot.getEvents().onAnyMessage([&bot](Message::Ptr message) { + printf("User wrote %s\n", message->text.c_str()); + if (StringTools::startsWith(message->text, "/start")) { + return; + } + bot.getApi().sendMessage(message->chat->id, "Your message is: " + message->text); + }); + + signal(SIGINT, [](int s) { + printf("SIGINT got\n"); + exit(0); + }); + + try { + printf("Bot username: %s\n", bot.getApi().getMe()->username.c_str()); + bot.getApi().deleteWebhook(); + + TgLongPoll longPoll(bot); + while (true) { + printf("Long poll started\n"); + longPoll.start(); + } + } catch (exception& e) { + printf("error: %s\n", e.what()); + } + + return 0; +} diff --git a/src/Api.cpp b/src/Api.cpp index 6e01807..0a08353 100644 --- a/src/Api.cpp +++ b/src/Api.cpp @@ -1155,6 +1155,22 @@ Poll::Ptr Api::stopPoll(std::int64_t chatId, std::int64_t messageId, const Inlin return _tgTypeParser.parseJsonAndGetPoll(sendRequest("stopPoll", args)); } +bool Api::setMyCommands(const std::vector& commands) const { + + vector args; + args.reserve(5); + + string commandsJson = _tgTypeParser.parseArray(&TgTypeParser::parseBotCommand, commands); + args.emplace_back("commands", commandsJson); + + return sendRequest("setMyCommands",args).get("",false); +} + +std::vector Api::getMyCommands() const +{ + return _tgTypeParser.parseJsonAndGetArray(&TgTypeParser::parseJsonAndGetBotCommand, sendRequest("getMyCommands")); +} + ptree Api::sendRequest(const string& method, const vector& args) const { string url = "https://api.telegram.org/bot"; url += _token; @@ -1189,4 +1205,6 @@ string Api::downloadFile(const string& filePath, const std::vector& return serverResponse; } + + } diff --git a/src/TgTypeParser.cpp b/src/TgTypeParser.cpp index 06a2b2a..95c60c9 100644 --- a/src/TgTypeParser.cpp +++ b/src/TgTypeParser.cpp @@ -2026,6 +2026,23 @@ string TgTypeParser::parseLabeledPrice(const LabeledPrice::Ptr& object) const { return result; } +BotCommand::Ptr TgTypeParser::parseJsonAndGetBotCommand(const boost::property_tree::ptree& data) const { + auto result(make_shared()); + result->command = data.get("command", ""); + result->description = data.get("description",""); + return result; +} + +string TgTypeParser::parseBotCommand(const BotCommand::Ptr& object) const { + std::string result; + result += '{'; + appendToJson(result, "command", object->command); + appendToJson(result, "description", object->description); + removeLastComma(result); + result += '}'; + return result; +} + OrderInfo::Ptr TgTypeParser::parseJsonAndGetOrderInfo(const boost::property_tree::ptree& data) const { auto result(make_shared()); result->name = data.get("name", ""); -- cgit v1.2.3