Add MessageReactis::add_reaction/remove_reaction.
This commit is contained in:
parent
e0699944b3
commit
28d3d1ab37
@ -414,7 +414,7 @@ void MessageReaction::update_recent_chooser_dialog_ids(const MessageReaction &ol
|
|||||||
recent_chooser_min_channels_ = old_reaction.recent_chooser_min_channels_;
|
recent_chooser_min_channels_ = old_reaction.recent_chooser_min_channels_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageReaction::set_is_chosen(bool is_chosen, DialogId chooser_dialog_id, bool can_get_added_reactions) {
|
void MessageReaction::set_is_chosen(bool is_chosen, DialogId chooser_dialog_id, bool have_recent_choosers) {
|
||||||
if (is_chosen_ == is_chosen) {
|
if (is_chosen_ == is_chosen) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -423,7 +423,7 @@ void MessageReaction::set_is_chosen(bool is_chosen, DialogId chooser_dialog_id,
|
|||||||
|
|
||||||
if (chooser_dialog_id.is_valid()) {
|
if (chooser_dialog_id.is_valid()) {
|
||||||
choose_count_ += is_chosen_ ? 1 : -1;
|
choose_count_ += is_chosen_ ? 1 : -1;
|
||||||
if (can_get_added_reactions) {
|
if (have_recent_choosers) {
|
||||||
remove_recent_chooser_dialog_id(chooser_dialog_id);
|
remove_recent_chooser_dialog_id(chooser_dialog_id);
|
||||||
if (is_chosen_) {
|
if (is_chosen_) {
|
||||||
add_recent_chooser_dialog_id(chooser_dialog_id);
|
add_recent_chooser_dialog_id(chooser_dialog_id);
|
||||||
@ -601,6 +601,58 @@ void MessageReactions::update_from(const MessageReactions &old_reactions) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MessageReactions::add_reaction(const string &reaction, bool is_big, DialogId chooser_dialog_id,
|
||||||
|
bool have_recent_choosers) {
|
||||||
|
bool is_found = false;
|
||||||
|
for (auto it = reactions_.begin(); it != reactions_.end();) {
|
||||||
|
auto &message_reaction = *it;
|
||||||
|
if (message_reaction.is_chosen()) {
|
||||||
|
if (message_reaction.get_reaction() == reaction && !is_big) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
message_reaction.set_is_chosen(false, chooser_dialog_id, have_recent_choosers);
|
||||||
|
}
|
||||||
|
if (message_reaction.get_reaction() == reaction) {
|
||||||
|
message_reaction.set_is_chosen(true, chooser_dialog_id, have_recent_choosers);
|
||||||
|
is_found = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (message_reaction.is_empty()) {
|
||||||
|
it = reactions_.erase(it);
|
||||||
|
} else {
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_found) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<DialogId> recent_chooser_dialog_ids;
|
||||||
|
if (have_recent_choosers) {
|
||||||
|
recent_chooser_dialog_ids.push_back(chooser_dialog_id);
|
||||||
|
}
|
||||||
|
reactions_.emplace_back(reaction, 1, true, std::move(recent_chooser_dialog_ids), Auto());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MessageReactions::remove_reaction(const string &reaction, DialogId chooser_dialog_id, bool have_recent_choosers) {
|
||||||
|
for (auto it = reactions_.begin(); it != reactions_.end(); ++it) {
|
||||||
|
auto &message_reaction = *it;
|
||||||
|
if (message_reaction.get_reaction() == reaction) {
|
||||||
|
if (message_reaction.is_chosen()) {
|
||||||
|
message_reaction.set_is_chosen(false, chooser_dialog_id, have_recent_choosers);
|
||||||
|
if (message_reaction.is_empty()) {
|
||||||
|
it = reactions_.erase(it);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void MessageReactions::sort_reactions(const FlatHashMap<string, size_t> &active_reaction_pos) {
|
void MessageReactions::sort_reactions(const FlatHashMap<string, size_t> &active_reaction_pos) {
|
||||||
std::sort(reactions_.begin(), reactions_.end(),
|
std::sort(reactions_.begin(), reactions_.end(),
|
||||||
[&active_reaction_pos](const MessageReaction &lhs, const MessageReaction &rhs) {
|
[&active_reaction_pos](const MessageReaction &lhs, const MessageReaction &rhs) {
|
||||||
|
@ -63,7 +63,7 @@ class MessageReaction {
|
|||||||
return is_chosen_;
|
return is_chosen_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_is_chosen(bool is_chosen, DialogId chooser_dialog_id, bool can_get_added_reactions);
|
void set_is_chosen(bool is_chosen, DialogId chooser_dialog_id, bool have_recent_choosers);
|
||||||
|
|
||||||
int32 get_choose_count() const {
|
int32 get_choose_count() const {
|
||||||
return choose_count_;
|
return choose_count_;
|
||||||
@ -152,6 +152,10 @@ struct MessageReactions {
|
|||||||
|
|
||||||
void update_from(const MessageReactions &old_reactions);
|
void update_from(const MessageReactions &old_reactions);
|
||||||
|
|
||||||
|
bool add_reaction(const string &reaction, bool is_big, DialogId chooser_dialog_id, bool have_recent_choosers);
|
||||||
|
|
||||||
|
bool remove_reaction(const string &reaction, DialogId chooser_dialog_id, bool have_recent_choosers);
|
||||||
|
|
||||||
void sort_reactions(const FlatHashMap<string, size_t> &active_reaction_pos);
|
void sort_reactions(const FlatHashMap<string, size_t> &active_reaction_pos);
|
||||||
|
|
||||||
void fix_chosen_reaction(DialogId my_dialog_id);
|
void fix_chosen_reaction(DialogId my_dialog_id);
|
||||||
|
@ -24526,7 +24526,7 @@ void MessagesManager::add_message_reaction(FullMessageId full_message_id, string
|
|||||||
return promise.set_error(Status::Error(400, "Chat not found"));
|
return promise.set_error(Status::Error(400, "Chat not found"));
|
||||||
}
|
}
|
||||||
|
|
||||||
Message *m = get_message_force(d, full_message_id.get_message_id(), "set_message_reaction");
|
Message *m = get_message_force(d, full_message_id.get_message_id(), "add_message_reaction");
|
||||||
if (m == nullptr) {
|
if (m == nullptr) {
|
||||||
return promise.set_error(Status::Error(400, "Message not found"));
|
return promise.set_error(Status::Error(400, "Message not found"));
|
||||||
}
|
}
|
||||||
@ -24535,42 +24535,16 @@ void MessagesManager::add_message_reaction(FullMessageId full_message_id, string
|
|||||||
return promise.set_error(Status::Error(400, "The reaction isn't available for the message"));
|
return promise.set_error(Status::Error(400, "The reaction isn't available for the message"));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool can_get_added_reactions = !is_broadcast_channel(dialog_id) && dialog_id.get_type() != DialogType::User &&
|
bool have_recent_choosers = !is_broadcast_channel(dialog_id) && !is_discussion_message(dialog_id, m);
|
||||||
!is_discussion_message(dialog_id, m);
|
|
||||||
if (m->reactions == nullptr) {
|
if (m->reactions == nullptr) {
|
||||||
m->reactions = make_unique<MessageReactions>();
|
m->reactions = make_unique<MessageReactions>();
|
||||||
m->reactions->can_get_added_reactions_ = can_get_added_reactions;
|
m->reactions->can_get_added_reactions_ = have_recent_choosers && dialog_id.get_type() != DialogType::User;
|
||||||
m->available_reactions_generation = d->available_reactions_generation;
|
m->available_reactions_generation = d->available_reactions_generation;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_found = false;
|
if (!m->reactions->add_reaction(reaction, is_big, get_my_dialog_id(), have_recent_choosers)) {
|
||||||
for (auto it = m->reactions->reactions_.begin(); it != m->reactions->reactions_.end();) {
|
|
||||||
auto &message_reaction = *it;
|
|
||||||
if (message_reaction.is_chosen()) {
|
|
||||||
if (message_reaction.get_reaction() == reaction && !is_big) {
|
|
||||||
return promise.set_value(Unit());
|
return promise.set_value(Unit());
|
||||||
}
|
}
|
||||||
message_reaction.set_is_chosen(false, get_my_dialog_id(), can_get_added_reactions);
|
|
||||||
}
|
|
||||||
if (message_reaction.get_reaction() == reaction) {
|
|
||||||
message_reaction.set_is_chosen(true, get_my_dialog_id(), can_get_added_reactions);
|
|
||||||
is_found = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (message_reaction.is_empty()) {
|
|
||||||
it = m->reactions->reactions_.erase(it);
|
|
||||||
} else {
|
|
||||||
++it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!is_found) {
|
|
||||||
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());
|
|
||||||
}
|
|
||||||
|
|
||||||
set_message_reactions(d, m, is_big, add_to_recent, std::move(promise));
|
set_message_reactions(d, m, is_big, add_to_recent, std::move(promise));
|
||||||
}
|
}
|
||||||
@ -24582,36 +24556,13 @@ void MessagesManager::remove_message_reaction(FullMessageId full_message_id, str
|
|||||||
return promise.set_error(Status::Error(400, "Chat not found"));
|
return promise.set_error(Status::Error(400, "Chat not found"));
|
||||||
}
|
}
|
||||||
|
|
||||||
Message *m = get_message_force(d, full_message_id.get_message_id(), "set_message_reaction");
|
Message *m = get_message_force(d, full_message_id.get_message_id(), "remove_message_reaction");
|
||||||
if (m == nullptr) {
|
if (m == nullptr) {
|
||||||
return promise.set_error(Status::Error(400, "Message not found"));
|
return promise.set_error(Status::Error(400, "Message not found"));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool can_get_added_reactions = !is_broadcast_channel(dialog_id) && dialog_id.get_type() != DialogType::User &&
|
bool have_recent_choosers = !is_broadcast_channel(dialog_id) && !is_discussion_message(dialog_id, m);
|
||||||
!is_discussion_message(dialog_id, m);
|
if (m->reactions == nullptr || !m->reactions->remove_reaction(reaction, get_my_dialog_id(), have_recent_choosers)) {
|
||||||
if (m->reactions == nullptr) {
|
|
||||||
return promise.set_value(Unit());
|
|
||||||
}
|
|
||||||
|
|
||||||
bool is_found = false;
|
|
||||||
for (auto it = m->reactions->reactions_.begin(); it != m->reactions->reactions_.end();) {
|
|
||||||
auto &message_reaction = *it;
|
|
||||||
if (message_reaction.get_reaction() == reaction) {
|
|
||||||
if (message_reaction.is_chosen()) {
|
|
||||||
message_reaction.set_is_chosen(false, get_my_dialog_id(), can_get_added_reactions);
|
|
||||||
is_found = true;
|
|
||||||
} else {
|
|
||||||
return promise.set_value(Unit());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (message_reaction.is_empty()) {
|
|
||||||
it = m->reactions->reactions_.erase(it);
|
|
||||||
} else {
|
|
||||||
++it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!is_found) {
|
|
||||||
return promise.set_value(Unit());
|
return promise.set_value(Unit());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user