Automatically send screenshot notification messages.
This commit is contained in:
parent
44d2b0af1e
commit
29c0004bfd
@ -6309,9 +6309,6 @@ forwardMessages chat_id:int53 message_thread_id:int53 from_chat_id:int53 message
|
||||
//@message_ids Identifiers of the messages to resend. Message identifiers must be in a strictly increasing order
|
||||
resendMessages chat_id:int53 message_ids:vector<int53> = Messages;
|
||||
|
||||
//@description Sends a notification about a screenshot taken in a chat. Supported only in private and secret chats @chat_id Chat identifier
|
||||
sendChatScreenshotTakenNotification chat_id:int53 = Ok;
|
||||
|
||||
//@description Adds a local message to a chat. The message is persistent across application restarts only if the message database is used. Returns the added message
|
||||
//@chat_id Target chat
|
||||
//@sender_id Identifier of the sender of the message
|
||||
|
@ -19878,6 +19878,10 @@ Status MessagesManager::view_messages(DialogId dialog_id, vector<MessageId> mess
|
||||
bool need_invalidate_authentication_code =
|
||||
dialog_id == DialogId(ContactsManager::get_service_notifications_user_id()) &&
|
||||
source == MessageSource::Screenshot;
|
||||
auto dialog_type = dialog_id.get_type();
|
||||
bool need_screenshot_notification = source == MessageSource::Screenshot &&
|
||||
(dialog_type == DialogType::User || dialog_type == DialogType::SecretChat) &&
|
||||
can_send_message(dialog_id).is_ok();
|
||||
|
||||
// keep only valid message identifiers
|
||||
size_t pos = 0;
|
||||
@ -19923,7 +19927,7 @@ Status MessagesManager::view_messages(DialogId dialog_id, vector<MessageId> mess
|
||||
// get information about thread of the messages
|
||||
MessageId top_thread_message_id;
|
||||
if (source == MessageSource::MessageThreadHistory) {
|
||||
if (dialog_id.get_type() != DialogType::Channel || is_broadcast_channel(dialog_id)) {
|
||||
if (dialog_type != DialogType::Channel || is_broadcast_channel(dialog_id)) {
|
||||
return Status::Error(400, "There are no message threads in the chat");
|
||||
}
|
||||
|
||||
@ -20004,6 +20008,7 @@ Status MessagesManager::view_messages(DialogId dialog_id, vector<MessageId> mess
|
||||
vector<MessageId> new_viewed_message_ids;
|
||||
vector<MessageId> viewed_reaction_message_ids;
|
||||
vector<string> authentication_codes;
|
||||
vector<MessageId> screenshotted_secret_message_ids;
|
||||
for (auto message_id : message_ids) {
|
||||
auto *m = get_message_force(d, message_id, "view_messages 4");
|
||||
if (m != nullptr) {
|
||||
@ -20067,6 +20072,11 @@ Status MessagesManager::view_messages(DialogId dialog_id, vector<MessageId> mess
|
||||
if (need_invalidate_authentication_code) {
|
||||
extract_authentication_codes(dialog_id, m, authentication_codes);
|
||||
}
|
||||
if (need_screenshot_notification && !m->is_outgoing) {
|
||||
if ((dialog_type == DialogType::User && m->is_content_secret) || dialog_type == DialogType::SecretChat) {
|
||||
screenshotted_secret_message_ids.push_back(m->message_id);
|
||||
}
|
||||
}
|
||||
} else if (!message_id.is_yet_unsent() && message_id > max_message_id) {
|
||||
if ((d->notification_info != nullptr && message_id <= d->notification_info->max_notification_message_id_) ||
|
||||
message_id <= d->last_new_message_id || message_id <= max_thread_message_id) {
|
||||
@ -20115,6 +20125,9 @@ Status MessagesManager::view_messages(DialogId dialog_id, vector<MessageId> mess
|
||||
if (!authentication_codes.empty()) {
|
||||
invalidate_authentication_codes(td_, std::move(authentication_codes));
|
||||
}
|
||||
if (!screenshotted_secret_message_ids.empty()) {
|
||||
send_screenshot_taken_notification_message(d);
|
||||
}
|
||||
|
||||
if (!need_read) {
|
||||
return Status::OK();
|
||||
@ -28282,39 +28295,25 @@ Result<vector<MessageId>> MessagesManager::resend_messages(DialogId dialog_id, v
|
||||
return result;
|
||||
}
|
||||
|
||||
Status MessagesManager::send_screenshot_taken_notification_message(DialogId dialog_id) {
|
||||
auto dialog_type = dialog_id.get_type();
|
||||
if (dialog_type != DialogType::User && dialog_type != DialogType::SecretChat) {
|
||||
return Status::Error(400, "Notification about taken screenshot can be sent only in private and secret chats");
|
||||
}
|
||||
|
||||
LOG(INFO) << "Begin to send notification about taken screenshot in " << dialog_id;
|
||||
|
||||
Dialog *d = get_dialog_force(dialog_id, "send_screenshot_taken_notification_message");
|
||||
if (d == nullptr) {
|
||||
return Status::Error(400, "Chat not found");
|
||||
}
|
||||
|
||||
TRY_STATUS(can_send_message(dialog_id));
|
||||
|
||||
void MessagesManager::send_screenshot_taken_notification_message(Dialog *d) {
|
||||
LOG(INFO) << "Begin to send notification about taken screenshot in " << d->dialog_id;
|
||||
auto dialog_type = d->dialog_id.get_type();
|
||||
if (dialog_type == DialogType::User) {
|
||||
bool need_update_dialog_pos = false;
|
||||
const Message *m = get_message_to_send(d, MessageId(), MessageId(), MessageSendOptions(),
|
||||
create_screenshot_taken_message_content(), &need_update_dialog_pos);
|
||||
|
||||
do_send_screenshot_taken_notification_message(dialog_id, m, 0);
|
||||
do_send_screenshot_taken_notification_message(d->dialog_id, m, 0);
|
||||
|
||||
send_update_new_message(d, m);
|
||||
if (need_update_dialog_pos) {
|
||||
send_update_chat_last_message(d, "send_screenshot_taken_notification_message");
|
||||
}
|
||||
} else {
|
||||
CHECK(dialog_type == DialogType::SecretChat);
|
||||
send_closure(td_->secret_chats_manager_, &SecretChatsManager::notify_screenshot_taken,
|
||||
dialog_id.get_secret_chat_id(),
|
||||
Promise<Unit>()); // TODO Promise
|
||||
d->dialog_id.get_secret_chat_id(), Promise<Unit>());
|
||||
}
|
||||
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
class MessagesManager::SendScreenshotTakenNotificationMessageLogEvent {
|
||||
|
@ -475,8 +475,6 @@ class MessagesManager final : public Actor {
|
||||
|
||||
void set_dialog_message_ttl(DialogId dialog_id, int32 ttl, Promise<Unit> &&promise);
|
||||
|
||||
Status send_screenshot_taken_notification_message(DialogId dialog_id);
|
||||
|
||||
void share_dialog_with_bot(FullMessageId full_message_id, int32 button_id, DialogId shared_dialog_id,
|
||||
bool expect_user, bool only_check, Promise<Unit> &&promise);
|
||||
|
||||
@ -1962,6 +1960,8 @@ class MessagesManager final : public Actor {
|
||||
void do_send_inline_query_result_message(DialogId dialog_id, MessageId message_id, int64 query_id,
|
||||
const string &result_id);
|
||||
|
||||
void send_screenshot_taken_notification_message(Dialog *d);
|
||||
|
||||
static uint64 save_send_screenshot_taken_notification_message_log_event(DialogId dialog_id, const Message *m);
|
||||
|
||||
void do_send_screenshot_taken_notification_message(DialogId dialog_id, const Message *m, uint64 log_event_id);
|
||||
|
@ -5673,11 +5673,6 @@ void Td::on_request(uint64 id, td_api::sendChatAction &request) {
|
||||
DialogAction(std::move(request.action_)), std::move(promise));
|
||||
}
|
||||
|
||||
void Td::on_request(uint64 id, td_api::sendChatScreenshotTakenNotification &request) {
|
||||
CHECK_IS_USER();
|
||||
answer_ok_query(id, messages_manager_->send_screenshot_taken_notification_message(DialogId(request.chat_id_)));
|
||||
}
|
||||
|
||||
void Td::on_request(uint64 id, td_api::forwardMessages &request) {
|
||||
auto input_message_ids = MessageId::get_message_ids(request.message_ids_);
|
||||
auto message_copy_options =
|
||||
|
@ -812,8 +812,6 @@ class Td final : public Actor {
|
||||
|
||||
void on_request(uint64 id, td_api::sendChatAction &request);
|
||||
|
||||
void on_request(uint64 id, td_api::sendChatScreenshotTakenNotification &request);
|
||||
|
||||
void on_request(uint64 id, td_api::forwardMessages &request);
|
||||
|
||||
void on_request(uint64 id, const td_api::resendMessages &request);
|
||||
|
@ -3413,10 +3413,6 @@ class CliClient final : public Actor {
|
||||
UserId user_id;
|
||||
get_args(args, user_id);
|
||||
send_request(td_api::make_object<td_api::createNewSecretChat>(user_id));
|
||||
} else if (op == "scstn") {
|
||||
ChatId chat_id;
|
||||
get_args(args, chat_id);
|
||||
send_request(td_api::make_object<td_api::sendChatScreenshotTakenNotification>(chat_id));
|
||||
} else if (op == "closeSC" || op == "cancelSC") {
|
||||
send_request(td_api::make_object<td_api::closeSecretChat>(as_secret_chat_id(args)));
|
||||
} else {
|
||||
|
Loading…
Reference in New Issue
Block a user