Changed Updates hierarchy.

ChannelPost and EditedChannelPost now supported.
This commit is contained in:
Kirill Kirilenko 2017-02-16 21:48:22 +03:00
parent 014411a8a3
commit 79ea1a08a1
5 changed files with 39 additions and 55 deletions

View file

@ -81,6 +81,7 @@ public:
/// \param limit maximum number of updates to be retrieved /// \param limit maximum number of updates to be retrieved
/// \param timeout timeout in seconds for long polling /// \param timeout timeout in seconds for long polling
/// \return Updates (vector of Update) /// \return Updates (vector of Update)
/// \todo allowed_updates
Updates getUpdates(int offset = 0, unsigned short limit = 0, unsigned timeout = 0); Updates getUpdates(int offset = 0, unsigned short limit = 0, unsigned timeout = 0);
private: private:

View file

@ -14,7 +14,6 @@ public:
enum class Type enum class Type
{ {
Message, Message,
EditedMessage,
InlineQuery, InlineQuery,
ChosenInlineResult, ChosenInlineResult,
CallbackQuery CallbackQuery
@ -41,34 +40,30 @@ using Updates = std::vector<UpdatePtr>;
class MessageUpdate : public Update class MessageUpdate : public Update
{ {
public: public:
MessageUpdate(int id, const Message& message); enum class MessageType
{
Message,
EditedMessage,
ChannelPost,
EditedChannelPost
};
MessageUpdate(int id, MessageType type, const Message& message);
MessageUpdate(const MessageUpdate&); MessageUpdate(const MessageUpdate&);
MessageUpdate(MessageUpdate&&); MessageUpdate(MessageUpdate&&);
~MessageUpdate(); ~MessageUpdate();
MessageType getMessageType() const;
const Message& getMessage() const; const Message& getMessage() const;
void swap(MessageUpdate& other) noexcept; void swap(MessageUpdate& other) noexcept;
const MessageUpdate& operator=(MessageUpdate other); const MessageUpdate& operator=(MessageUpdate other);
private: private:
MessageType type_;
Message message_; Message message_;
}; };
class EditedMessageUpdate : public MessageUpdate
{
public:
EditedMessageUpdate(int id, const Message& message);
EditedMessageUpdate(const EditedMessageUpdate&);
EditedMessageUpdate(EditedMessageUpdate&&);
~EditedMessageUpdate();
void swap(EditedMessageUpdate& other) noexcept;
const EditedMessageUpdate& operator=(EditedMessageUpdate other);
};
} }
#endif // TELEBOTXX_UPDATE_HPP #endif // TELEBOTXX_UPDATE_HPP

View file

