Sort message reactions by the number of choosers.
This commit is contained in:
parent
9eb3a9a403
commit
bad018bc32
@ -276,6 +276,23 @@ void MessageReactions::update_from(const MessageReactions &old_reactions) {
|
||||
}
|
||||
}
|
||||
|
||||
void MessageReactions::sort(const std::unordered_map<string, size_t> &active_reaction_pos) {
|
||||
std::sort(reactions_.begin(), reactions_.end(), [&active_reaction_pos](const MessageReaction &lhs, const MessageReaction &rhs) {
|
||||
if (lhs.get_choose_count() != rhs.get_choose_count()) {
|
||||
return lhs.get_choose_count() > rhs.get_choose_count();
|
||||
}
|
||||
auto lhs_it = active_reaction_pos.find(lhs.get_reaction());
|
||||
auto lhs_pos = lhs_it != active_reaction_pos.end() ? lhs_it->second : active_reaction_pos.size();
|
||||
auto rhs_it = active_reaction_pos.find(rhs.get_reaction());
|
||||
auto rhs_pos = rhs_it != active_reaction_pos.end() ? rhs_it->second : active_reaction_pos.size();
|
||||
if (lhs_pos != rhs_pos) {
|
||||
return lhs_pos < rhs_pos;
|
||||
}
|
||||
|
||||
return lhs.get_reaction() < rhs.get_reaction();
|
||||
});
|
||||
}
|
||||
|
||||
bool MessageReactions::need_update_message_reactions(const MessageReactions *old_reactions,
|
||||
const MessageReactions *new_reactions) {
|
||||
if (old_reactions == nullptr) {
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include "td/utils/common.h"
|
||||
#include "td/utils/StringBuilder.h"
|
||||
|
||||
#include <unordered_map>
|
||||
#include <utility>
|
||||
|
||||
namespace td {
|
||||
@ -64,6 +65,10 @@ class MessageReaction {
|
||||
|
||||
void set_is_chosen(bool is_chosen, DialogId chooser_dialog_id = DialogId());
|
||||
|
||||
int32 get_choose_count() const {
|
||||
return choose_count_;
|
||||
}
|
||||
|
||||
const vector<DialogId> &get_recent_chooser_dialog_ids() const {
|
||||
return recent_chooser_dialog_ids_;
|
||||
}
|
||||
@ -104,6 +109,8 @@ struct MessageReactions {
|
||||
|
||||
void update_from(const MessageReactions &old_reactions);
|
||||
|
||||
void sort(const std::unordered_map<string, size_t> &active_reaction_pos);
|
||||
|
||||
static bool need_update_message_reactions(const MessageReactions *old_reactions,
|
||||
const MessageReactions *new_reactions);
|
||||
|
||||
|
@ -7012,6 +7012,9 @@ bool MessagesManager::update_message_interaction_info(DialogId dialog_id, Messag
|
||||
if (has_reactions && reactions != nullptr && m->reactions != nullptr) {
|
||||
reactions->update_from(*m->reactions);
|
||||
}
|
||||
if (has_reactions && reactions != nullptr) {
|
||||
reactions->sort(active_reaction_pos_);
|
||||
}
|
||||
bool need_update_reactions =
|
||||
has_reactions && MessageReactions::need_update_message_reactions(m->reactions.get(), reactions.get());
|
||||
if (view_count > m->view_count || forward_count > m->forward_count || need_update_reply_info ||
|
||||
@ -8263,6 +8266,9 @@ void MessagesManager::set_active_reactions(vector<string> active_reactions) {
|
||||
|
||||
auto old_active_reactions = std::move(active_reactions_);
|
||||
active_reactions_ = std::move(active_reactions);
|
||||
for (size_t i = 0; i < active_reactions_.size(); i++) {
|
||||
active_reaction_pos_[active_reactions_[i]] = i;
|
||||
}
|
||||
|
||||
for (const auto &dialog : dialogs_) {
|
||||
const Dialog *d = dialog.second.get();
|
||||
@ -23774,13 +23780,13 @@ void MessagesManager::set_message_reaction(FullMessageId full_message_id, string
|
||||
}
|
||||
// m->reactions->has_pending_reaction_ = true;
|
||||
if (!is_found && !reaction.empty()) {
|
||||
// TODO place to the correct position
|
||||
vector<DialogId> recent_chooser_dialog_ids;
|
||||
if (!is_broadcast_channel(dialog_id)) {
|
||||
recent_chooser_dialog_ids.push_back(get_my_dialog_id());
|
||||
}
|
||||
m->reactions->reactions_.emplace_back(reaction, 1, true, std::move(recent_chooser_dialog_ids), Auto());
|
||||
}
|
||||
m->reactions->sort(active_reaction_pos_);
|
||||
|
||||
send_update_message_interaction_info(dialog_id, m);
|
||||
on_message_changed(d, m, true, "set_message_reaction");
|
||||
|
@ -3603,6 +3603,7 @@ class MessagesManager final : public Actor {
|
||||
std::unordered_map<DialogId, MessageId, DialogIdHash> previous_repaired_read_inbox_max_message_id_;
|
||||
|
||||
vector<string> active_reactions_;
|
||||
std::unordered_map<string, size_t> active_reaction_pos_;
|
||||
|
||||
uint32 scheduled_messages_sync_generation_ = 1;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user