Register dice quick reply messages.

This commit is contained in:
levlam 2024-06-18 00:28:54 +03:00
parent 2911fcc518
commit 81b6860f3c
3 changed files with 73 additions and 36 deletions

View File

@ -5448,7 +5448,7 @@ void register_message_content(Td *td, const MessageContent *content, MessageFull
source); source);
case MessageContentType::Dice: { case MessageContentType::Dice: {
auto dice = static_cast<const MessageDice *>(content); auto dice = static_cast<const MessageDice *>(content);
return td->stickers_manager_->register_dice(dice->emoji, dice->dice_value, message_full_id, source); return td->stickers_manager_->register_dice(dice->emoji, dice->dice_value, message_full_id, {}, source);
} }
case MessageContentType::GiftPremium: case MessageContentType::GiftPremium:
return td->stickers_manager_->register_premium_gift(static_cast<const MessageGiftPremium *>(content)->months, return td->stickers_manager_->register_premium_gift(static_cast<const MessageGiftPremium *>(content)->months,
@ -5575,7 +5575,7 @@ void unregister_message_content(Td *td, const MessageContent *content, MessageFu
source); source);
case MessageContentType::Dice: { case MessageContentType::Dice: {
auto dice = static_cast<const MessageDice *>(content); auto dice = static_cast<const MessageDice *>(content);
return td->stickers_manager_->unregister_dice(dice->emoji, dice->dice_value, message_full_id, source); return td->stickers_manager_->unregister_dice(dice->emoji, dice->dice_value, message_full_id, {}, source);
} }
case MessageContentType::GiftPremium: case MessageContentType::GiftPremium:
return td->stickers_manager_->unregister_premium_gift(static_cast<const MessageGiftPremium *>(content)->months, return td->stickers_manager_->unregister_premium_gift(static_cast<const MessageGiftPremium *>(content)->months,
@ -5625,6 +5625,10 @@ void register_quick_reply_message_content(Td *td, const MessageContent *content,
} }
return; return;
} }
case MessageContentType::Dice: {
auto dice = static_cast<const MessageDice *>(content);
return td->stickers_manager_->register_dice(dice->emoji, dice->dice_value, {}, message_full_id, source);
}
default: default:
return; return;
} }
@ -5643,6 +5647,10 @@ void unregister_quick_reply_message_content(Td *td, const MessageContent *conten
} }
return; return;
} }
case MessageContentType::Dice: {
auto dice = static_cast<const MessageDice *>(content);
return td->stickers_manager_->unregister_dice(dice->emoji, dice->dice_value, {}, message_full_id, source);
}
default: default:
return; return;
} }

View File

