Improve updateAvailableMessageEffects.

This commit is contained in:
levlam 2024-05-14 14:04:12 +03:00
parent d9942a5765
commit aa09223b9c
4 changed files with 68 additions and 10 deletions

View File

@ -7266,8 +7266,10 @@ updateWebAppMessageSent web_app_launch_id:int64 = Update;
//@description The list of active emoji reactions has changed @emojis The new list of active emoji reactions
updateActiveEmojiReactions emojis:vector<string> = Update;
//@description The list of available message effects has changed @effect_ids The new list of available message effects. Emoji reaction effects are guaranteed to be returned before sticker effects
updateAvailableMessageEffects effect_ids:vector<int64> = Update;
//@description The list of available message effects has changed
//@reaction_effect_ids The new list of available message effects from emoji reactions
//@sticker_effect_ids The new list of available message effects from Premium stickers
updateAvailableMessageEffects reaction_effect_ids:vector<int64> sticker_effect_ids:vector<int64> = Update;
//@description The type of default reaction has changed @reaction_type The new type of the default reaction
updateDefaultReactionType reaction_type:ReactionType = Update;

View File

@ -1226,7 +1226,9 @@ td_api::object_ptr<td_api::messageEffect> ReactionManager::get_message_effect_ob
td_api::object_ptr<td_api::updateAvailableMessageEffects> ReactionManager::get_update_available_message_effects_object()
const {
return td_api::make_object<td_api::updateAvailableMessageEffects>(vector<int64>(active_message_effects_));
return td_api::make_object<td_api::updateAvailableMessageEffects>(
vector<int64>(active_message_effects_.reaction_effects_),
vector<int64>(active_message_effects_.sticker_effects_));
}
void ReactionManager::reload_message_effects() {
@ -1391,7 +1393,8 @@ void ReactionManager::on_get_message_effects(
}
void ReactionManager::save_active_message_effects() {
LOG(INFO) << "Save " << active_message_effects_.size() << " available message effects";
LOG(INFO) << "Save " << active_message_effects_.reaction_effects_.size() << " + "
<< active_message_effects_.sticker_effects_.size() << " available message effects";
G()->td_db()->get_binlog_pmc()->set("active_message_effects",
log_event_store(active_message_effects_).as_slice().str());
}
@ -1410,17 +1413,23 @@ void ReactionManager::load_active_message_effects() {
return reload_message_effects();
}
LOG(INFO) << "Successfully loaded " << active_message_effects_.size() << " active message effects";
LOG(INFO) << "Successfully loaded " << active_message_effects_.reaction_effects_.size() << " + "
<< active_message_effects_.sticker_effects_.size() << " active message effects";
send_closure(G()->td(), &Td::send_update, get_update_available_message_effects_object());
}
void ReactionManager::update_active_message_effects() {
vector<int64> active_message_effects;
ActiveEffects active_message_effects;
for (auto &effect : message_effects_.effects_) {
active_message_effects.push_back(effect.id_);
if (effect.is_sticker()) {
active_message_effects.sticker_effects_.push_back(effect.id_);
} else {
active_message_effects.reaction_effects_.push_back(effect.id_);
}
}
if (active_message_effects == active_message_effects_) {
if (active_message_effects.reaction_effects_ == active_message_effects_.reaction_effects_ &&
active_message_effects.sticker_effects_ == active_message_effects_.sticker_effects_) {
return;
}
active_message_effects_ = std::move(active_message_effects);
@ -1454,7 +1463,7 @@ void ReactionManager::get_current_state(vector<td_api::object_ptr<td_api::Update
for (auto &it : topic_tags_) {
updates.push_back(get_update_saved_messages_tags_object(it.first, it.second.get()));
}
if (!active_message_effects_.empty()) {
if (!active_message_effects_.is_empty()) {
updates.push_back(get_update_available_message_effects_object());
}
}

View File

@ -228,6 +228,21 @@ class ReactionManager final : public Actor {
void parse(ParserT &parser);
};
struct ActiveEffects {
vector<int64> reaction_effects_;
vector<int64> sticker_effects_;
bool is_empty() const {
return reaction_effects_.empty() && sticker_effects_.empty();
}
template <class StorerT>
void store(StorerT &storer) const;
template <class ParserT>
void parse(ParserT &parser);
};
td_api::object_ptr<td_api::emojiReaction> get_emoji_reaction_object(const string &emoji) const;
ReactionList &get_reaction_list(ReactionListType reaction_list_type);
@ -314,7 +329,7 @@ class ReactionManager final : public Actor {
pending_get_topic_saved_reaction_tags_queries_;
Effects message_effects_;
vector<int64> active_message_effects_;
ActiveEffects active_message_effects_;
vector<std::pair<int64, Promise<td_api::object_ptr<td_api::messageEffect>>>> pending_get_message_effect_queries_;
};

View File

@ -185,4 +185,36 @@ void ReactionManager::Effects::parse(ParserT &parser) {
}
}
template <class StorerT>
void ReactionManager::ActiveEffects::store(StorerT &storer) const {
bool has_reaction_effects = !reaction_effects_.empty();
bool has_sticker_effects = !sticker_effects_.empty();
BEGIN_STORE_FLAGS();
STORE_FLAG(has_reaction_effects);
STORE_FLAG(has_sticker_effects);
END_STORE_FLAGS();
if (has_reaction_effects) {
td::store(reaction_effects_, storer);
}
if (has_sticker_effects) {
td::store(sticker_effects_, storer);
}
}
template <class ParserT>
void ReactionManager::ActiveEffects::parse(ParserT &parser) {
bool has_reaction_effects;
bool has_sticker_effects;
BEGIN_PARSE_FLAGS();
PARSE_FLAG(has_reaction_effects);
PARSE_FLAG(has_sticker_effects);
END_PARSE_FLAGS();
if (has_reaction_effects) {
td::parse(reaction_effects_, parser);
}
if (has_sticker_effects) {
td::parse(sticker_effects_, parser);
}
}
} // namespace td