Register polls.
GitOrigin-RevId: 812e3e699a578effab96c4d798d5b74ddf635371
This commit is contained in:
parent
95f7b129c8
commit
839c1856ff
@ -3269,6 +3269,24 @@ bool merge_message_content_file_id(Td *td, MessageContent *message_content, File
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void register_message_content(Td *td, const MessageContent *content, FullMessageId full_message_id) {
|
||||||
|
switch (content->get_type()) {
|
||||||
|
case MessageContentType::Poll:
|
||||||
|
return td->poll_manager_->register_poll(static_cast<const MessagePoll *>(content)->poll_id, full_message_id);
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void unregister_message_content(Td *td, const MessageContent *content, FullMessageId full_message_id) {
|
||||||
|
switch (content->get_type()) {
|
||||||
|
case MessageContentType::Poll:
|
||||||
|
return td->poll_manager_->unregister_poll(static_cast<const MessagePoll *>(content)->poll_id, full_message_id);
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static FormattedText get_secret_media_caption(string &&message_text, string &&message_caption) {
|
static FormattedText get_secret_media_caption(string &&message_text, string &&message_caption) {
|
||||||
FormattedText caption;
|
FormattedText caption;
|
||||||
if (message_text.empty()) {
|
if (message_text.empty()) {
|
||||||
|
@ -185,6 +185,10 @@ void merge_message_contents(Td *td, MessageContent *old_content, MessageContent
|
|||||||
|
|
||||||
bool merge_message_content_file_id(Td *td, MessageContent *message_content, FileId new_file_id);
|
bool merge_message_content_file_id(Td *td, MessageContent *message_content, FileId new_file_id);
|
||||||
|
|
||||||
|
void register_message_content(Td *td, const MessageContent *content, FullMessageId full_message_id);
|
||||||
|
|
||||||
|
void unregister_message_content(Td *td, const MessageContent *content, FullMessageId full_message_id);
|
||||||
|
|
||||||
unique_ptr<MessageContent> get_secret_message_content(
|
unique_ptr<MessageContent> get_secret_message_content(
|
||||||
Td *td, string message_text, tl_object_ptr<telegram_api::encryptedFile> file,
|
Td *td, string message_text, tl_object_ptr<telegram_api::encryptedFile> file,
|
||||||
tl_object_ptr<secret_api::DecryptedMessageMedia> &&media,
|
tl_object_ptr<secret_api::DecryptedMessageMedia> &&media,
|
||||||
|
@ -8630,8 +8630,10 @@ void MessagesManager::on_message_ttl_expired(Dialog *d, Message *m) {
|
|||||||
CHECK(m->ttl > 0);
|
CHECK(m->ttl > 0);
|
||||||
CHECK(d->dialog_id.get_type() != DialogType::SecretChat);
|
CHECK(d->dialog_id.get_type() != DialogType::SecretChat);
|
||||||
ttl_unregister_message(d->dialog_id, m, Time::now(), "on_message_ttl_expired");
|
ttl_unregister_message(d->dialog_id, m, Time::now(), "on_message_ttl_expired");
|
||||||
|
unregister_message_content(td_, m->content.get(), {d->dialog_id, m->message_id});
|
||||||
remove_message_file_sources(d->dialog_id, m);
|
remove_message_file_sources(d->dialog_id, m);
|
||||||
on_message_ttl_expired_impl(d, m);
|
on_message_ttl_expired_impl(d, m);
|
||||||
|
register_message_content(td_, m->content.get(), {d->dialog_id, m->message_id});
|
||||||
send_update_message_content(d->dialog_id, m->message_id, m->content.get(), m->date, m->is_content_secret,
|
send_update_message_content(d->dialog_id, m->message_id, m->content.get(), m->date, m->is_content_secret,
|
||||||
"on_message_ttl_expired");
|
"on_message_ttl_expired");
|
||||||
}
|
}
|
||||||
@ -10056,8 +10058,9 @@ void MessagesManager::on_update_sent_text_message(int64 random_id,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto dialog_id = it->second.get_dialog_id();
|
auto full_message_id = it->second;
|
||||||
auto m = get_message_force(it->second);
|
auto dialog_id = full_message_id.get_dialog_id();
|
||||||
|
auto m = get_message_force(full_message_id);
|
||||||
if (m == nullptr) {
|
if (m == nullptr) {
|
||||||
// message has already been deleted
|
// message has already been deleted
|
||||||
return;
|
return;
|
||||||
@ -10080,6 +10083,8 @@ void MessagesManager::on_update_sent_text_message(int64 random_id,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unregister_message_content(td_, m->content.get(), full_message_id);
|
||||||
|
|
||||||
bool need_update = false;
|
bool need_update = false;
|
||||||
bool is_content_changed = false;
|
bool is_content_changed = false;
|
||||||
merge_message_contents(td_, m->content.get(), new_content.get(), need_message_changed_warning(m), dialog_id, false,
|
merge_message_contents(td_, m->content.get(), new_content.get(), need_message_changed_warning(m), dialog_id, false,
|
||||||
@ -10089,6 +10094,7 @@ void MessagesManager::on_update_sent_text_message(int64 random_id,
|
|||||||
m->content = std::move(new_content);
|
m->content = std::move(new_content);
|
||||||
m->is_content_secret = is_secret_message_content(m->ttl, MessageContentType::Text);
|
m->is_content_secret = is_secret_message_content(m->ttl, MessageContentType::Text);
|
||||||
}
|
}
|
||||||
|
register_message_content(td_, m->content.get(), full_message_id);
|
||||||
if (need_update) {
|
if (need_update) {
|
||||||
send_update_message_content(dialog_id, m->message_id, m->content.get(), m->date, m->is_content_secret,
|
send_update_message_content(dialog_id, m->message_id, m->content.get(), m->date, m->is_content_secret,
|
||||||
"on_update_sent_text_message");
|
"on_update_sent_text_message");
|
||||||
@ -10925,6 +10931,7 @@ void MessagesManager::on_message_deleted(Dialog *d, Message *m) {
|
|||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
}
|
}
|
||||||
ttl_unregister_message(d->dialog_id, m, Time::now(), "on_message_deleted");
|
ttl_unregister_message(d->dialog_id, m, Time::now(), "on_message_deleted");
|
||||||
|
unregister_message_content(td_, m->content.get(), {d->dialog_id, m->message_id});
|
||||||
if (m->notification_id.is_valid()) {
|
if (m->notification_id.is_valid()) {
|
||||||
delete_notification_id_to_message_id_correspondence(d, m->notification_id, m->message_id);
|
delete_notification_id_to_message_id_correspondence(d, m->notification_id, m->message_id);
|
||||||
}
|
}
|
||||||
@ -21772,6 +21779,7 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq
|
|||||||
}
|
}
|
||||||
|
|
||||||
add_message_file_sources(dialog_id, m);
|
add_message_file_sources(dialog_id, m);
|
||||||
|
register_message_content(td_, m->content.get(), {dialog_id, message_id});
|
||||||
|
|
||||||
if (from_update && message_id.is_server() && dialog_id.get_type() == DialogType::Channel) {
|
if (from_update && message_id.is_server() && dialog_id.get_type() == DialogType::Channel) {
|
||||||
int32 new_participant_count = get_message_content_new_participant_count(m->content.get());
|
int32 new_participant_count = get_message_content_new_participant_count(m->content.get());
|
||||||
@ -22461,7 +22469,9 @@ bool MessagesManager::update_message_content(DialogId dialog_id, Message *old_me
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (is_content_changed || need_update) {
|
if (is_content_changed || need_update) {
|
||||||
|
unregister_message_content(td_, old_content.get(), {dialog_id, old_message->message_id});
|
||||||
old_content = std::move(new_content);
|
old_content = std::move(new_content);
|
||||||
|
register_message_content(td_, old_content.get(), {dialog_id, old_message->message_id});
|
||||||
update_message_content_file_id_remote(old_content.get(), old_file_id);
|
update_message_content_file_id_remote(old_content.get(), old_file_id);
|
||||||
} else {
|
} else {
|
||||||
update_message_content_file_id_remote(old_content.get(), get_message_content_file_id(new_content.get()));
|
update_message_content_file_id_remote(old_content.get(), get_message_content_file_id(new_content.get()));
|
||||||
|
@ -143,6 +143,16 @@ PollId PollManager::create_poll(string &&question, vector<string> &&answers) {
|
|||||||
return poll_id;
|
return poll_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PollManager::register_poll(PollId poll_id, FullMessageId full_message_id) {
|
||||||
|
CHECK(have_poll(poll_id));
|
||||||
|
poll_messages_[poll_id].insert(full_message_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PollManager::unregister_poll(PollId poll_id, FullMessageId full_message_id) {
|
||||||
|
CHECK(have_poll(poll_id));
|
||||||
|
poll_messages_[poll_id].erase(full_message_id);
|
||||||
|
}
|
||||||
|
|
||||||
void PollManager::close_poll(PollId poll_id) {
|
void PollManager::close_poll(PollId poll_id) {
|
||||||
auto poll = get_poll_editable(poll_id);
|
auto poll = get_poll_editable(poll_id);
|
||||||
CHECK(poll != nullptr);
|
CHECK(poll != nullptr);
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
//
|
//
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "td/telegram/MessageId.h"
|
||||||
#include "td/telegram/PollId.h"
|
#include "td/telegram/PollId.h"
|
||||||
#include "td/telegram/td_api.h"
|
#include "td/telegram/td_api.h"
|
||||||
#include "td/telegram/telegram_api.h"
|
#include "td/telegram/telegram_api.h"
|
||||||
@ -34,6 +35,10 @@ class PollManager : public Actor {
|
|||||||
|
|
||||||
PollId create_poll(string &&question, vector<string> &&answers);
|
PollId create_poll(string &&question, vector<string> &&answers);
|
||||||
|
|
||||||
|
void register_poll(PollId poll_id, FullMessageId full_message_id);
|
||||||
|
|
||||||
|
void unregister_poll(PollId poll_id, FullMessageId full_message_id);
|
||||||
|
|
||||||
void close_poll(PollId poll_id);
|
void close_poll(PollId poll_id);
|
||||||
|
|
||||||
tl_object_ptr<telegram_api::InputMedia> get_input_media(PollId poll_id) const;
|
tl_object_ptr<telegram_api::InputMedia> get_input_media(PollId poll_id) const;
|
||||||
@ -104,6 +109,8 @@ class PollManager : public Actor {
|
|||||||
ActorShared<> parent_;
|
ActorShared<> parent_;
|
||||||
std::unordered_map<PollId, unique_ptr<Poll>, PollIdHash> polls_;
|
std::unordered_map<PollId, unique_ptr<Poll>, PollIdHash> polls_;
|
||||||
|
|
||||||
|
std::unordered_map<PollId, std::unordered_set<FullMessageId, FullMessageIdHash>, PollIdHash> poll_messages_;
|
||||||
|
|
||||||
int64 current_local_poll_id_ = 0;
|
int64 current_local_poll_id_ = 0;
|
||||||
|
|
||||||
std::unordered_set<PollId, PollIdHash> loaded_from_database_polls_;
|
std::unordered_set<PollId, PollIdHash> loaded_from_database_polls_;
|
||||||
|
Reference in New Issue
Block a user