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 timeout timeout in seconds for long polling
/// \return Updates (vector of Update)
/// \todo allowed_updates
Updates getUpdates(int offset = 0, unsigned short limit = 0, unsigned timeout = 0);
private:

View file

@ -14,7 +14,6 @@ public:
enum class Type
{
Message,
EditedMessage,
InlineQuery,
ChosenInlineResult,
CallbackQuery
@ -41,34 +40,30 @@ using Updates = std::vector<UpdatePtr>;
class MessageUpdate : public Update
{
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(MessageUpdate&&);
~MessageUpdate();
MessageType getMessageType() const;
const Message& getMessage() const;
void swap(MessageUpdate& other) noexcept;
const MessageUpdate& operator=(MessageUpdate other);
private:
MessageType type_;
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

View file

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

View file

@ -31,9 +31,8 @@ void Update::swap(Update& other) noexcept
////////////////////////////////////////////////////////////////
MessageUpdate::MessageUpdate(int id, const Message& message)
: Update(id, Type::Message),
message_(message)
MessageUpdate::MessageUpdate(int id, MessageType type, const Message& message)
: Update(id, Type::Message), type_(type), message_(message)
{
}
@ -41,6 +40,11 @@ MessageUpdate::MessageUpdate(const MessageUpdate&) = default;
MessageUpdate::MessageUpdate(MessageUpdate&&) = default;
MessageUpdate::~MessageUpdate() = default;
MessageUpdate::MessageType MessageUpdate::getMessageType() const
{
return type_;
}
const Message& MessageUpdate::getMessage() const
{
return message_;
@ -59,26 +63,4 @@ const MessageUpdate& MessageUpdate::operator=(MessageUpdate other)
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());
for (auto update : updates)
{
if (update->getType() == Update::Type::Message)
switch (update->getType())
{
auto& message = std::dynamic_pointer_cast<MessageUpdate>(update)->getMessage();
if (message.getFrom())
std::cout << *message.getFrom() << ": ";
std::cout << message.getText() << std::endl;
case Update::Type::Message:
{
auto& message = std::dynamic_pointer_cast<MessageUpdate>(update)->getMessage();
if (message.getFrom())
std::cout << *message.getFrom() << ": ";
std::cout << message.getText() << std::endl;
break;
}
}
}
}