From cb98c0a10afb245da06dbefcefdf44d6aea1fa3e Mon Sep 17 00:00:00 2001 From: levlam Date: Thu, 9 Jun 2022 01:07:53 +0300 Subject: [PATCH] Add class AvailableReaction. --- CMakeLists.txt | 2 ++ td/telegram/AvailableReaction.cpp | 19 ++++++++++++++++ td/telegram/AvailableReaction.h | 31 ++++++++++++++++++++++++++ td/telegram/MessagesManager.cpp | 37 +++++++++++++++---------------- td/telegram/MessagesManager.h | 14 ++++++------ td/telegram/StickersManager.cpp | 4 ++-- td/telegram/Td.cpp | 5 ++--- 7 files changed, 81 insertions(+), 31 deletions(-) create mode 100644 td/telegram/AvailableReaction.cpp create mode 100644 td/telegram/AvailableReaction.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 25bdef47d..ab7cb483e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -283,6 +283,7 @@ set(TDLIB_SOURCE td/telegram/AudiosManager.cpp td/telegram/AuthManager.cpp td/telegram/AutoDownloadSettings.cpp + td/telegram/AvailableReaction.cpp td/telegram/BackgroundManager.cpp td/telegram/BackgroundType.cpp td/telegram/BotCommand.cpp @@ -480,6 +481,7 @@ set(TDLIB_SOURCE td/telegram/AudiosManager.h td/telegram/AuthManager.h td/telegram/AutoDownloadSettings.h + td/telegram/AvailableReaction.h td/telegram/BackgroundId.h td/telegram/BackgroundManager.h td/telegram/BackgroundType.h diff --git a/td/telegram/AvailableReaction.cpp b/td/telegram/AvailableReaction.cpp new file mode 100644 index 000000000..2d7bea14e --- /dev/null +++ b/td/telegram/AvailableReaction.cpp @@ -0,0 +1,19 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +#include "td/telegram/AvailableReaction.h" + +namespace td { + +td_api::object_ptr AvailableReaction::get_available_reaction_object() const { + return td_api::make_object(reaction_, is_premium_); +} + +bool operator==(const AvailableReaction &lhs, const AvailableReaction &rhs) { + return lhs.reaction_ == rhs.reaction_ && lhs.is_premium_ == rhs.is_premium_; +} + +} // namespace td diff --git a/td/telegram/AvailableReaction.h b/td/telegram/AvailableReaction.h new file mode 100644 index 000000000..31a872334 --- /dev/null +++ b/td/telegram/AvailableReaction.h @@ -0,0 +1,31 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +#pragma once + +#include "td/telegram/td_api.h" + +#include "td/utils/common.h" + +namespace td { + +struct AvailableReaction { + string reaction_; + bool is_premium_; + + AvailableReaction(const string &reaction, bool is_premium) : reaction_(reaction), is_premium_(is_premium) { + } + + td_api::object_ptr get_available_reaction_object() const; +}; + +bool operator==(const AvailableReaction &lhs, const AvailableReaction &rhs); + +inline bool operator!=(const AvailableReaction &lhs, const AvailableReaction &rhs) { + return !(lhs == rhs); +} + +} // namespace td diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 31fe39958..3e809b267 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -8199,7 +8199,7 @@ void MessagesManager::hide_dialog_message_reactions(Dialog *d) { } } -void MessagesManager::set_active_reactions(vector> active_reactions) { +void MessagesManager::set_active_reactions(vector active_reactions) { if (active_reactions == active_reactions_) { return; } @@ -8209,8 +8209,8 @@ void MessagesManager::set_active_reactions(vector> activ active_reaction_pos_.clear(); bool is_changed = old_active_reactions.size() != active_reactions_.size(); for (size_t i = 0; i < active_reactions_.size(); i++) { - active_reaction_pos_[active_reactions_[i].first] = i; - if (!is_changed && active_reactions_[i].first != old_active_reactions[i].first) { + active_reaction_pos_[active_reactions_[i].reaction_] = i; + if (!is_changed && active_reactions_[i].reaction_ != old_active_reactions[i].reaction_) { is_changed = true; } } @@ -8253,7 +8253,7 @@ vector MessagesManager::get_active_reactions(const vector &avail } vector MessagesManager::get_active_reactions(const vector &available_reactions, - const vector> &active_reactions) { + const vector &active_reactions) { if (available_reactions.empty()) { // fast path return available_reactions; @@ -8261,7 +8261,7 @@ vector MessagesManager::get_active_reactions(const vector &avail if (available_reactions.size() == active_reactions.size()) { size_t i; for (i = 0; i < available_reactions.size(); i++) { - if (available_reactions[i] != active_reactions[i].first) { + if (available_reactions[i] != active_reactions[i].reaction_) { break; } } @@ -8273,18 +8273,18 @@ vector MessagesManager::get_active_reactions(const vector &avail vector result; for (const auto &active_reaction : active_reactions) { - if (td::contains(available_reactions, active_reaction.first)) { - result.push_back(active_reaction.first); + if (td::contains(available_reactions, active_reaction.reaction_)) { + result.push_back(active_reaction.reaction_); } } return result; } MessagesManager::AvailableReactionType MessagesManager::get_reaction_type( - const vector> &reactions, const string &reaction) { - for (auto &reaction_premium : reactions) { - if (reaction_premium.first == reaction) { - if (reaction_premium.second) { + const vector &available_reactions, const string &reaction) { + for (auto &available_reaction : available_reactions) { + if (available_reaction.reaction_ == reaction) { + if (available_reaction.is_premium_) { return AvailableReactionType::NeedsPremium; } return AvailableReactionType::Available; @@ -8297,7 +8297,7 @@ vector MessagesManager::get_dialog_active_reactions(const Dialog *d) con CHECK(d != nullptr); switch (d->dialog_id.get_type()) { case DialogType::User: - return transform(active_reactions_, [](auto &reaction) { return reaction.first; }); + return transform(active_reactions_, [](auto &reaction) { return reaction.reaction_; }); case DialogType::Chat: case DialogType::Channel: return get_active_reactions(d->available_reactions); @@ -24264,8 +24264,7 @@ void MessagesManager::on_get_scheduled_messages_from_database(DialogId dialog_id set_promises(promises); } -Result>> MessagesManager::get_message_available_reactions( - FullMessageId full_message_id) { +Result> MessagesManager::get_message_available_reactions(FullMessageId full_message_id) { auto dialog_id = full_message_id.get_dialog_id(); Dialog *d = get_dialog_force(dialog_id, "get_message_available_reactions"); if (d == nullptr) { @@ -24279,7 +24278,7 @@ Result>> MessagesManager::get_message_available_r return get_message_available_reactions(d, m); } -vector> MessagesManager::get_message_available_reactions(const Dialog *d, const Message *m) { +vector MessagesManager::get_message_available_reactions(const Dialog *d, const Message *m) { CHECK(d != nullptr); CHECK(m != nullptr); auto active_reactions = get_message_active_reactions(d, m); @@ -24288,16 +24287,16 @@ vector> MessagesManager::get_message_available_reactions } bool is_premium = G()->shared_config().get_option_boolean("is_premium"); - vector> result; + vector result; int64 reactions_uniq_max = G()->shared_config().get_option_integer("reactions_uniq_max", 11); bool can_add_new_reactions = m->reactions == nullptr || static_cast(m->reactions->reactions_.size()) < reactions_uniq_max; // can add only active available reactions or remove previously set reaction for (const auto &active_reaction : active_reactions_) { // can add the reaction if it has already been used for the message or is available in the chat - bool is_set = (m->reactions != nullptr && m->reactions->get_reaction(active_reaction.first) != nullptr); - if (is_set || (can_add_new_reactions && td::contains(active_reactions, active_reaction.first))) { - result.emplace_back(active_reaction.first, !is_premium && active_reaction.second && !is_set); + bool is_set = (m->reactions != nullptr && m->reactions->get_reaction(active_reaction.reaction_) != nullptr); + if (is_set || (can_add_new_reactions && td::contains(active_reactions, active_reaction.reaction_))) { + result.emplace_back(active_reaction.reaction_, !is_premium && active_reaction.is_premium_ && !is_set); } } if (m->reactions != nullptr) { diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index adb79e283..e95ef26fe 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -8,6 +8,7 @@ #include "td/telegram/AccessRights.h" #include "td/telegram/AffectedHistory.h" +#include "td/telegram/AvailableReaction.h" #include "td/telegram/ChannelId.h" #include "td/telegram/DialogAction.h" #include "td/telegram/DialogDate.h" @@ -535,7 +536,7 @@ class MessagesManager final : public Actor { void set_dialog_description(DialogId dialog_id, const string &description, Promise &&promise); - void set_active_reactions(vector> active_reactions); + void set_active_reactions(vector active_reactions); void set_dialog_available_reactions(DialogId dialog_id, vector available_reactions, Promise &&promise); @@ -801,7 +802,7 @@ class MessagesManager final : public Actor { vector get_dialog_scheduled_messages(DialogId dialog_id, bool force, bool ignore_result, Promise &&promise); - Result>> get_message_available_reactions(FullMessageId full_message_id); + Result> get_message_available_reactions(FullMessageId full_message_id); void set_message_reaction(FullMessageId full_message_id, string reaction, bool is_big, Promise &&promise); @@ -2646,7 +2647,7 @@ class MessagesManager final : public Actor { bool update_dialog_silent_send_message(Dialog *d, bool silent_send_message); - vector> get_message_available_reactions(const Dialog *d, const Message *m); + vector get_message_available_reactions(const Dialog *d, const Message *m); void on_set_message_reaction(FullMessageId full_message_id, Result result, Promise promise); @@ -2659,11 +2660,10 @@ class MessagesManager final : public Actor { vector get_active_reactions(const vector &available_reactions) const; static vector get_active_reactions(const vector &available_reactions, - const vector> &active_reactions); + const vector &active_reactions); enum class AvailableReactionType { Unavailable, Available, NeedsPremium }; - static AvailableReactionType get_reaction_type(const vector> &reactions, - const string &reaction); + static AvailableReactionType get_reaction_type(const vector &reactions, const string &reaction); vector get_dialog_active_reactions(const Dialog *d) const; @@ -3690,7 +3690,7 @@ class MessagesManager final : public Actor { }; FlatHashMap pending_reactions_; - vector> active_reactions_; + vector active_reactions_; FlatHashMap active_reaction_pos_; uint32 scheduled_messages_sync_generation_ = 1; diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index f7637095a..5a41a75b7 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -8,6 +8,7 @@ #include "td/telegram/AccessRights.h" #include "td/telegram/AuthManager.h" +#include "td/telegram/AvailableReaction.h" #include "td/telegram/ConfigManager.h" #include "td/telegram/ConfigShared.h" #include "td/telegram/ContactsManager.h" @@ -65,7 +66,6 @@ #include #include #include -#include namespace td { @@ -3278,7 +3278,7 @@ void StickersManager::load_reactions() { } void StickersManager::update_active_reactions() { - vector> active_reactions; + vector active_reactions; for (auto &reaction : reactions_.reactions_) { if (reaction.is_active_) { active_reactions.emplace_back(reaction.reaction_, reaction.is_premium_); diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index 8990448a6..90c6dbc2a 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -5319,9 +5319,8 @@ void Td::on_request(uint64 id, const td_api::getMessageAvailableReactions &reque if (r_reactions.is_error()) { send_closure(actor_id(this), &Td::send_error, id, r_reactions.move_as_error()); } else { - auto reactions = transform(r_reactions.ok(), [](auto &reaction) { - return td_api::make_object(reaction.first, reaction.second); - }); + auto reactions = + transform(r_reactions.ok(), [](auto &reaction) { return reaction.get_available_reaction_object(); }); send_closure(actor_id(this), &Td::send_result, id, td_api::make_object(std::move(reactions))); }