Move checks for Game message content in dup_message_content.

GitOrigin-RevId: e9d5ad1216c5178b4990b4f17bc5c808cd70cb6f
This commit is contained in:
levlam 2020-01-15 02:44:24 +03:00
parent ebaea15679
commit 7ffd9ad7c9
4 changed files with 26 additions and 32 deletions

View File

@ -4091,15 +4091,22 @@ unique_ptr<MessageContent> dup_message_content(Td *td, DialogId dialog_id, const
CHECK(result->file_id.is_valid());
return std::move(result);
}
case MessageContentType::Game:
return make_unique<MessageGame>(*static_cast<const MessageGame *>(content));
case MessageContentType::Game: {
auto result = make_unique<MessageGame>(*static_cast<const MessageGame *>(content));
if (type != MessageContentDupType::Forward && type != MessageContentDupType::SendViaBot &&
!result->game.get_bot_user_id().is_valid()) {
LOG(INFO) << "Can't send/copy game without bot_user_id";
return nullptr;
}
return std::move(result);
}
case MessageContentType::Invoice:
return make_unique<MessageInvoice>(*static_cast<const MessageInvoice *>(content));
case MessageContentType::LiveLocation:
if (to_secret || type != MessageContentDupType::Send) {
return make_unique<MessageLocation>(Location(static_cast<const MessageLiveLocation *>(content)->location));
} else {
if (!to_secret && (type == MessageContentDupType::Send || type == MessageContentDupType::SendViaBot)) {
return make_unique<MessageLiveLocation>(*static_cast<const MessageLiveLocation *>(content));
} else {
return make_unique<MessageLocation>(Location(static_cast<const MessageLiveLocation *>(content)->location));
}
case MessageContentType::Location:
return make_unique<MessageLocation>(*static_cast<const MessageLocation *>(content));
@ -5088,6 +5095,7 @@ void add_message_content_dependencies(Dependencies &dependencies, const MessageC
case MessageContentType::PassportDataReceived:
break;
case MessageContentType::Poll:
// no need to add poll dependencies, because they are forcely loaded with the poll
break;
default:
UNREACHABLE();

View File

@ -178,10 +178,10 @@ vector<UserId> get_message_content_added_user_ids(const MessageContent *content)
UserId get_message_content_deleted_user_id(const MessageContent *content);
UserId get_message_content_game_bot_user_id(const MessageContent *content);
int32 get_message_content_live_location_period(const MessageContent *content);
UserId get_message_content_game_bot_user_id(const MessageContent *content);
bool get_message_content_poll_is_closed(const Td *td, const MessageContent *content);
bool get_message_content_poll_is_anonymous(const Td *td, const MessageContent *content);
@ -221,7 +221,7 @@ unique_ptr<MessageContent> get_message_content(Td *td, FormattedText message_tex
DialogId owner_dialog_id, bool is_content_read, UserId via_bot_user_id,
int32 *ttl);
enum class MessageContentDupType : int32 { Send, Forward, Copy, CopyWithoutCaption };
enum class MessageContentDupType : int32 { Send, SendViaBot, Forward, Copy, CopyWithoutCaption };
unique_ptr<MessageContent> dup_message_content(Td *td, DialogId dialog_id, const MessageContent *content,
MessageContentDupType type);

View File

@ -17767,8 +17767,8 @@ Status MessagesManager::can_send_message(DialogId dialog_id) const {
return Status::OK();
}
Status MessagesManager::can_send_message_content(DialogId dialog_id, const MessageContent *content, bool is_forward,
bool is_via_bot) const {
Status MessagesManager::can_send_message_content(DialogId dialog_id, const MessageContent *content,
bool is_forward) const {
auto dialog_type = dialog_id.get_type();
int32 secret_chat_layer = std::numeric_limits<int32>::max();
if (dialog_type == DialogType::SecretChat) {
@ -17786,7 +17786,7 @@ Status MessagesManager::can_send_message_content(DialogId dialog_id, const Messa
auto content_type = content->get_type();
switch (dialog_type) {
case DialogType::User:
if (content_type == MessageContentType::Poll && !is_forward && !td_->auth_manager_->is_bot() && !is_via_bot &&
if (content_type == MessageContentType::Poll && !is_forward && !td_->auth_manager_->is_bot() &&
!td_->contacts_manager_->is_user_bot(dialog_id.get_user_id()) && dialog_id != get_my_dialog_id()) {
return Status::Error(400, "Polls can't be sent to the private chat");
}
@ -17846,9 +17846,6 @@ Status MessagesManager::can_send_message_content(DialogId dialog_id, const Messa
if (!can_send_games) {
return Status::Error(400, "Not enough rights to send games to the chat");
}
if (!is_forward && !is_via_bot && !get_message_content_game_bot_user_id(content).is_valid()) {
return Status::Error(400, "Games can't be copied");
}
break;
case MessageContentType::Invoice:
if (!is_forward) {
@ -19168,12 +19165,12 @@ Result<MessageId> MessagesManager::send_inline_query_result_message(DialogId dia
}
TRY_STATUS(can_use_send_message_options(send_message_options, content->message_content, 0));
TRY_STATUS(can_send_message_content(dialog_id, content->message_content.get(), false, true));
TRY_STATUS(can_send_message_content(dialog_id, content->message_content.get(), false));
bool need_update_dialog_pos = false;
Message *m = get_message_to_send(
d, get_reply_to_message_id(d, reply_to_message_id), send_message_options,
dup_message_content(td_, dialog_id, content->message_content.get(), MessageContentDupType::Send),
dup_message_content(td_, dialog_id, content->message_content.get(), MessageContentDupType::SendViaBot),
&need_update_dialog_pos, nullptr, true);
m->hide_via_bot = hide_via_bot;
if (!hide_via_bot) {
@ -20678,17 +20675,13 @@ Result<vector<MessageId>> MessagesManager::forward_messages(DialogId to_dialog_i
continue;
}
auto content_type = content->get_type();
bool is_game = content_type == MessageContentType::Game;
if (need_copy) {
if (is_game && !get_message_content_game_bot_user_id(content.get()).is_valid()) {
LOG(INFO) << "Can't copy game from " << message_id;
continue;
}
copied_messages.push_back({std::move(content), forwarded_message->disable_web_page_preview, i});
continue;
}
auto content_type = content->get_type();
bool is_game = content_type == MessageContentType::Game;
unique_ptr<MessageForwardInfo> forward_info;
if (!is_game && content_type != MessageContentType::Audio) {
DialogId saved_from_dialog_id;
@ -20903,13 +20896,6 @@ Result<vector<MessageId>> MessagesManager::resend_messages(DialogId dialog_id, v
continue;
}
if (content->get_type() == MessageContentType::Game &&
!get_message_content_game_bot_user_id(content.get()).is_valid()) {
// must not happen
LOG(ERROR) << "Can't resend game from " << m->message_id;
continue;
}
new_contents[i] = std::move(content);
if (m->media_album_id != 0) {
@ -29337,7 +29323,7 @@ void MessagesManager::on_binlog_events(vector<BinlogEvent> &&events) {
add_message_dependencies(dependencies, dialog_id, m.get());
resolve_dependencies_force(dependencies);
m->content = dup_message_content(td_, dialog_id, m->content.get(), MessageContentDupType::Send);
m->content = dup_message_content(td_, dialog_id, m->content.get(), MessageContentDupType::SendViaBot);
auto result_message = continue_send_message(dialog_id, std::move(m), event.id_);
if (result_message != nullptr) {

View File

@ -1530,8 +1530,8 @@ class MessagesManager : public Actor {
Status can_send_message(DialogId dialog_id) const TD_WARN_UNUSED_RESULT;
Status can_send_message_content(DialogId dialog_id, const MessageContent *content, bool is_forward,
bool is_via_bot = false) const TD_WARN_UNUSED_RESULT;
Status can_send_message_content(DialogId dialog_id, const MessageContent *content,
bool is_forward) const TD_WARN_UNUSED_RESULT;
static bool can_resend_message(const Message *m);