diff options
author | Oleg Morozenkov <reo7sp@users.noreply.github.com> | 2017-01-26 00:32:22 +0300 |
---|---|---|
committer | Oleg Morozenkov <reo7sp@users.noreply.github.com> | 2017-01-26 00:32:22 +0300 |
commit | 85e0e991973594fb458410876a1cc09c5971b918 (patch) | |
tree | 08186c9e9f58cdb617b9b63d583f535b1c884b72 | |
parent | 3549754e53f79e9ba0b00fb0bbded5d56a14ef51 (diff) |
Helper method for loading files. Photo upload example. Fixes #24
-rw-r--r-- | CMakeLists.txt | 4 | ||||
-rw-r--r-- | Dockerfile_test | 4 | ||||
-rw-r--r-- | include/tgbot/tgbot.h | 1 | ||||
-rw-r--r-- | include/tgbot/tools/FileTools.h | 25 | ||||
-rw-r--r-- | include/tgbot/types/InputFile.h | 5 | ||||
-rw-r--r-- | samples/echobot/CMakeLists.txt | 8 | ||||
-rw-r--r-- | samples/echobot/Dockerfile | 3 | ||||
-rw-r--r-- | samples/echobot/src/main.cpp | 9 | ||||
-rw-r--r-- | samples/inline-keyboard/CMakeLists.txt | 8 | ||||
-rw-r--r-- | samples/inline-keyboard/src/main.cpp | 9 | ||||
-rw-r--r-- | samples/photo/CMakeLists.txt | 14 | ||||
-rw-r--r-- | samples/photo/Dockerfile | 8 | ||||
-rw-r--r-- | samples/photo/example.jpg | bin | 0 -> 16770 bytes | |||
-rw-r--r-- | samples/photo/src/main.cpp | 45 | ||||
-rw-r--r-- | src/tools/FileTools.cpp | 25 | ||||
-rw-r--r-- | src/types/InputFile.cpp | 24 | ||||
-rw-r--r-- | test/tgbot/tools/StringTools.cpp | 13 |
17 files changed, 182 insertions, 23 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 8c31193..ea765ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,13 +11,15 @@ set(SRC_LIST src/Api.cpp src/TgTypeParser.cpp src/TgException.cpp + src/EventHandler.cpp src/net/Url.cpp src/net/HttpClient.cpp src/net/HttpParser.cpp src/net/TgLongPoll.cpp src/tools/StringTools.cpp + src/tools/FileTools.cpp src/types/InlineQueryResult.cpp - src/EventHandler.cpp + src/types/InputFile.cpp ) ### libs diff --git a/Dockerfile_test b/Dockerfile_test index f203561..98f3a02 100644 --- a/Dockerfile_test +++ b/Dockerfile_test @@ -23,6 +23,10 @@ WORKDIR /tmp/tgbot-cpp/samples/inline-keyboard RUN rm -rf CMakeCache.txt CMakeFiles/ && \ cmake . && make -j4 +WORKDIR /tmp/tgbot-cpp/samples/photo +RUN rm -rf CMakeCache.txt CMakeFiles/ && \ + cmake . && make -j4 + WORKDIR /tmp/tgbot-cpp ENV CTEST_OUTPUT_ON_FAILURE=1 CMD make test diff --git a/include/tgbot/tgbot.h b/include/tgbot/tgbot.h index 351410b..a7c8ae6 100644 --- a/include/tgbot/tgbot.h +++ b/include/tgbot/tgbot.h @@ -54,6 +54,7 @@ #include "tgbot/types/InlineQueryResultVideo.h" #include "tgbot/types/ChosenInlineResult.h" #include "tgbot/tools/StringTools.h" +#include "tgbot/tools/FileTools.h" #include "tgbot/net/HttpClient.h" #include "tgbot/net/HttpParser.h" #include "tgbot/net/HttpReqArg.h" diff --git a/include/tgbot/tools/FileTools.h b/include/tgbot/tools/FileTools.h new file mode 100644 index 0000000..6071852 --- /dev/null +++ b/include/tgbot/tools/FileTools.h @@ -0,0 +1,25 @@ +// +// Created by Oleg on 25.01.17. +// + +#ifndef TGBOT_FILETOOLS_H +#define TGBOT_FILETOOLS_H + +#include <string> + +/** + * @ingroup tools + */ +namespace FileTools { + +/** + * Reads whole file to string. + * @param filePath Path to a file + * @return string with file contents + */ +std::string read(const std::string& filePath); + +}; + + +#endif //TGBOT_FILETOOLS_H diff --git a/include/tgbot/types/InputFile.h b/include/tgbot/types/InputFile.h index f2403e3..c56ab7a 100644 --- a/include/tgbot/types/InputFile.h +++ b/include/tgbot/types/InputFile.h @@ -52,6 +52,11 @@ public: * File name. */ std::string fileName; + + /** + * Creates new InputFile::Ptr from an existing file. + */ + static InputFile::Ptr fromFile(const std::string& filePath, const std::string& mimeType); }; } diff --git a/samples/echobot/CMakeLists.txt b/samples/echobot/CMakeLists.txt index c54109c..5df19f7 100644 --- a/samples/echobot/CMakeLists.txt +++ b/samples/echobot/CMakeLists.txt @@ -1,10 +1,14 @@ cmake_minimum_required(VERSION 2.8.4) project(echobot) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + +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 iostreams unit_test_framework REQUIRED) +find_package(Boost COMPONENTS system iostreams REQUIRED) include_directories(/usr/local/include ${OPENSSL_INCLUDE_DIR} ${Boost_INCLUDE_DIR}) + add_executable(echobot src/main.cpp) + target_link_libraries(echobot /usr/local/lib/libTgBot.a ${CMAKE_THREAD_LIBS_INIT} ${OPENSSL_LIBRARIES} ${Boost_LIBRARIES}) diff --git a/samples/echobot/Dockerfile b/samples/echobot/Dockerfile index 8d8bca5..054c1c7 100644 --- a/samples/echobot/Dockerfile +++ b/samples/echobot/Dockerfile @@ -1,6 +1,5 @@ FROM reo7sp/tgbot-cpp -MAINTAINER Oleg Morozenkov -ENV REFRESHED_AT 2015-08-12 +MAINTAINER Oleg Morozenkov <a@reo7sp.ru> WORKDIR /tmp/echobot COPY . . diff --git a/samples/echobot/src/main.cpp b/samples/echobot/src/main.cpp index 05806d2..7c78112 100644 --- a/samples/echobot/src/main.cpp +++ b/samples/echobot/src/main.cpp @@ -32,11 +32,6 @@ using namespace TgBot; bool sigintGot = false; int main() { - signal(SIGINT, [](int s) { - printf("SIGINT got"); - sigintGot = true; - }); - Bot bot("PLACE YOUR TOKEN HERE"); bot.getEvents().onCommand("start", [&bot](Message::Ptr message) { bot.getApi().sendMessage(message->chat->id, "Hi!"); @@ -49,6 +44,10 @@ int main() { bot.getApi().sendMessage(message->chat->id, "Your message is: " + message->text); }); + signal(SIGINT, [](int s) { + printf("SIGINT got"); + sigintGot = true; + }); try { printf("Bot username: %s\n", bot.getApi().getMe()->username.c_str()); diff --git a/samples/inline-keyboard/CMakeLists.txt b/samples/inline-keyboard/CMakeLists.txt index c59a97a..dbcff89 100644 --- a/samples/inline-keyboard/CMakeLists.txt +++ b/samples/inline-keyboard/CMakeLists.txt @@ -1,10 +1,14 @@ cmake_minimum_required(VERSION 2.8.4) project(inline-keyboard) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + +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 iostreams unit_test_framework REQUIRED) +find_package(Boost COMPONENTS system iostreams REQUIRED) include_directories(/usr/local/include ${OPENSSL_INCLUDE_DIR} ${Boost_INCLUDE_DIR}) + add_executable(inline-keyboard src/main.cpp) + target_link_libraries(inline-keyboard /usr/local/lib/libTgBot.a ${CMAKE_THREAD_LIBS_INIT} ${OPENSSL_LIBRARIES} ${Boost_LIBRARIES}) diff --git a/samples/inline-keyboard/src/main.cpp b/samples/inline-keyboard/src/main.cpp index 4e6fb21..440f965 100644 --- a/samples/inline-keyboard/src/main.cpp +++ b/samples/inline-keyboard/src/main.cpp @@ -10,11 +10,6 @@ using namespace TgBot; bool sigintGot = false; int main() { - signal(SIGINT, [](int s) { - printf("SIGINT got"); - sigintGot = true; - }); - Bot bot("PLACE YOUR TOKEN HERE"); // Thanks Pietro Falessi for code @@ -40,6 +35,10 @@ int main() { } }); + signal(SIGINT, [](int s) { + printf("SIGINT got"); + sigintGot = true; + }); try { printf("Bot username: %s\n", bot.getApi().getMe()->username.c_str()); diff --git a/samples/photo/CMakeLists.txt b/samples/photo/CMakeLists.txt new file mode 100644 index 0000000..d431b88 --- /dev/null +++ b/samples/photo/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 2.8.4) +project(photo) + +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 iostreams REQUIRED) +include_directories(/usr/local/include ${OPENSSL_INCLUDE_DIR} ${Boost_INCLUDE_DIR}) + +add_executable(photo src/main.cpp) + +target_link_libraries(photo /usr/local/lib/libTgBot.a ${CMAKE_THREAD_LIBS_INIT} ${OPENSSL_LIBRARIES} ${Boost_LIBRARIES}) diff --git a/samples/photo/Dockerfile b/samples/photo/Dockerfile new file mode 100644 index 0000000..2bdbe1f --- /dev/null +++ b/samples/photo/Dockerfile @@ -0,0 +1,8 @@ +FROM reo7sp/tgbot-cpp +MAINTAINER Oleg Morozenkov <a@reo7sp.ru> + +WORKDIR /tmp/photo +COPY . . +RUN cmake . +RUN make -j4 +CMD ./photo diff --git a/samples/photo/example.jpg b/samples/photo/example.jpg Binary files differnew file mode 100644 index 0000000..cbfd0d5 --- /dev/null +++ b/samples/photo/example.jpg diff --git a/samples/photo/src/main.cpp b/samples/photo/src/main.cpp new file mode 100644 index 0000000..1b81f27 --- /dev/null +++ b/samples/photo/src/main.cpp @@ -0,0 +1,45 @@ +// +// Created by Oleg Morozenkov on 25.01.17. +// + +#include <signal.h> +#include <stdio.h> +#include <exception> + +#include <tgbot/tgbot.h> + +using namespace std; +using namespace TgBot; + +bool sigintGot = false; + +int main() { + const string photoFilePath = "example.jpg"; + const string photoMimeType = "image/jpeg"; + + Bot bot("PLACE YOUR TOKEN HERE"); + bot.getEvents().onCommand("start", [&bot](Message::Ptr message) { + bot.getApi().sendMessage(message->chat->id, "Hi!"); + }); + bot.getEvents().onCommand("photo", [&bot, &photoFilePath, &photoMimeType](Message::Ptr message) { + bot.getApi().sendPhoto(message->chat->id, InputFile::fromFile(photoFilePath, photoMimeType)); + }); + + signal(SIGINT, [](int s) { + printf("SIGINT got"); + sigintGot = true; + }); + try { + printf("Bot username: %s\n", bot.getApi().getMe()->username.c_str()); + + TgLongPoll longPoll(bot); + while (!sigintGot) { + printf("Long poll started\n"); + longPoll.start(); + } + } catch (exception& e) { + printf("error: %s\n", e.what()); + } + + return 0; +} diff --git a/src/tools/FileTools.cpp b/src/tools/FileTools.cpp new file mode 100644 index 0000000..1522a9d --- /dev/null +++ b/src/tools/FileTools.cpp @@ -0,0 +1,25 @@ +// +// Created by Oleg on 25.01.17. +// + +#include "tgbot/tools/FileTools.h" + +#include <fstream> +#include <sstream> + +using namespace std; + +namespace FileTools { + +std::string read(const std::string& filePath) { + ifstream in(filePath, ios::in | ios::binary); + if (in) { + ostringstream contents; + contents << in.rdbuf(); + in.close(); + return contents.str(); + } + throw errno; +} + +}; diff --git a/src/types/InputFile.cpp b/src/types/InputFile.cpp new file mode 100644 index 0000000..0f6cb86 --- /dev/null +++ b/src/types/InputFile.cpp @@ -0,0 +1,24 @@ +// +// Created by Oleg Morozenkov on 25.01.17. +// + +#include "tgbot/types/InputFile.h" + +#include <fstream> + +#include "tgbot/tools/StringTools.h" +#include "tgbot/tools/FileTools.h" + +using namespace std; + +namespace TgBot { + +InputFile::Ptr InputFile::fromFile(const string& filePath, const string& mimeType) { + InputFile::Ptr result(new InputFile); + result->data = FileTools::read(filePath); + result->mimeType = mimeType; + result->fileName = StringTools::split(filePath, '/').back(); + return result; +} + +}; diff --git a/test/tgbot/tools/StringTools.cpp b/test/tgbot/tools/StringTools.cpp index 81e469a..969c3d8 100644 --- a/test/tgbot/tools/StringTools.cpp +++ b/test/tgbot/tools/StringTools.cpp @@ -36,22 +36,23 @@ BOOST_AUTO_TEST_SUITE(tStringTools) BOOST_AUTO_TEST_CASE(startsWith) { BOOST_CHECK(StringTools::startsWith("abc123", "abc")); - BOOST_CHECK(!StringTools::startsWith("abc123", "aac")); - BOOST_CHECK(!StringTools::startsWith("abc123", "Xabc")); - BOOST_CHECK(!StringTools::startsWith("abc123", "abcX")); + BOOST_CHECK(!StringTools::startsWith("abc123", "aac")); + BOOST_CHECK(!StringTools::startsWith("abc123", "Xabc")); + BOOST_CHECK(!StringTools::startsWith("abc123", "abcX")); BOOST_CHECK(!StringTools::startsWith("abc", "abc123")); } BOOST_AUTO_TEST_CASE(endsWith) { BOOST_CHECK(StringTools::endsWith("abc123", "123")); - BOOST_CHECK(!StringTools::endsWith("abc123", "113")); - BOOST_CHECK(!StringTools::endsWith("abc123", "X123")); - BOOST_CHECK(!StringTools::endsWith("abc123", "123X")); + BOOST_CHECK(!StringTools::endsWith("abc123", "113")); + BOOST_CHECK(!StringTools::endsWith("abc123", "X123")); + BOOST_CHECK(!StringTools::endsWith("abc123", "123X")); BOOST_CHECK(!StringTools::endsWith("123", "abc123")); } BOOST_AUTO_TEST_CASE(split) { BOOST_CHECK(StringTools::split("123 456 789", ' ') == vector<string>({"123", "456", "789"})); + BOOST_CHECK(StringTools::split("aaa", ' ') == vector<string>({"aaa"})); } BOOST_AUTO_TEST_CASE(urlEncode) { |