diff options
author | Oleg Morozenkov <m@oleg.rocks> | 2020-08-21 01:41:36 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-21 01:41:36 +0300 |
commit | 4009b7ea603dcd7f21c6e852497daba7b0a1a6b3 (patch) | |
tree | 6dd10e3c92accb9aa250bc30862a59f6f7d9067b | |
parent | 3230b1b5d84a7a948324949eb607082dc40fe01e (diff) | |
parent | ffc3c38882d669ea6b2abeea5c0f7c7b322fa6e7 (diff) |
Merge pull request #143 from sebest06/master
* add SetMyCommand to the api
-rw-r--r-- | include/tgbot/Api.h | 6 | ||||
-rw-r--r-- | include/tgbot/TgTypeParser.h | 4 | ||||
-rw-r--r-- | include/tgbot/tgbot.h | 2 | ||||
-rw-r--r-- | include/tgbot/types/BotCommand.h | 36 | ||||
-rw-r--r-- | samples/echobot-setmycommands/CMakeLists.txt | 19 | ||||
-rw-r--r-- | samples/echobot-setmycommands/Dockerfile | 8 | ||||
-rw-r--r-- | samples/echobot-setmycommands/src/main.cpp | 75 | ||||
-rw-r--r-- | src/Api.cpp | 18 | ||||
-rw-r--r-- | src/TgTypeParser.cpp | 17 |
9 files changed, 185 insertions, 0 deletions
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 <boost/property_tree/ptree.hpp> #include <boost/variant.hpp> @@ -811,6 +812,11 @@ public: Poll::Ptr stopPoll(std::int64_t chatId, std::int64_t messageId, InlineKeyboardMarkup::Ptr replyMarkup = std::make_shared<InlineKeyboardMarkup>()) const; + + bool setMyCommands(const std::vector<BotCommand::Ptr>& commands) const; + + std::vector<BotCommand::Ptr> getMyCommands() const; + private: boost::property_tree::ptree sendRequest(const std::string& method, const std::vector<HttpReqArg>& args = std::vector<HttpReqArg>()) 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 <cstdint> +#include <string> +#include <memory> + +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<BotCommand> 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 <a@reo7sp.ru> + +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 <csignal> +#include <cstdio> +#include <cstdlib> +#include <exception> +#include <string> + +#include <tgbot/tgbot.h> + +using namespace std; +using namespace TgBot; + +int main() { + string token(getenv("TOKEN")); + printf("Token: %s\n", token.c_str()); + + Bot bot(token); + + + vector<BotCommand::Ptr> 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<BotCommand::Ptr> vectCmd; + vectCmd = bot.getApi().getMyCommands(); + + for(std::vector<BotCommand::Ptr>::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<BotCommand::Ptr>& commands) const { + + vector<HttpReqArg> args; + args.reserve(5); + + string commandsJson = _tgTypeParser.parseArray<BotCommand>(&TgTypeParser::parseBotCommand, commands); + args.emplace_back("commands", commandsJson); + + return sendRequest("setMyCommands",args).get<bool>("",false); +} + +std::vector<BotCommand::Ptr> Api::getMyCommands() const +{ + return _tgTypeParser.parseJsonAndGetArray<BotCommand>(&TgTypeParser::parseJsonAndGetBotCommand, sendRequest("getMyCommands")); +} + ptree Api::sendRequest(const string& method, const vector<HttpReqArg>& args) const { string url = "https://api.telegram.org/bot"; url += _token; @@ -1189,4 +1205,6 @@ string Api::downloadFile(const string& filePath, const std::vector<HttpReqArg>& 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<BotCommand>()); + 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<OrderInfo>()); result->name = data.get<string>("name", ""); |