diff --git a/td b/td index e531ae2..93c42f6 160000 --- a/td +++ b/td @@ -1 +1 @@ -Subproject commit e531ae2eb01d5c0ba2a195c8d860a4e53689a729 +Subproject commit 93c42f6d7c1209937431469f80427d48907f1b8d diff --git a/telegram-bot-api/Client.cpp b/telegram-bot-api/Client.cpp index 282ceb5..bfeae7d 100644 --- a/telegram-bot-api/Client.cpp +++ b/telegram-bot-api/Client.cpp @@ -1068,19 +1068,36 @@ class Client::JsonSticker final : public Jsonable { object("is_animated", td::JsonBool(format == td_api::stickerFormatTgs::ID)); object("is_video", td::JsonBool(format == td_api::stickerFormatWebm::ID)); - object("type", Client::get_sticker_type(sticker_->type_)); - - if (sticker_->custom_emoji_id_ != 0) { - object("custom_emoji_id", td::to_string(sticker_->custom_emoji_id_)); + switch (sticker_->full_type_->get_id()) { + case td_api::stickerFullTypeRegular::ID: { + auto full_type = static_cast(sticker_->full_type_.get()); + object("type", Client::get_sticker_type(make_object())); + if (full_type->premium_animation_ != nullptr) { + object("premium_animation", JsonFile(full_type->premium_animation_.get(), client_, false)); + } + break; + } + case td_api::stickerFullTypeMask::ID: { + auto full_type = static_cast(sticker_->full_type_.get()); + object("type", Client::get_sticker_type(make_object())); + if (full_type->mask_position_ != nullptr) { + object("mask_position", JsonMaskPosition(full_type->mask_position_.get())); + } + break; + } + case td_api::stickerFullTypeCustomEmoji::ID: { + auto full_type = static_cast(sticker_->full_type_.get()); + object("type", Client::get_sticker_type(make_object())); + if (full_type->custom_emoji_id_ != 0) { + object("custom_emoji_id", td::to_string(full_type->custom_emoji_id_)); + } + break; + } + default: + UNREACHABLE(); + break; } - const auto &mask_position = sticker_->mask_position_; - if (mask_position != nullptr) { - object("mask_position", JsonMaskPosition(mask_position.get())); - } - if (sticker_->premium_animation_ != nullptr) { - object("premium_animation", JsonFile(sticker_->premium_animation_.get(), client_, false)); - } client_->json_store_thumbnail(object, sticker_->thumbnail_.get()); client_->json_store_file(object, sticker_->sticker_.get()); } @@ -1659,17 +1676,19 @@ class Client::JsonInviteVideoChatParticipants final : public Jsonable { const Client *client_; }; -class Client::JsonChatSetTtl final : public Jsonable { +class Client::JsonChatSetMessageAutoDeleteTime final : public Jsonable { public: - explicit JsonChatSetTtl(const td_api::messageChatSetTtl *chat_set_ttl) : chat_set_ttl_(chat_set_ttl) { + explicit JsonChatSetMessageAutoDeleteTime( + const td_api::messageChatSetMessageAutoDeleteTime *chat_set_message_auto_delete_time) + : chat_set_message_auto_delete_time_(chat_set_message_auto_delete_time) { } void store(JsonValueScope *scope) const { auto object = scope->enter_object(); - object("message_auto_delete_time", chat_set_ttl_->ttl_); + object("message_auto_delete_time", chat_set_message_auto_delete_time_->message_auto_delete_time_); } private: - const td_api::messageChatSetTtl *chat_set_ttl_; + const td_api::messageChatSetMessageAutoDeleteTime *chat_set_message_auto_delete_time_; }; class Client::JsonCallbackGame final : public Jsonable { @@ -2064,9 +2083,9 @@ void Client::JsonMessage::store(JsonValueScope *scope) const { break; case td_api::messageScreenshotTaken::ID: break; - case td_api::messageChatSetTtl::ID: { - auto content = static_cast(message_->content.get()); - object("message_auto_delete_timer_changed", JsonChatSetTtl(content)); + case td_api::messageChatSetMessageAutoDeleteTime::ID: { + auto content = static_cast(message_->content.get()); + object("message_auto_delete_timer_changed", JsonChatSetMessageAutoDeleteTime(content)); break; } case td_api::messageUnsupported::ID: @@ -2139,6 +2158,10 @@ void Client::JsonMessage::store(JsonValueScope *scope) const { } case td_api::messageGiftedPremium::ID: break; + case td_api::messageSuggestProfilePhoto::ID: + break; + case td_api::messageBotWriteAccessAllowed::ID: + break; default: UNREACHABLE(); } @@ -4096,7 +4119,7 @@ void Client::send(PromisedQueryPtr query) { flood_limited_query_count_++; return query->set_retry_after_error(60); } - if (stat->get_active_file_upload_bytes() > (static_cast(1) << 33) && !query->files().empty()) { + if (stat->get_active_file_upload_bytes() > (static_cast(1) << 32) && !query->files().empty()) { LOG(INFO) << "Fail a query, because the total size of active file uploads is too big: " << *query; flood_limited_query_count_++; return query->set_retry_after_error(60); @@ -4910,7 +4933,7 @@ void Client::on_update(object_ptr result) { chat_info->title = std::move(chat->title_); chat_info->photo_info = std::move(chat->photo_); chat_info->permissions = std::move(chat->permissions_); - chat_info->message_auto_delete_time = chat->message_ttl_; + chat_info->message_auto_delete_time = chat->message_auto_delete_time_; chat_info->has_protected_content = chat->has_protected_content_; break; } @@ -4935,11 +4958,11 @@ void Client::on_update(object_ptr result) { chat_info->permissions = std::move(update->permissions_); break; } - case td_api::updateChatMessageTtl::ID: { - auto update = move_object_as(result); + case td_api::updateChatMessageAutoDeleteTime::ID: { + auto update = move_object_as(result); auto chat_info = add_chat(update->chat_id_); CHECK(chat_info->type != ChatInfo::Type::Unknown); - chat_info->message_auto_delete_time = update->message_ttl_; + chat_info->message_auto_delete_time = update->message_auto_delete_time_; break; } case td_api::updateChatHasProtectedContent::ID: { @@ -5493,7 +5516,7 @@ td::Result> Client::get_reply_markup(Jso object_ptr result; if (!rows.empty()) { - result = make_object(std::move(rows), resize, one_time, is_personal, + result = make_object(std::move(rows), false, resize, one_time, is_personal, input_field_placeholder.str()); } else if (!inline_rows.empty()) { result = make_object(std::move(inline_rows)); @@ -6036,7 +6059,7 @@ td::Result> Client::get_inlin if (input_message_content == nullptr) { input_message_content = make_object( - nullptr, nullptr, td::vector(), gif_duration, gif_width, gif_height, std::move(caption)); + nullptr, nullptr, td::vector(), gif_duration, gif_width, gif_height, std::move(caption), false); } return make_object( id, title, thumbnail_url, thumbnail_mime_type, gif_url, "image/gif", gif_duration, gif_width, gif_height, @@ -6077,7 +6100,7 @@ td::Result> Client::get_inlin if (input_message_content == nullptr) { input_message_content = make_object( - nullptr, nullptr, td::vector(), mpeg4_duration, mpeg4_width, mpeg4_height, std::move(caption)); + nullptr, nullptr, td::vector(), mpeg4_duration, mpeg4_width, mpeg4_height, std::move(caption), false); } return make_object( id, title, thumbnail_url, thumbnail_mime_type, mpeg4_url, "video/mp4", mpeg4_duration, mpeg4_width, @@ -6095,8 +6118,8 @@ td::Result> Client::get_inlin } if (input_message_content == nullptr) { - input_message_content = - make_object(nullptr, nullptr, td::vector(), 0, 0, std::move(caption), 0); + input_message_content = make_object(nullptr, nullptr, td::vector(), 0, 0, + std::move(caption), 0, false); } return make_object(id, title, description, thumbnail_url, photo_url, photo_width, photo_height, std::move(reply_markup), @@ -6166,7 +6189,7 @@ td::Result> Client::get_inlin if (input_message_content == nullptr) { input_message_content = make_object(nullptr, nullptr, td::vector(), video_duration, video_width, - video_height, false, std::move(caption), 0); + video_height, false, std::move(caption), 0, false); } return make_object(id, title, description, thumbnail_url, video_url, mime_type, video_width, video_height, video_duration, @@ -6865,8 +6888,8 @@ td::Result> Client::get_input_me TRY_RESULT(parse_mode, get_json_object_string_field(object, "parse_mode")); auto entities = get_json_object_field_force(object, "caption_entities"); TRY_RESULT(caption, get_formatted_text(std::move(input_caption), std::move(parse_mode), std::move(entities))); - // TRY_RESULT(ttl, get_json_object_int_field(object, "ttl")); - int32 ttl = 0; + // TRY_RESULT(self_destruct_time, get_json_object_int_field(object, "self_destruct_time")); + int32 self_destruct_time = 0; TRY_RESULT(media, get_json_object_string_field(object, "media", true)); auto input_file = get_input_file(query, Slice(), media, false); @@ -6884,7 +6907,8 @@ td::Result> Client::get_input_me TRY_RESULT(type, get_json_object_string_field(object, "type", false)); if (type == "photo") { return make_object(std::move(input_file), std::move(input_thumbnail), - td::vector(), 0, 0, std::move(caption), ttl); + td::vector(), 0, 0, std::move(caption), self_destruct_time, + false); } if (type == "video") { TRY_RESULT(width, get_json_object_int_field(object, "width")); @@ -6897,7 +6921,7 @@ td::Result> Client::get_input_me return make_object(std::move(input_file), std::move(input_thumbnail), td::vector(), duration, width, height, supports_streaming, - std::move(caption), ttl); + std::move(caption), self_destruct_time, false); } if (for_album && type == "animation") { return Status::Error(PSLICE() << "type \"" << type << "\" can't be used in sendMediaGroup"); @@ -6910,7 +6934,8 @@ td::Result> Client::get_input_me height = td::clamp(height, 0, MAX_LENGTH); duration = td::clamp(duration, 0, MAX_DURATION); return make_object(std::move(input_file), std::move(input_thumbnail), - td::vector(), duration, width, height, std::move(caption)); + td::vector(), duration, width, height, std::move(caption), + false); } if (type == "audio") { TRY_RESULT(duration, get_json_object_int_field(object, "duration")); @@ -7397,7 +7422,7 @@ td::Status Client::process_send_animation_query(PromisedQueryPtr &query) { TRY_RESULT(caption, get_caption(query.get())); do_send_message( make_object(std::move(animation), std::move(thumbnail), td::vector(), - duration, width, height, std::move(caption)), + duration, width, height, std::move(caption), false), std::move(query)); return Status::OK(); } @@ -7444,9 +7469,9 @@ td::Status Client::process_send_photo_query(PromisedQueryPtr &query) { return Status::Error(400, "There is no photo in the request"); } TRY_RESULT(caption, get_caption(query.get())); - auto ttl = 0; + auto self_destruct_time = 0; do_send_message(make_object(std::move(photo), nullptr, td::vector(), 0, 0, - std::move(caption), ttl), + std::move(caption), self_destruct_time, false), std::move(query)); return Status::OK(); } @@ -7472,11 +7497,11 @@ td::Status Client::process_send_video_query(PromisedQueryPtr &query) { int32 height = get_integer_arg(query.get(), "height", 0, 0, MAX_LENGTH); bool supports_streaming = to_bool(query->arg("supports_streaming")); TRY_RESULT(caption, get_caption(query.get())); - auto ttl = 0; - do_send_message( - make_object(std::move(video), std::move(thumbnail), td::vector(), duration, - width, height, supports_streaming, std::move(caption), ttl), - std::move(query)); + auto self_destruct_time = 0; + do_send_message(make_object(std::move(video), std::move(thumbnail), td::vector(), + duration, width, height, supports_streaming, + std::move(caption), self_destruct_time, false), + std::move(query)); return Status::OK(); } @@ -10250,7 +10275,7 @@ bool Client::need_skip_update_message(int64 chat_id, const object_ptrttl_ > 0 && message->ttl_expires_in_ == message->ttl_) { + if (message->self_destruct_time_ > 0) { return true; } @@ -10319,6 +10344,10 @@ bool Client::need_skip_update_message(int64 chat_id, const object_ptr