Add td_api::togglePaidMessageReactionIsAnonymous.

This commit is contained in:
levlam 2024-08-12 15:05:21 +03:00
parent 7644f1c50e
commit f9dcb217d0
8 changed files with 101 additions and 1 deletions

View File

@ -9077,7 +9077,7 @@ removeMessageReaction chat_id:int53 message_id:int53 reaction_type:ReactionType
//@chat_id Identifier of the chat to which the message belongs
//@message_id Identifier of the message
//@star_count Number of Telegram Stars to be used for the reaction; 1-getOption("paid_reaction_star_count_max")
//@is_anonymous Pass true to make all paid reactions of the user anonymous; pass false to make the user's profile visible among top reactors
//@is_anonymous Pass true to make paid reaction of the user on the message anonymous; pass false to make the user's profile visible among top reactors
addPaidMessageReaction chat_id:int53 message_id:int53 star_count:int53 is_anonymous:Bool = Ok;
//@description Removes all pending paid reactions on a message. Can be called within 5 seconds after the last addPaidMessageReaction call
@ -9085,6 +9085,12 @@ addPaidMessageReaction chat_id:int53 message_id:int53 star_count:int53 is_anonym
//@message_id Identifier of the message
removePendingPaidMessageReactions chat_id:int53 message_id:int53 = Ok;
//@description Changes whether the paid message reaction of the user to a message is anonymous. The message must have paid reaction added by the user
//@chat_id Identifier of the chat to which the message belongs
//@message_id Identifier of the message
//@is_anonymous Pass true to make paid reaction of the user on the message anonymous; pass false to make the user's profile visible among top reactors
togglePaidMessageReactionIsAnonymous chat_id:int53 message_id:int53 is_anonymous:Bool = Ok;
//@description Sets reactions on a message; for bots only
//@chat_id Identifier of the chat to which the message belongs
//@message_id Identifier of the message

View File

