Add getChatMessagePosition.
This commit is contained in:
parent
481a69676d
commit
1f7258f697
@ -4995,6 +4995,12 @@ getChatMessageCalendar chat_id:int53 filter:SearchMessagesFilter from_message_id
|
|||||||
//@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 Pass true to get the number of messages without sending network requests, or -1 if the number of messages is unknown locally
|
//@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 Pass true to get the number of messages without sending network requests, or -1 if the number of messages is unknown locally
|
||||||
getChatMessageCount chat_id:int53 filter:SearchMessagesFilter return_local:Bool = Count;
|
getChatMessageCount chat_id:int53 filter:SearchMessagesFilter return_local:Bool = Count;
|
||||||
|
|
||||||
|
//@description Returns approximate 1-based position of a message among messages, which can be found by the specified filter in the chat. Cannot be used in secret chats
|
||||||
|
//@chat_id Identifier of the chat in which to find message position @message_id Message identifier
|
||||||
|
//@filter Filter for message content; searchMessagesFilterEmpty, searchMessagesFilterUnreadMention, searchMessagesFilterUnreadReaction, and searchMessagesFilterFailedToSend are unsupported in this function
|
||||||
|
//@message_thread_id If not 0, only messages in the specified thread will be considered; supergroups only
|
||||||
|
getChatMessagePosition chat_id:int53 message_id:int53 filter:SearchMessagesFilter message_thread_id:int53 = Count;
|
||||||
|
|
||||||
//@description Returns all scheduled messages in a chat. The messages are returned in a reverse chronological order (i.e., in order of decreasing message_id) @chat_id Chat identifier
|
//@description Returns all scheduled messages in a chat. The messages are returned in a reverse chronological order (i.e., in order of decreasing message_id) @chat_id Chat identifier
|
||||||
getChatScheduledMessages chat_id:int53 = Messages;
|
getChatScheduledMessages chat_id:int53 = Messages;
|
||||||
|
|
||||||
|
@ -2354,6 +2354,8 @@ class GetSearchResultCalendarQuery final : public Td::ResultHandler {
|
|||||||
td_->contacts_manager_->on_get_users(std::move(result->users_), "GetSearchResultCalendarQuery");
|
td_->contacts_manager_->on_get_users(std::move(result->users_), "GetSearchResultCalendarQuery");
|
||||||
td_->contacts_manager_->on_get_chats(std::move(result->chats_), "GetSearchResultCalendarQuery");
|
td_->contacts_manager_->on_get_chats(std::move(result->chats_), "GetSearchResultCalendarQuery");
|
||||||
|
|
||||||
|
// unused: inexact:flags.0?true min_date:int min_msg_id:int offset_id_offset:flags.1?int
|
||||||
|
|
||||||
MessagesManager::MessagesInfo info;
|
MessagesManager::MessagesInfo info;
|
||||||
info.messages = std::move(result->messages_);
|
info.messages = std::move(result->messages_);
|
||||||
info.total_count = result->count_;
|
info.total_count = result->count_;
|
||||||
@ -2383,6 +2385,90 @@ class GetSearchResultCalendarQuery final : public Td::ResultHandler {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class GetMessagePositionQuery final : public Td::ResultHandler {
|
||||||
|
Promise<int32> promise_;
|
||||||
|
DialogId dialog_id_;
|
||||||
|
MessageId message_id_;
|
||||||
|
MessageSearchFilter filter_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit GetMessagePositionQuery(Promise<int32> &&promise) : promise_(std::move(promise)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void send(DialogId dialog_id, MessageId message_id, MessageSearchFilter filter, MessageId top_thread_message_id) {
|
||||||
|
auto input_peer = td_->messages_manager_->get_input_peer(dialog_id, AccessRights::Read);
|
||||||
|
CHECK(input_peer != nullptr);
|
||||||
|
|
||||||
|
dialog_id_ = dialog_id;
|
||||||
|
message_id_ = message_id;
|
||||||
|
filter_ = filter;
|
||||||
|
|
||||||
|
int32 flags = 0;
|
||||||
|
if (top_thread_message_id.is_valid()) {
|
||||||
|
flags |= telegram_api::messages_search::TOP_MSG_ID_MASK;
|
||||||
|
}
|
||||||
|
send_query(G()->net_query_creator().create(telegram_api::messages_search(
|
||||||
|
flags, std::move(input_peer), string(), nullptr, top_thread_message_id.get_server_message_id().get(),
|
||||||
|
get_input_messages_filter(filter), 0, std::numeric_limits<int32>::max(),
|
||||||
|
message_id.get_server_message_id().get(), -1, 1, std::numeric_limits<int32>::max(), 0, 0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void on_result(BufferSlice packet) final {
|
||||||
|
auto result_ptr = fetch_result<telegram_api::messages_search>(packet);
|
||||||
|
if (result_ptr.is_error()) {
|
||||||
|
return on_error(result_ptr.move_as_error());
|
||||||
|
}
|
||||||
|
|
||||||
|
auto messages_ptr = result_ptr.move_as_ok();
|
||||||
|
LOG(INFO) << "Receive result for GetMessagePositionQuery: " << to_string(messages_ptr);
|
||||||
|
switch (messages_ptr->get_id()) {
|
||||||
|
case telegram_api::messages_messages::ID: {
|
||||||
|
auto messages = move_tl_object_as<telegram_api::messages_messages>(messages_ptr);
|
||||||
|
if (messages->messages_.size() != 1 ||
|
||||||
|
MessagesManager::get_message_id(messages->messages_[0], false) != message_id_) {
|
||||||
|
return promise_.set_error(Status::Error(400, "Message not found by the filter"));
|
||||||
|
}
|
||||||
|
return promise_.set_value(narrow_cast<int32>(messages->messages_.size()));
|
||||||
|
}
|
||||||
|
case telegram_api::messages_messagesSlice::ID: {
|
||||||
|
auto messages = move_tl_object_as<telegram_api::messages_messagesSlice>(messages_ptr);
|
||||||
|
if (messages->messages_.size() != 1 ||
|
||||||
|
MessagesManager::get_message_id(messages->messages_[0], false) != message_id_) {
|
||||||
|
return promise_.set_error(Status::Error(400, "Message not found by the filter"));
|
||||||
|
}
|
||||||
|
if (messages->offset_id_offset_ <= 0) {
|
||||||
|
LOG(ERROR) << "Failed to receive position for " << message_id_ << " in " << dialog_id_ << " by " << filter_;
|
||||||
|
return promise_.set_error(Status::Error(400, "Message position is unknown"));
|
||||||
|
}
|
||||||
|
return promise_.set_value(std::move(messages->offset_id_offset_));
|
||||||
|
}
|
||||||
|
case telegram_api::messages_channelMessages::ID: {
|
||||||
|
auto messages = move_tl_object_as<telegram_api::messages_channelMessages>(messages_ptr);
|
||||||
|
if (messages->messages_.size() != 1 ||
|
||||||
|
MessagesManager::get_message_id(messages->messages_[0], false) != message_id_) {
|
||||||
|
return promise_.set_error(Status::Error(400, "Message not found by the filter"));
|
||||||
|
}
|
||||||
|
if (messages->offset_id_offset_ <= 0) {
|
||||||
|
LOG(ERROR) << "Failed to receive position for " << message_id_ << " in " << dialog_id_ << " by " << filter_;
|
||||||
|
return promise_.set_error(Status::Error(500, "Message position is unknown"));
|
||||||
|
}
|
||||||
|
return promise_.set_value(std::move(messages->offset_id_offset_));
|
||||||
|
}
|
||||||
|
case telegram_api::messages_messagesNotModified::ID:
|
||||||
|
LOG(ERROR) << "Server returned messagesNotModified in response to GetMessagePositionQuery";
|
||||||
|
return promise_.set_error(Status::Error(500, "Receive invalid response"));
|
||||||
|
default:
|
||||||
|
UNREACHABLE();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void on_error(Status status) final {
|
||||||
|
td_->messages_manager_->on_get_dialog_error(dialog_id_, status, "GetMessagePositionQuery");
|
||||||
|
promise_.set_error(std::move(status));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class SearchMessagesQuery final : public Td::ResultHandler {
|
class SearchMessagesQuery final : public Td::ResultHandler {
|
||||||
Promise<Unit> promise_;
|
Promise<Unit> promise_;
|
||||||
DialogId dialog_id_;
|
DialogId dialog_id_;
|
||||||
@ -23881,6 +23967,51 @@ void MessagesManager::get_dialog_message_count_from_server(DialogId dialog_id, M
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MessagesManager::get_dialog_message_position(FullMessageId full_message_id, MessageSearchFilter filter,
|
||||||
|
MessageId top_thread_message_id, Promise<int32> &&promise) {
|
||||||
|
auto dialog_id = full_message_id.get_dialog_id();
|
||||||
|
Dialog *d = get_dialog_force(dialog_id, "get_dialog_message_position");
|
||||||
|
if (d == nullptr) {
|
||||||
|
return promise.set_error(Status::Error(400, "Chat not found"));
|
||||||
|
}
|
||||||
|
if (!have_input_peer(dialog_id, AccessRights::Read)) {
|
||||||
|
return promise.set_error(Status::Error(400, "Can't access the chat"));
|
||||||
|
}
|
||||||
|
|
||||||
|
auto message_id = full_message_id.get_message_id();
|
||||||
|
const Message *m = get_message_force(d, message_id, "get_dialog_message_position");
|
||||||
|
if (m == nullptr) {
|
||||||
|
return promise.set_error(Status::Error(400, "Message not found"));
|
||||||
|
}
|
||||||
|
if (!m->message_id.is_valid() || !m->message_id.is_server() ||
|
||||||
|
(get_message_index_mask(d->dialog_id, m) & message_search_filter_index_mask(filter)) == 0) {
|
||||||
|
return promise.set_error(Status::Error(400, "Message can't be found in the filter"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (top_thread_message_id != MessageId()) {
|
||||||
|
if (!top_thread_message_id.is_valid() || !top_thread_message_id.is_server()) {
|
||||||
|
return promise.set_error(Status::Error(400, "Invalid message thread identifier specified"));
|
||||||
|
}
|
||||||
|
if (dialog_id.get_type() != DialogType::Channel || is_broadcast_channel(dialog_id)) {
|
||||||
|
return promise.set_error(Status::Error(400, "Can't filter by message thread identifier in the chat"));
|
||||||
|
}
|
||||||
|
if (m->top_thread_message_id != top_thread_message_id) {
|
||||||
|
return promise.set_error(Status::Error(400, "Message doesn't belong to the message thread"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (dialog_id.get_type() == DialogType::SecretChat) {
|
||||||
|
return promise.set_error(Status::Error(400, "The method can't be used in secret chats"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filter == MessageSearchFilter::Empty || filter == MessageSearchFilter::UnreadMention ||
|
||||||
|
filter == MessageSearchFilter::UnreadReaction || filter == MessageSearchFilter::FailedToSend) {
|
||||||
|
return promise.set_error(Status::Error(400, "The filter is not supported"));
|
||||||
|
}
|
||||||
|
|
||||||
|
td_->create_handler<GetMessagePositionQuery>(std::move(promise))
|
||||||
|
->send(dialog_id, message_id, filter, top_thread_message_id);
|
||||||
|
}
|
||||||
|
|
||||||
void MessagesManager::preload_newer_messages(const Dialog *d, MessageId max_message_id) {
|
void MessagesManager::preload_newer_messages(const Dialog *d, MessageId max_message_id) {
|
||||||
CHECK(d != nullptr);
|
CHECK(d != nullptr);
|
||||||
CHECK(max_message_id.is_valid());
|
CHECK(max_message_id.is_valid());
|
||||||
|
@ -809,6 +809,9 @@ class MessagesManager final : public Actor {
|
|||||||
void get_dialog_message_count(DialogId dialog_id, MessageSearchFilter filter, bool return_local,
|
void get_dialog_message_count(DialogId dialog_id, MessageSearchFilter filter, bool return_local,
|
||||||
Promise<int32> &&promise);
|
Promise<int32> &&promise);
|
||||||
|
|
||||||
|
void get_dialog_message_position(FullMessageId full_message_id, MessageSearchFilter filter,
|
||||||
|
MessageId top_thread_message_id, Promise<int32> &&promise);
|
||||||
|
|
||||||
vector<MessageId> get_dialog_scheduled_messages(DialogId dialog_id, bool force, bool ignore_result,
|
vector<MessageId> get_dialog_scheduled_messages(DialogId dialog_id, bool force, bool ignore_result,
|
||||||
Promise<Unit> &&promise);
|
Promise<Unit> &&promise);
|
||||||
|
|
||||||
|
@ -5194,6 +5194,21 @@ void Td::on_request(uint64 id, const td_api::getChatMessageCount &request) {
|
|||||||
request.return_local_, std::move(query_promise));
|
request.return_local_, std::move(query_promise));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Td::on_request(uint64 id, const td_api::getChatMessagePosition &request) {
|
||||||
|
CHECK_IS_USER();
|
||||||
|
CREATE_REQUEST_PROMISE();
|
||||||
|
auto query_promise = PromiseCreator::lambda([promise = std::move(promise)](Result<int32> result) mutable {
|
||||||
|
if (result.is_error()) {
|
||||||
|
promise.set_error(result.move_as_error());
|
||||||
|
} else {
|
||||||
|
promise.set_value(make_tl_object<td_api::count>(result.move_as_ok()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
messages_manager_->get_dialog_message_position({DialogId(request.chat_id_), MessageId(request.message_id_)},
|
||||||
|
get_message_search_filter(request.filter_),
|
||||||
|
MessageId(request.message_thread_id_), std::move(query_promise));
|
||||||
|
}
|
||||||
|
|
||||||
void Td::on_request(uint64 id, const td_api::getChatScheduledMessages &request) {
|
void Td::on_request(uint64 id, const td_api::getChatScheduledMessages &request) {
|
||||||
CHECK_IS_USER();
|
CHECK_IS_USER();
|
||||||
CREATE_REQUEST(GetChatScheduledMessagesRequest, request.chat_id_);
|
CREATE_REQUEST(GetChatScheduledMessagesRequest, request.chat_id_);
|
||||||
|
@ -654,6 +654,8 @@ class Td final : public Actor {
|
|||||||
|
|
||||||
void on_request(uint64 id, const td_api::getChatMessageCount &request);
|
void on_request(uint64 id, const td_api::getChatMessageCount &request);
|
||||||
|
|
||||||
|
void on_request(uint64 id, const td_api::getChatMessagePosition &request);
|
||||||
|
|
||||||
void on_request(uint64 id, const td_api::getChatScheduledMessages &request);
|
void on_request(uint64 id, const td_api::getChatScheduledMessages &request);
|
||||||
|
|
||||||
void on_request(uint64 id, const td_api::getEmojiReaction &request);
|
void on_request(uint64 id, const td_api::getEmojiReaction &request);
|
||||||
|
@ -2391,6 +2391,14 @@ class CliClient final : public Actor {
|
|||||||
get_args(args, chat_id, filter, return_local);
|
get_args(args, chat_id, filter, return_local);
|
||||||
send_request(
|
send_request(
|
||||||
td_api::make_object<td_api::getChatMessageCount>(chat_id, as_search_messages_filter(filter), return_local));
|
td_api::make_object<td_api::getChatMessageCount>(chat_id, as_search_messages_filter(filter), return_local));
|
||||||
|
} else if (op == "gcmp") {
|
||||||
|
ChatId chat_id;
|
||||||
|
MessageId message_id;
|
||||||
|
string filter;
|
||||||
|
string message_thread_id;
|
||||||
|
get_args(args, chat_id, message_id, filter, message_thread_id);
|
||||||
|
send_request(td_api::make_object<td_api::getChatMessagePosition>(
|
||||||
|
chat_id, message_id, as_search_messages_filter(filter), as_message_thread_id(message_thread_id)));
|
||||||
} else if (op == "gup" || op == "gupp") {
|
} else if (op == "gup" || op == "gupp") {
|
||||||
UserId user_id;
|
UserId user_id;
|
||||||
int32 offset;
|
int32 offset;
|
||||||
|
Loading…
Reference in New Issue
Block a user