@ -249,18 +249,23 @@ std::unique_ptr<Chat> parseChat(const rapidjson::Value& parent, const char* name
return nullptr; return nullptr;
} }
/// \todo Other updates
std::unique_ptr<Update> parseUpdate(const rapidjson::Value& obj) std::unique_ptr<Update> parseUpdate(const rapidjson::Value& obj)
{ {
int id = parse<int>(obj, "update_id", REQUIRED); int id = parse<int>(obj, "update_id", REQUIRED);
std::unique_ptr<Message> message; std::unique_ptr<Message> message;
if ((message = parseMessage(obj, "message", OPTIONAL))) if ((message = parseMessage(obj, "message", OPTIONAL)))
return std::make_unique<MessageUpdate>(id, *message); return std::make_unique<MessageUpdate>(id, MessageUpdate::MessageType::Message, *message);
else if ((message = parseMessage(obj, "edited_message", OPTIONAL))) else if ((message = parseMessage(obj, "edited_message", OPTIONAL)))
return std::make_unique<EditedMessageUpdate>(id, *message); return std::make_unique<MessageUpdate>(id, MessageUpdate::MessageType::EditedMessage, *message);
/// \todo: other updates else if ((message = parseMessage(obj, "channel_post", OPTIONAL)))
return std::make_unique<MessageUpdate>(id, MessageUpdate::MessageType::ChannelPost, *message);
else if ((message = parseMessage(obj, "edited_channel_post", OPTIONAL)))
return std::make_unique<MessageUpdate>(id, MessageUpdate::MessageType::EditedChannelPost, *message);
else else
throw ParseError("Unknown update type"); ///throw ParseError("Unknown update type");
return nullptr;
} }
std::unique_ptr<Updates> parseUpdates(const rapidjson::Value& parent, const char* name, bool required) std::unique_ptr<Updates> parseUpdates(const rapidjson::Value& parent, const char* name, bool required)
@ -269,12 +274,9 @@ std::unique_ptr<Updates> parseUpdates(const rapidjson::Value& parent, const char
auto& obj = parseArray(parent, name, required, found); auto& obj = parseArray(parent, name, required, found);
if (found) if (found)
{ {
std::vector<UpdatePtr> updates; Updates updates;
for (auto& elem : obj.GetArray()) for (auto& elem : obj.GetArray())
{ updates.emplace_back(parseUpdate(elem));
auto update = parseUpdate(elem);
updates.emplace_back(std::move(update));
}
return std::make_unique<Updates>(std::move(updates)); return std::make_unique<Updates>(std::move(updates));
} }
else else

View file

@ -31,9 +31,8 @@ void Update::swap(Update& other) noexcept
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
MessageUpdate::MessageUpdate(int id, const Message& message) MessageUpdate::MessageUpdate(int id, MessageType type, const Message& message)
: Update(id, Type::Message), : Update(id, Type::Message), type_(type), message_(message)
message_(message)
{ {
} }
@ -41,6 +40,11 @@ MessageUpdate::MessageUpdate(const MessageUpdate&) = default;
MessageUpdate::MessageUpdate(MessageUpdate&&) = default; MessageUpdate::MessageUpdate(MessageUpdate&&) = default;
MessageUpdate::~MessageUpdate() = default; MessageUpdate::~MessageUpdate() = default;
MessageUpdate::MessageType MessageUpdate::getMessageType() const
{
return type_;
}
const Message& MessageUpdate::getMessage() const const Message& MessageUpdate::getMessage() const
{ {
return message_; return message_;
@ -59,26 +63,4 @@ const MessageUpdate& MessageUpdate::operator=(MessageUpdate other)
return *this; return *this;
} }
////////////////////////////////////////////////////////////////
EditedMessageUpdate::EditedMessageUpdate(int id, const Message& message)
: MessageUpdate(id, message)
{
}
EditedMessageUpdate::EditedMessageUpdate(const EditedMessageUpdate&) = default;
EditedMessageUpdate::EditedMessageUpdate(EditedMessageUpdate&&) = default;
EditedMessageUpdate::~EditedMessageUpdate() = default;
void EditedMessageUpdate::swap(EditedMessageUpdate& other) noexcept
{
MessageUpdate::swap(other);
}
const EditedMessageUpdate& EditedMessageUpdate::operator=(EditedMessageUpdate other)
{
swap(other);
return *this;
}
} }

View file

@ -206,12 +206,16 @@ BOOST_AUTO_TEST_SUITE(TestBotApi)
BOOST_REQUIRE_NO_THROW(updates = bot->getUpdates()); BOOST_REQUIRE_NO_THROW(updates = bot->getUpdates());
for (auto update : updates) for (auto update : updates)
{ {
if (update->getType() == Update::Type::Message) switch (update->getType())
{
case Update::Type::Message:
{ {
auto& message = std::dynamic_pointer_cast<MessageUpdate>(update)->getMessage(); auto& message = std::dynamic_pointer_cast<MessageUpdate>(update)->getMessage();
if (message.getFrom()) if (message.getFrom())
std::cout << *message.getFrom() << ": "; std::cout << *message.getFrom() << ": ";
std::cout << message.getText() << std::endl; std::cout << message.getText() << std::endl;
break;
}
} }
} }
} }