Add td_api::getChatMessageCount method.

GitOrigin-RevId: f2257074e276e12084b43a63db17f852fb5f500e
This commit is contained in:
levlam 2018-07-19 16:58:09 +03:00
parent 8ab079be89
commit 460675316c
7 changed files with 116 additions and 3 deletions

View File

@ -2486,6 +2486,9 @@ getActiveLiveLocationMessages = Messages;
//@description Returns the last message sent in a chat no later than the specified date @chat_id Chat identifier @date Point in time (Unix timestamp) relative to which to search for messages
getChatMessageByDate chat_id:int53 date:int32 = Message;
//@description Returns approximate number of messages of the specified type in the chat @chat_id Identifier of the chat in which to count messages @filter Filter for message content; searchMessagesFilterEmpty is unsupported in this function @return_local If true, returns count that is available locally without sending network requests, returning -1 if the number of messages is unknown
getChatMessageCount chat_id:int53 filter:SearchMessagesFilter return_local:Bool = Count;
//@description Returns a public HTTPS link to a message. Available only for messages in public supergroups and channels
//@chat_id Identifier of the chat to which the message belongs

Binary file not shown.

View File

@ -15000,6 +15000,68 @@ tl_object_ptr<td_api::message> MessagesManager::get_dialog_message_by_date_objec
return get_message_object(full_message_id);
}
int32 MessagesManager::get_dialog_message_count(DialogId dialog_id,
const tl_object_ptr<td_api::SearchMessagesFilter> &filter,
bool return_local, int64 &random_id, Promise<Unit> &&promise) {
if (random_id != 0) {
// request has already been sent before
auto it = found_dialog_messages_.find(random_id);
CHECK(it != found_dialog_messages_.end());
auto result = std::move(it->second);
found_dialog_messages_.erase(it);
promise.set_value(Unit());
return result.first;
}
LOG(INFO) << "Get " << (return_local ? "local " : "") << "number of messages in " << dialog_id << " filtered by "
<< to_string(filter);
const Dialog *d = get_dialog_force(dialog_id);
if (d == nullptr) {
promise.set_error(Status::Error(6, "Chat not found"));
return -1;
}
auto filter_type = get_search_messages_filter(filter);
if (filter_type == SearchMessagesFilter::Empty) {
promise.set_error(Status::Error(6, "SearchMessagesFilterEmpty is not supported"));
return -1;
}
auto dialog_type = dialog_id.get_type();
int32 message_count = d->message_count_by_index[search_messages_filter_index(filter_type)];
if (message_count == -1) {
if (filter_type == SearchMessagesFilter::UnreadMention) {
message_count = d->unread_mention_count;
}
}
if (message_count != -1 || return_local || dialog_type == DialogType::SecretChat) {
promise.set_value(Unit());
return message_count;
}
LOG(INFO) << "Get number of messages in " << dialog_id << " filtered by " << to_string(filter) << " from the server";
do {
random_id = Random::secure_int64();
} while (random_id == 0 || found_dialog_messages_.find(random_id) != found_dialog_messages_.end());
found_dialog_messages_[random_id]; // reserve place for result
switch (dialog_id.get_type()) {
case DialogType::User:
case DialogType::Chat:
case DialogType::Channel:
td_->create_handler<SearchMessagesQuery>(std::move(promise))
->send(dialog_id, "", UserId(), nullptr, MessageId(), 0, 1, filter_type, random_id);
break;
case DialogType::None:
case DialogType::SecretChat:
default:
UNREACHABLE();
}
return -1;
}
void MessagesManager::preload_newer_messages(const Dialog *d, MessageId max_message_id) {
if (td_->auth_manager_->is_bot()) {
return;

View File

@ -1324,6 +1324,9 @@ class MessagesManager : public Actor {
void on_get_dialog_message_by_date_fail(int64 random_id);
int32 get_dialog_message_count(DialogId dialog_id, const tl_object_ptr<td_api::SearchMessagesFilter> &filter,
bool return_local, int64 &random_id, Promise<Unit> &&promise);
tl_object_ptr<td_api::message> get_dialog_message_by_date_object(int64 random_id);
tl_object_ptr<td_api::message> get_message_object(FullMessageId full_message_id);

View File

@ -1619,6 +1619,34 @@ class GetChatMessageByDateRequest : public RequestOnceActor {
}
};
class GetChatMessageCountRequest : public RequestActor<> {
DialogId dialog_id_;
tl_object_ptr<td_api::SearchMessagesFilter> filter_;
bool return_local_;
int64 random_id_;
int32 result_ = 0;
void do_run(Promise<Unit> &&promise) override {
result_ = td->messages_manager_->get_dialog_message_count(dialog_id_, filter_, return_local_, random_id_,
std::move(promise));
}
void do_send_result() override {
send_result(td_api::make_object<td_api::count>(result_));
}
public:
GetChatMessageCountRequest(ActorShared<Td> td, uint64 request_id, int64 dialog_id,
tl_object_ptr<td_api::SearchMessagesFilter> filter, bool return_local)
: RequestActor(std::move(td), request_id)
, dialog_id_(dialog_id)
, filter_(std::move(filter))
, return_local_(return_local)
, random_id_(0) {
}
};
class GetWebPagePreviewRequest : public RequestOnceActor {
td_api::object_ptr<td_api::formattedText> text_;
@ -5028,6 +5056,11 @@ void Td::on_request(uint64 id, const td_api::getChatMessageByDate &request) {
CREATE_REQUEST(GetChatMessageByDateRequest, request.chat_id_, request.date_);
}
void Td::on_request(uint64 id, td_api::getChatMessageCount &request) {
CHECK_IS_USER();
CREATE_REQUEST(GetChatMessageCountRequest, request.chat_id_, std::move(request.filter_), request.return_local_);
}
void Td::on_request(uint64 id, const td_api::deleteMessages &request) {
CREATE_OK_REQUEST_PROMISE();
messages_manager_->delete_messages(DialogId(request.chat_id_), MessagesManager::get_message_ids(request.message_ids_),

View File

@ -487,6 +487,8 @@ class Td final : public NetQueryCallback {
void on_request(uint64 id, const td_api::getChatMessageByDate &request);
void on_request(uint64 id, td_api::getChatMessageCount &request);
void on_request(uint64 id, const td_api::deleteMessages &request);
void on_request(uint64 id, const td_api::deleteChatMessagesFromUser &request);

View File

@ -890,7 +890,7 @@ class CliClient final : public Actor {
if (filter == "vo" || filter == "voice") {
return make_tl_object<td_api::searchMessagesFilterVoiceNote>();
}
if (filter == "pvo") {
if (filter == "pvi") {
return make_tl_object<td_api::searchMessagesFilterPhotoAndVideo>();
}
if (filter == "u" || filter == "url") {
@ -899,10 +899,10 @@ class CliClient final : public Actor {
if (filter == "cp" || filter == "chatphoto") {
return make_tl_object<td_api::searchMessagesFilterChatPhoto>();
}
if (filter == "vc" || filter == "call") {
if (filter == "c" || filter == "call") {
return make_tl_object<td_api::searchMessagesFilterCall>();
}
if (filter == "mvc" || filter == "missedcall") {
if (filter == "mc" || filter == "missedcall") {
return make_tl_object<td_api::searchMessagesFilterMissedCall>();
}
if (filter == "vn" || filter == "videonote") {
@ -1673,6 +1673,16 @@ class CliClient final : public Actor {
send_request(make_tl_object<td_api::searchChatMessages>(
as_chat_id(chat_id), query, 0, as_message_id(offset_message_id), 0, to_integer<int32>(limit),
make_tl_object<td_api::searchMessagesFilterChatPhoto>()));
} else if (op == "gcmc") {
string chat_id;
string filter;
string return_local;
std::tie(chat_id, args) = split(args);
std::tie(filter, return_local) = split(args);
send_request(make_tl_object<td_api::getChatMessageCount>(as_chat_id(chat_id), get_search_messages_filter(filter),
as_bool(return_local)));
} else if (op == "gup" || op == "GetUserPhotos") {
string user_id;
string offset;