@ -1703,7 +1703,7 @@ StickersManager::~StickersManager() {
found_stickers_[0], found_stickers_[1], found_stickers_[2], found_sticker_sets_[0], found_sticker_sets_[1], found_stickers_[0], found_stickers_[1], found_stickers_[2], found_sticker_sets_[0], found_sticker_sets_[1],
found_sticker_sets_[2], emoji_language_codes_, emoji_language_code_versions_, found_sticker_sets_[2], emoji_language_codes_, emoji_language_code_versions_,
emoji_language_code_last_difference_times_, reloaded_emoji_keywords_, premium_gift_messages_, dice_messages_, emoji_language_code_last_difference_times_, reloaded_emoji_keywords_, premium_gift_messages_, dice_messages_,
emoji_messages_, custom_emoji_messages_, custom_emoji_to_sticker_id_); dice_quick_reply_messages_, emoji_messages_, custom_emoji_messages_, custom_emoji_to_sticker_id_);
} }
void StickersManager::start_up() { void StickersManager::start_up() {
@ -1868,7 +1868,7 @@ void StickersManager::load_special_sticker_set(SpecialStickerSet &sticker_set) {
return; return;
} }
sticker_set.is_being_loaded_ = true; sticker_set.is_being_loaded_ = true;
LOG(INFO) << "Load " << sticker_set.type_.type_ << " " << sticker_set.id_; LOG(INFO) << "Load " << sticker_set.type_.type_ << ' ' << sticker_set.id_;
if (sticker_set.id_.is_valid()) { if (sticker_set.id_.is_valid()) {
auto s = get_sticker_set(sticker_set.id_); auto s = get_sticker_set(sticker_set.id_);
CHECK(s != nullptr); CHECK(s != nullptr);
@ -2005,16 +2005,28 @@ void StickersManager::on_load_special_sticker_set(const SpecialStickerSetType &t
auto emoji = type.get_dice_emoji(); auto emoji = type.get_dice_emoji();
CHECK(!emoji.empty()); CHECK(!emoji.empty());
auto it = dice_messages_.find(emoji); {
if (it == dice_messages_.end()) { auto it = dice_messages_.find(emoji);
return; if (it != dice_messages_.end()) {
vector<MessageFullId> message_full_ids;
it->second.foreach([&](const MessageFullId &message_full_id) { message_full_ids.push_back(message_full_id); });
CHECK(!message_full_ids.empty());
for (const auto &message_full_id : message_full_ids) {
td_->messages_manager_->on_external_update_message_content(message_full_id, "on_load_special_sticker_set");
}
}
} }
{
vector<MessageFullId> message_full_ids; auto it = dice_quick_reply_messages_.find(emoji);
it->second.foreach([&](const MessageFullId &message_full_id) { message_full_ids.push_back(message_full_id); }); if (it != dice_quick_reply_messages_.end()) {
CHECK(!message_full_ids.empty()); vector<QuickReplyMessageFullId> message_full_ids;
for (const auto &message_full_id : message_full_ids) { it->second.foreach(
td_->messages_manager_->on_external_update_message_content(message_full_id, "on_load_special_sticker_set"); [&](const QuickReplyMessageFullId &message_full_id) { message_full_ids.push_back(message_full_id); });
CHECK(!message_full_ids.empty());
for (const auto &message_full_id : message_full_ids) {
td_->quick_reply_manager_->on_external_update_message_content(message_full_id, "on_load_special_sticker_set");
}
}
} }
} }
@ -5831,7 +5843,7 @@ void StickersManager::register_premium_gift(int32 months, MessageFullId message_
} }
bool is_inserted = premium_gift_messages.message_full_ids_.insert(message_full_id).second; bool is_inserted = premium_gift_messages.message_full_ids_.insert(message_full_id).second;
LOG_CHECK(is_inserted) << source << " " << months << " " << message_full_id; LOG_CHECK(is_inserted) << source << ' ' << months << ' ' << message_full_id;
} }
void StickersManager::unregister_premium_gift(int32 months, MessageFullId message_full_id, const char *source) { void StickersManager::unregister_premium_gift(int32 months, MessageFullId message_full_id, const char *source) {
@ -5844,7 +5856,7 @@ void StickersManager::unregister_premium_gift(int32 months, MessageFullId messag
CHECK(it != premium_gift_messages_.end()); CHECK(it != premium_gift_messages_.end());
auto &message_ids = it->second->message_full_ids_; auto &message_ids = it->second->message_full_ids_;
auto is_deleted = message_ids.erase(message_full_id) > 0; auto is_deleted = message_ids.erase(message_full_id) > 0;
LOG_CHECK(is_deleted) << source << " " << months << " " << message_full_id; LOG_CHECK(is_deleted) << source << ' ' << months << ' ' << message_full_id;
if (message_ids.empty()) { if (message_ids.empty()) {
premium_gift_messages_.erase(it); premium_gift_messages_.erase(it);
@ -5852,19 +5864,25 @@ void StickersManager::unregister_premium_gift(int32 months, MessageFullId messag
} }
void StickersManager::register_dice(const string &emoji, int32 value, MessageFullId message_full_id, void StickersManager::register_dice(const string &emoji, int32 value, MessageFullId message_full_id,
const char *source) { QuickReplyMessageFullId quick_reply_message_full_id, const char *source) {
CHECK(!emoji.empty()); CHECK(!emoji.empty());
if (td_->auth_manager_->is_bot()) { if (td_->auth_manager_->is_bot()) {
return; return;
} }
LOG(INFO) << "Register dice " << emoji << " with value " << value << " from " << message_full_id << " from " LOG(INFO) << "Register dice " << emoji << " with value " << value << " from " << message_full_id << '/'
<< source; << quick_reply_message_full_id << " from " << source;
dice_messages_[emoji].insert(message_full_id); if (quick_reply_message_full_id.is_valid()) {
dice_quick_reply_messages_[emoji].insert(quick_reply_message_full_id);
} else {
CHECK(message_full_id.get_dialog_id().is_valid());
dice_messages_[emoji].insert(message_full_id);
}
if (!td::contains(dice_emojis_, emoji)) { if (!td::contains(dice_emojis_, emoji)) {
if (message_full_id.get_message_id().is_any_server() && if (quick_reply_message_full_id.is_valid() ||
message_full_id.get_dialog_id().get_type() != DialogType::SecretChat) { (message_full_id.get_message_id().is_any_server() &&
message_full_id.get_dialog_id().get_type() != DialogType::SecretChat)) {
send_closure(G()->config_manager(), &ConfigManager::reget_app_config, Promise<Unit>()); send_closure(G()->config_manager(), &ConfigManager::reget_app_config, Promise<Unit>());
} }
return; return;
@ -5882,7 +5900,7 @@ void StickersManager::register_dice(const string &emoji, int32 value, MessageFul
} }
if (need_load) { if (need_load) {
LOG(INFO) << "Waiting for a dice sticker set needed in " << message_full_id; LOG(INFO) << "Waiting for a dice sticker set needed in " << message_full_id << '/' << quick_reply_message_full_id;
load_special_sticker_set(special_sticker_set); load_special_sticker_set(special_sticker_set);
} else { } else {
// TODO reload once in a while // TODO reload once in a while
@ -5891,20 +5909,30 @@ void StickersManager::register_dice(const string &emoji, int32 value, MessageFul
} }
void StickersManager::unregister_dice(const string &emoji, int32 value, MessageFullId message_full_id, void StickersManager::unregister_dice(const string &emoji, int32 value, MessageFullId message_full_id,
const char *source) { QuickReplyMessageFullId quick_reply_message_full_id, const char *source) {
CHECK(!emoji.empty()); CHECK(!emoji.empty());
if (td_->auth_manager_->is_bot()) { if (td_->auth_manager_->is_bot()) {
return; return;
} }
LOG(INFO) << "Unregister dice " << emoji << " with value " << value << " from " << message_full_id << " from " LOG(INFO) << "Unregister dice " << emoji << " with value " << value << " from " << message_full_id << '/'
<< source; << quick_reply_message_full_id << " from " << source;
auto &message_ids = dice_messages_[emoji]; if (quick_reply_message_full_id.is_valid()) {
auto is_deleted = message_ids.erase(message_full_id) > 0; auto &message_ids = dice_quick_reply_messages_[emoji];
LOG_CHECK(is_deleted) << source << " " << emoji << " " << value << " " << message_full_id; auto is_deleted = message_ids.erase(quick_reply_message_full_id) > 0;
LOG_CHECK(is_deleted) << source << ' ' << emoji << ' ' << value << ' ' << quick_reply_message_full_id;
if (message_ids.empty()) { if (message_ids.empty()) {
dice_messages_.erase(emoji); dice_quick_reply_messages_.erase(emoji);
}
} else {
auto &message_ids = dice_messages_[emoji];
auto is_deleted = message_ids.erase(message_full_id) > 0;
LOG_CHECK(is_deleted) << source << ' ' << emoji << ' ' << value << ' ' << message_full_id;
if (message_ids.empty()) {
dice_messages_.erase(emoji);
}
} }
} }
@ -5935,7 +5963,7 @@ void StickersManager::register_emoji(const string &emoji, CustomEmojiId custom_e
if (quick_reply_message_full_id.is_valid()) { if (quick_reply_message_full_id.is_valid()) {
emoji_messages.quick_reply_message_full_ids_.insert(quick_reply_message_full_id); emoji_messages.quick_reply_message_full_ids_.insert(quick_reply_message_full_id);
} else { } else {
CHECK(message_full_id.get_message_id().is_valid()); CHECK(message_full_id.get_dialog_id().is_valid());
emoji_messages.message_full_ids_.insert(message_full_id); emoji_messages.message_full_ids_.insert(message_full_id);
} }
return; return;
@ -5953,7 +5981,7 @@ void StickersManager::register_emoji(const string &emoji, CustomEmojiId custom_e
if (quick_reply_message_full_id.is_valid()) { if (quick_reply_message_full_id.is_valid()) {
emoji_messages.quick_reply_message_full_ids_.insert(quick_reply_message_full_id); emoji_messages.quick_reply_message_full_ids_.insert(quick_reply_message_full_id);
} else { } else {
CHECK(message_full_id.get_message_id().is_valid()); CHECK(message_full_id.get_dialog_id().is_valid());
emoji_messages.message_full_ids_.insert(message_full_id); emoji_messages.message_full_ids_.insert(message_full_id);
} }
} }
@ -5975,7 +6003,6 @@ void StickersManager::unregister_emoji(const string &emoji, CustomEmojiId custom
auto is_deleted = it->second->quick_reply_message_full_ids_.erase(quick_reply_message_full_id) > 0; auto is_deleted = it->second->quick_reply_message_full_ids_.erase(quick_reply_message_full_id) > 0;
LOG_CHECK(is_deleted) << source << ' ' << custom_emoji_id << ' ' << quick_reply_message_full_id; LOG_CHECK(is_deleted) << source << ' ' << custom_emoji_id << ' ' << quick_reply_message_full_id;
} else { } else {
CHECK(message_full_id.get_message_id().is_valid());
auto is_deleted = it->second->message_full_ids_.erase(message_full_id) > 0; auto is_deleted = it->second->message_full_ids_.erase(message_full_id) > 0;
LOG_CHECK(is_deleted) << source << ' ' << custom_emoji_id << ' ' << message_full_id; LOG_CHECK(is_deleted) << source << ' ' << custom_emoji_id << ' ' << message_full_id;
} }
@ -5991,7 +6018,6 @@ void StickersManager::unregister_emoji(const string &emoji, CustomEmojiId custom
auto is_deleted = it->second->quick_reply_message_full_ids_.erase(quick_reply_message_full_id) > 0; auto is_deleted = it->second->quick_reply_message_full_ids_.erase(quick_reply_message_full_id) > 0;
LOG_CHECK(is_deleted) << source << ' ' << custom_emoji_id << ' ' << quick_reply_message_full_id; LOG_CHECK(is_deleted) << source << ' ' << custom_emoji_id << ' ' << quick_reply_message_full_id;
} else { } else {
CHECK(message_full_id.get_message_id().is_valid());
auto is_deleted = it->second->message_full_ids_.erase(message_full_id) > 0; auto is_deleted = it->second->message_full_ids_.erase(message_full_id) > 0;
LOG_CHECK(is_deleted) << source << ' ' << custom_emoji_id << ' ' << message_full_id; LOG_CHECK(is_deleted) << source << ' ' << custom_emoji_id << ' ' << message_full_id;
} }

View File

@ -111,9 +111,11 @@ class StickersManager final : public Actor {
void unregister_premium_gift(int32 months, MessageFullId message_full_id, const char *source); void unregister_premium_gift(int32 months, MessageFullId message_full_id, const char *source);
void register_dice(const string &emoji, int32 value, MessageFullId message_full_id, const char *source); void register_dice(const string &emoji, int32 value, MessageFullId message_full_id,
QuickReplyMessageFullId quick_reply_message_full_id, const char *source);
void unregister_dice(const string &emoji, int32 value, MessageFullId message_full_id, const char *source); void unregister_dice(const string &emoji, int32 value, MessageFullId message_full_id,
QuickReplyMessageFullId quick_reply_message_full_id, const char *source);
void register_emoji(const string &emoji, CustomEmojiId custom_emoji_id, MessageFullId message_full_id, void register_emoji(const string &emoji, CustomEmojiId custom_emoji_id, MessageFullId message_full_id,
QuickReplyMessageFullId quick_reply_message_full_id, const char *source); QuickReplyMessageFullId quick_reply_message_full_id, const char *source);
@ -1133,6 +1135,7 @@ class StickersManager final : public Actor {
FlatHashMap<int32, unique_ptr<GiftPremiumMessages>> premium_gift_messages_; FlatHashMap<int32, unique_ptr<GiftPremiumMessages>> premium_gift_messages_;
FlatHashMap<string, WaitFreeHashSet<MessageFullId, MessageFullIdHash>> dice_messages_; FlatHashMap<string, WaitFreeHashSet<MessageFullId, MessageFullIdHash>> dice_messages_;
FlatHashMap<string, WaitFreeHashSet<QuickReplyMessageFullId, QuickReplyMessageFullIdHash>> dice_quick_reply_messages_;
struct EmojiMessages { struct EmojiMessages {
WaitFreeHashSet<MessageFullId, MessageFullIdHash> message_full_ids_; WaitFreeHashSet<MessageFullId, MessageFullIdHash> message_full_ids_;