aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorlevlam <levlam@telegram.org>2026-06-30 18:56:16 +0300
committerlevlam <levlam@telegram.org>2026-06-30 18:56:16 +0300
commitbc4d9701607fb91a985af06640074b90411d1718 (patch)
tree55acf282d36ef940669d85116975095ad9edd216
parenta534ded0ae60166b178b0fdc55f22af15af17e5c (diff)
Use EphemeralMessageId.
-rw-r--r--td/telegram/MessageInputReplyTo.cpp4
-rw-r--r--td/telegram/MessageInputReplyTo.h7
-rw-r--r--td/telegram/MessageInputReplyTo.hpp2
-rw-r--r--td/telegram/MessagesManager.cpp36
-rw-r--r--td/telegram/MessagesManager.h6
5 files changed, 29 insertions, 26 deletions
diff --git a/td/telegram/MessageInputReplyTo.cpp b/td/telegram/MessageInputReplyTo.cpp
index 883edb128..e3262647e 100644
--- a/td/telegram/MessageInputReplyTo.cpp
+++ b/td/telegram/MessageInputReplyTo.cpp
@@ -111,8 +111,8 @@ telegram_api::object_ptr<telegram_api::InputReplyTo> MessageInputReplyTo::get_in
story_full_id_.get_story_id().get());
}
CHECK(!message_topic.is_saved_messages());
- if (ephemeral_message_id_ != 0) {
- return telegram_api::make_object<telegram_api::inputReplyToEphemeralMessage>(ephemeral_message_id_);
+ if (ephemeral_message_id_.is_valid()) {
+ return telegram_api::make_object<telegram_api::inputReplyToEphemeralMessage>(ephemeral_message_id_.get());
}
auto reply_to_message_id = message_id_;
if (reply_to_message_id == MessageId()) {
diff --git a/td/telegram/MessageInputReplyTo.h b/td/telegram/MessageInputReplyTo.h
index 14cf4b693..531410845 100644
--- a/td/telegram/MessageInputReplyTo.h
+++ b/td/telegram/MessageInputReplyTo.h
@@ -7,6 +7,7 @@
#pragma once
#include "td/telegram/DialogId.h"
+#include "td/telegram/EphemeralMessageId.h"
#include "td/telegram/MessageFullId.h"
#include "td/telegram/MessageId.h"
#include "td/telegram/MessageQuote.h"
@@ -26,7 +27,7 @@ class Td;
class MessageInputReplyTo {
MessageId message_id_;
- int32 ephemeral_message_id_ = 0;
+ EphemeralMessageId ephemeral_message_id_;
DialogId dialog_id_;
MessageQuote quote_;
int32 todo_item_id_ = 0;
@@ -49,8 +50,8 @@ class MessageInputReplyTo {
MessageInputReplyTo &operator=(MessageInputReplyTo &&) = default;
~MessageInputReplyTo();
- MessageInputReplyTo(MessageId message_id, int32 ephemeral_message_id, DialogId dialog_id, MessageQuote quote,
- int32 todo_item_id, const string &poll_option_id, const char *debug_source)
+ MessageInputReplyTo(MessageId message_id, EphemeralMessageId ephemeral_message_id, DialogId dialog_id,
+ MessageQuote quote, int32 todo_item_id, const string &poll_option_id, const char *debug_source)
: message_id_(message_id)
, ephemeral_message_id_(ephemeral_message_id)
, dialog_id_(dialog_id)
diff --git a/td/telegram/MessageInputReplyTo.hpp b/td/telegram/MessageInputReplyTo.hpp
index 5bd66ae51..afa7e06d4 100644
--- a/td/telegram/MessageInputReplyTo.hpp
+++ b/td/telegram/MessageInputReplyTo.hpp
@@ -24,7 +24,7 @@ void MessageInputReplyTo::store(StorerT &storer) const {
bool has_quote = !quote_.is_empty();
bool has_todo_item_id = todo_item_id_ != 0;
bool has_poll_option_id = !poll_option_id_.empty();
- bool has_ephemeral_message_id = ephemeral_message_id_ != 0;
+ bool has_ephemeral_message_id = ephemeral_message_id_.is_valid();
BEGIN_STORE_FLAGS();
STORE_FLAG(has_message_id);
STORE_FLAG(has_story_full_id);
diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp
index c2166d893..51887b568 100644
--- a/td/telegram/MessagesManager.cpp
+++ b/td/telegram/MessagesManager.cpp
@@ -2323,7 +2323,7 @@ void MessagesManager::Message::store(StorerT &storer) const {
bool has_sender_rank = !sender_rank.empty();
bool has_guest_bot_via_dialog_id = guest_bot_via_dialog_id.is_valid();
bool has_receiver_user_id = receiver_user_id.is_valid();
- bool has_ephemeral_message_id = ephemeral_message_id != 0;
+ bool has_ephemeral_message_id = ephemeral_message_id.is_valid();
BEGIN_STORE_FLAGS();
STORE_FLAG(is_channel_post);
STORE_FLAG(is_outgoing);
@@ -3004,10 +3004,13 @@ void MessagesManager::Message::parse(ParserT &parser) {
}
if (has_receiver_user_id) {
parse(receiver_user_id, parser);
+ if (!receiver_user_id.is_valid()) {
+ parser.set_error("Invalid ephemeral message receiver identifier");
+ }
}
if (has_ephemeral_message_id) {
parse(ephemeral_message_id, parser);
- if (ephemeral_message_id == 0) {
+ if (!ephemeral_message_id.is_valid()) {
parser.set_error("Invalid ephemeral message identifier");
}
}
@@ -3295,7 +3298,7 @@ void MessagesManager::Dialog::store(StorerT &storer) const {
store(business_bot_manage_bar, storer);
}
if (has_ephemeral_message_ids) {
- vector<std::pair<int32, MessageId>> stored_data;
+ vector<std::pair<EphemeralMessageId, MessageId>> stored_data;
for (const auto &it : ephemeral_message_ids) {
stored_data.emplace_back(it.first, it.second);
}
@@ -3647,10 +3650,10 @@ void MessagesManager::Dialog::parse(ParserT &parser) {
parse(business_bot_manage_bar, parser);
}
if (has_ephemeral_message_ids) {
- vector<std::pair<int32, MessageId>> stored_data;
+ vector<std::pair<EphemeralMessageId, MessageId>> stored_data;
parse(stored_data, parser);
for (const auto &it : stored_data) {
- if (it.first == 0 || !it.second.is_valid()) {
+ if (!it.first.is_valid() || !it.second.is_valid()) {
parser.set_error("Have invalid ephemeral message");
} else {
ephemeral_message_ids.emplace(it.first, it.second);
@@ -4257,7 +4260,7 @@ void MessagesManager::on_delete_ephemeral_messages(DialogId dialog_id, vector<in
}
vector<MessageId> message_ids;
for (auto ephemeral_message_id : ephemeral_message_ids) {
- auto it = d->ephemeral_message_ids.find(ephemeral_message_id);
+ auto it = d->ephemeral_message_ids.find(EphemeralMessageId(ephemeral_message_id));
if (it != d->ephemeral_message_ids.end()) {
message_ids.push_back(it->second);
}
@@ -8140,7 +8143,7 @@ bool MessagesManager::can_reply_to_message(const Dialog *d, MessageId message_id
CHECK(d != nullptr);
auto dialog_id = d->dialog_id;
if (is_ephemeral_message(m)) {
- return m->ephemeral_message_id != 0 && !m->is_outgoing;
+ return m->ephemeral_message_id.is_valid() && !m->is_outgoing;
}
if (!td_->auth_manager_->is_bot() && m != nullptr && m->is_topic_message && d->is_forum) {
auto forum_topic_id = ForumTopicId::from_top_thread_message_id(m->top_thread_message_id);
@@ -11334,11 +11337,11 @@ MessagesManager::MessageInfo MessagesManager::parse_ephemeral_message(
MessageInfo message_info;
auto dialog_id = DialogId(message->peer_id_);
message_info.receiver_user_id = UserId(message->receiver_id_);
- message_info.ephemeral_message_id = message->id_;
+ message_info.ephemeral_message_id = EphemeralMessageId(message->id_);
message_info.sender_dialog_id = DialogId(message->from_id_);
- if (!dialog_id.is_valid() || !message_info.receiver_user_id.is_valid() || message_info.ephemeral_message_id == 0 ||
- !message_info.sender_dialog_id.is_valid()) {
- LOG(ERROR) << "Ignore ephemeral message " << message_info.ephemeral_message_id << " in " << dialog_id << " sent by "
+ if (!dialog_id.is_valid() || !message_info.receiver_user_id.is_valid() ||
+ !message_info.ephemeral_message_id.is_valid() || !message_info.sender_dialog_id.is_valid()) {
+ LOG(ERROR) << "Ignore " << message_info.ephemeral_message_id << " in " << dialog_id << " sent by "
<< message_info.sender_dialog_id << " and received by " << message_info.receiver_user_id;
return message_info;
}
@@ -11429,9 +11432,8 @@ std::pair<DialogId, unique_ptr<MessagesManager::Message>> MessagesManager::creat
LOG(ERROR) << "Receive message receiver " << message_info.receiver_user_id;
message_info.receiver_user_id = UserId();
}
- if (message_info.ephemeral_message_id != 0 && message_info.receiver_user_id == UserId()) {
- LOG(ERROR) << "Receive ephemeral message " << message_info.ephemeral_message_id << " without receiver in "
- << dialog_id;
+ if (message_info.ephemeral_message_id.is_valid() && message_info.receiver_user_id == UserId()) {
+ LOG(ERROR) << "Receive " << message_info.ephemeral_message_id << " without receiver in " << dialog_id;
return {DialogId(), nullptr};
}
@@ -13523,7 +13525,7 @@ void MessagesManager::on_message_deleted(Dialog *d, Message *m, bool is_permanen
default:
UNREACHABLE();
}
- if (m->ephemeral_message_id != 0 && is_permanently_deleted) {
+ if (m->ephemeral_message_id.is_valid() && is_permanently_deleted) {
auto is_erased = d->ephemeral_message_ids.erase(m->ephemeral_message_id) > 0;
CHECK(is_erased);
on_dialog_updated(d->dialog_id, "delete_ephemeral_message");
@@ -15191,7 +15193,7 @@ void MessagesManager::get_message_properties(DialogId dialog_id, MessageId messa
can_delete_for_all_users = !can_delete_for_self;
}
if (is_ephemeral) {
- can_delete_for_self = m->ephemeral_message_id == 0;
+ can_delete_for_self = !m->ephemeral_message_id.is_valid();
can_delete_for_all_users = !can_delete_for_self;
}
@@ -31156,7 +31158,7 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq
default:
UNREACHABLE();
}
- if (m->ephemeral_message_id != 0) {
+ if (m->ephemeral_message_id.is_valid()) {
if (d->ephemeral_message_ids.emplace(m->ephemeral_message_id, m->message_id).second &&
d->ephemeral_message_ids.size() > MAX_DIALOG_EPHEMERAL_MESSAGES) {
auto oldest_message_id = m->message_id;
diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h
index d263d8b25..4b8036697 100644
--- a/td/telegram/MessagesManager.h
+++ b/td/telegram/MessagesManager.h
@@ -1043,7 +1043,7 @@ class MessagesManager final : public Actor {
UserId sender_user_id;
DialogId sender_dialog_id;
UserId receiver_user_id;
- int32 ephemeral_message_id = 0;
+ EphemeralMessageId ephemeral_message_id;
SavedMessagesTopicId saved_messages_topic_id;
int32 date = 0;
int32 schedule_repeat_period = 0;
@@ -1099,7 +1099,7 @@ class MessagesManager final : public Actor {
UserId sender_user_id;
DialogId sender_dialog_id;
UserId receiver_user_id;
- int32 ephemeral_message_id = 0;
+ EphemeralMessageId ephemeral_message_id;
SavedMessagesTopicId saved_messages_topic_id;
int32 date = 0;
int32 edit_date = 0;
@@ -1418,7 +1418,7 @@ class MessagesManager final : public Actor {
MessageId pending_read_channel_inbox_max_message_id; // for channels only
FlatHashMap<int64, MessageId> random_id_to_message_id; // for secret chats and yet unsent messages only
- FlatHashMap<int32, MessageId> ephemeral_message_ids;
+ FlatHashMap<EphemeralMessageId, MessageId, EphemeralMessageIdHash> ephemeral_message_ids;
MessageId last_assigned_message_id; // identifier of the last local or yet unsent message, assigned after
// application start, used to guarantee that all assigned message identifiers