Support reading message history from pushes.

GitOrigin-RevId: 280eff17eec93b688eff6d5d3bad388670820728
This commit is contained in:
levlam 2019-03-25 19:01:33 +03:00
parent afa4871028
commit 97d3485753
2 changed files with 56 additions and 18 deletions

View File

@ -312,6 +312,8 @@ class MessagesManager : public Actor {
void on_user_dialog_action(DialogId dialog_id, UserId user_id, tl_object_ptr<td_api::ChatAction> &&action, int32 date,
MessageContentType message_content_type = MessageContentType::None);
void read_history_inbox(DialogId dialog_id, MessageId max_message_id, int32 unread_count, const char *source);
void delete_messages(DialogId dialog_id, const vector<MessageId> &message_ids, bool revoke, Promise<Unit> &&promise);
void delete_dialog_history(DialogId dialog_id, bool remove_from_dialog_list, Promise<Unit> &&promise);
@ -1450,8 +1452,6 @@ class MessagesManager : public Actor {
void repair_channel_server_unread_count(Dialog *d);
void read_history_inbox(DialogId dialog_id, MessageId max_message_id, int32 unread_count, const char *source);
void read_history_outbox(DialogId dialog_id, MessageId max_message_id, int32 read_date = -1);
void read_history_on_server(Dialog *d, MessageId max_message_id);

View File

@ -2294,7 +2294,6 @@ Status NotificationManager::process_push_notification_payload(string payload) {
string loc_key;
JsonObject custom;
string announcement_message_text;
int32 badge = 0;
vector<string> loc_args;
for (auto &field_value : json_value.get_object()) {
if (field_value.first == "loc_key") {
@ -2318,18 +2317,6 @@ Status NotificationManager::process_push_notification_payload(string payload) {
return Status::Error("Expected custom as an Object");
}
custom = std::move(field_value.second.get_object());
} else if (field_value.first == "badge") {
if (field_value.second.type() == JsonValue::Type::String) {
TRY_RESULT(badge_value, to_integer_safe<int32>(field_value.second.get_string()));
badge = badge_value;
continue;
}
if (field_value.second.type() == JsonValue::Type::Number) {
TRY_RESULT(badge_value, to_integer_safe<int32>(field_value.second.get_number()));
badge = badge_value;
continue;
}
return Status::Error("Expected badge as a Number");
} else if (field_value.first == "message") {
if (field_value.second.type() != JsonValue::Type::String) {
return Status::Error("Expected announcement message text as a String");
@ -2337,9 +2324,6 @@ Status NotificationManager::process_push_notification_payload(string payload) {
announcement_message_text = field_value.second.get_string().str();
}
}
if (badge < 0) {
return Status::Error("Expected badge to be non-negative");
}
if (!clean_input_string(loc_key)) {
return Status::Error(PSLICE() << "Receive invalid loc_key " << format::escaped(loc_key));
}
@ -2382,6 +2366,60 @@ Status NotificationManager::process_push_notification_payload(string payload) {
return Status::OK();
}
DialogId dialog_id;
if (has_json_object_field(custom, "from_id")) {
TRY_RESULT(user_id_int, get_json_object_int_field(custom, "from_id"));
UserId user_id(user_id_int);
if (!user_id.is_valid()) {
return Status::Error("Receive invalid user_id");
}
dialog_id = DialogId(user_id);
}
if (has_json_object_field(custom, "chat_id")) {
TRY_RESULT(chat_id_int, get_json_object_int_field(custom, "chat_id"));
ChatId chat_id(chat_id_int);
if (!chat_id.is_valid()) {
return Status::Error("Receive invalid chat_id");
}
dialog_id = DialogId(chat_id);
}
if (has_json_object_field(custom, "channel_id")) {
TRY_RESULT(channel_id_int, get_json_object_int_field(custom, "channel_id"));
ChannelId channel_id(channel_id_int);
if (!channel_id.is_valid()) {
return Status::Error("Receive invalid channel_id");
}
dialog_id = DialogId(channel_id);
}
if (has_json_object_field(custom, "encryption_id")) {
TRY_RESULT(secret_chat_id_int, get_json_object_int_field(custom, "encryption_id"));
SecretChatId secret_chat_id(secret_chat_id_int);
if (!secret_chat_id.is_valid()) {
return Status::Error("Receive invalid secret_chat_id");
}
dialog_id = DialogId(secret_chat_id);
}
if (!dialog_id.is_valid()) {
// TODO if (loc_key == "ENCRYPTED_MESSAGE") ?
return Status::Error("Can't find dialog_id");
}
if (loc_key.empty()) {
if (dialog_id.get_type() == DialogType::SecretChat) {
return Status::Error("Receive read history in a secret chat");
}
TRY_RESULT(max_id, get_json_object_int_field(custom, "max_id"));
ServerMessageId max_server_message_id(max_id);
if (!max_server_message_id.is_valid()) {
return Status::Error("Receive invalid max_id");
}
send_closure(G()->messages_manager(), &MessagesManager::read_history_inbox, dialog_id,
MessageId(max_server_message_id), -1, "process_push_notification_payload");
return Status::OK();
}
return Status::OK();
}