@ -201,6 +201,43 @@ class SendPaidReactionQuery final : public Td::ResultHandler {
}
};
class TogglePaidReactionPrivacyQuery final : public Td::ResultHandler {
Promise<Unit> promise_;
DialogId dialog_id_;
public:
explicit TogglePaidReactionPrivacyQuery(Promise<Unit> &&promise) : promise_(std::move(promise)) {
}
void send(MessageFullId message_full_id, bool is_anonymous) {
dialog_id_ = message_full_id.get_dialog_id();
auto input_peer = td_->dialog_manager_->get_input_peer(dialog_id_, AccessRights::Read);
if (input_peer == nullptr) {
return on_error(Status::Error(400, "Can't access the chat"));
}
send_query(G()->net_query_creator().create(
telegram_api::messages_togglePaidReactionPrivacy(
std::move(input_peer), message_full_id.get_message_id().get_server_message_id().get(), is_anonymous),
{{dialog_id_}, {message_full_id}}));
}
void on_result(BufferSlice packet) final {
auto result_ptr = fetch_result<telegram_api::messages_togglePaidReactionPrivacy>(packet);
if (result_ptr.is_error()) {
return on_error(result_ptr.move_as_error());
}
promise_.set_value(Unit());
}
void on_error(Status status) final {
td_->dialog_manager_->on_get_dialog_error(dialog_id_, status, "TogglePaidReactionPrivacyQuery");
promise_.set_error(std::move(status));
}
};
class GetMessageReactionsListQuery final : public Td::ResultHandler {
Promise<td_api::object_ptr<td_api::addedReactions>> promise_;
DialogId dialog_id_;
@ -1050,6 +1087,21 @@ void MessageReactions::send_paid_message_reaction(Td *td, MessageFullId message_
->send(message_full_id, star_count, is_anonymous, random_id);
}
bool MessageReactions::toggle_paid_message_reaction_is_anonymous(Td *td, MessageFullId message_full_id,
bool is_anonymous, Promise<Unit> &&promise) {
if (pending_paid_reactions_ != 0) {
pending_is_anonymous_ = is_anonymous;
}
for (auto &top_reactor : top_reactors_) {
if (top_reactor.is_me()) {
top_reactor.add_count(0, is_anonymous);
td->create_handler<TogglePaidReactionPrivacyQuery>(std::move(promise))->send(message_full_id, is_anonymous);
return true;
}
}
return pending_paid_reactions_ != 0;
}
StringBuilder &operator<<(StringBuilder &string_builder, const MessageReactions &reactions) {
if (reactions.are_tags_) {
return string_builder << "MessageTags{" << reactions.reactions_ << '}';

View File

@ -215,6 +215,9 @@ struct MessageReactions {
void send_paid_message_reaction(Td *td, MessageFullId message_full_id, int64 random_id, Promise<Unit> &&promise);
bool toggle_paid_message_reaction_is_anonymous(Td *td, MessageFullId message_full_id, bool is_anonymous,
Promise<Unit> &&promise);
template <class StorerT>
void store(StorerT &storer) const;

View File

@ -22851,6 +22851,26 @@ void MessagesManager::remove_paid_message_reactions(MessageFullId message_full_i
promise.set_value(Unit());
}
void MessagesManager::toggle_paid_message_reaction_is_anonymous(MessageFullId message_full_id, bool is_anonymous,
Promise<Unit> &&promise) {
auto dialog_id = message_full_id.get_dialog_id();
Dialog *d = get_dialog_force(dialog_id, "toggle_paid_message_reaction_is_anonymous");
if (d == nullptr) {
return promise.set_error(Status::Error(400, "Chat not found"));
}
Message *m = get_message_force(d, message_full_id.get_message_id(), "toggle_paid_message_reaction_is_anonymous");
if (m == nullptr) {
return promise.set_error(Status::Error(400, "Message not found"));
}
if (m->reactions == nullptr) {
return promise.set_error(Status::Error(400, "Message has no paid reactions"));
}
if (m->reactions->toggle_paid_message_reaction_is_anonymous(td_, message_full_id, is_anonymous, std::move(promise))) {
send_update_message_interaction_info(d->dialog_id, m);
on_message_changed(d, m, true, "toggle_paid_message_reaction_is_anonymous");
}
}
void MessagesManager::set_message_reactions(Dialog *d, Message *m, bool is_big, bool add_to_recent,
Promise<Unit> &&promise) {
CHECK(m->reactions != nullptr);

View File

@ -801,6 +801,9 @@ class MessagesManager final : public Actor {
void remove_paid_message_reactions(MessageFullId message_full_id, Promise<Unit> &&promise);
void toggle_paid_message_reaction_is_anonymous(MessageFullId message_full_id, bool is_anonymous,
Promise<Unit> &&promise);
td_api::object_ptr<td_api::message> get_dialog_event_log_message_object(
DialogId dialog_id, tl_object_ptr<telegram_api::Message> &&message, DialogId &sender_dialog_id);

View File

@ -4984,6 +4984,13 @@ void Td::on_request(uint64 id, const td_api::removePendingPaidMessageReactions &
std::move(promise));
}
void Td::on_request(uint64 id, const td_api::togglePaidMessageReactionIsAnonymous &request) {
CHECK_IS_USER();
CREATE_OK_REQUEST_PROMISE();
messages_manager_->toggle_paid_message_reaction_is_anonymous(
{DialogId(request.chat_id_), MessageId(request.message_id_)}, request.is_anonymous_, std::move(promise));
}
void Td::on_request(uint64 id, const td_api::removeMessageReaction &request) {
CHECK_IS_USER();
CREATE_OK_REQUEST_PROMISE();

View File

@ -814,6 +814,8 @@ class Td final : public Actor {
void on_request(uint64 id, const td_api::removePendingPaidMessageReactions &request);
void on_request(uint64 id, const td_api::togglePaidMessageReactionIsAnonymous &request);
void on_request(uint64 id, const td_api::removeMessageReaction &request);
void on_request(uint64 id, const td_api::setMessageReactions &request);

View File

@ -2979,6 +2979,13 @@ class CliClient final : public Actor {
MessageId message_id;
get_args(args, chat_id, message_id);
send_request(td_api::make_object<td_api::removePendingPaidMessageReactions>(chat_id, message_id));
} else if (op == "tpmria") {
ChatId chat_id;
MessageId message_id;
bool is_anonymous;
get_args(args, chat_id, message_id, is_anonymous);
send_request(
td_api::make_object<td_api::togglePaidMessageReactionIsAnonymous>(chat_id, message_id, is_anonymous));
} else if (op == "gmars") {
ChatId chat_id;
MessageId message_id;