From f4a64ad28cc20f0af4cc5927f4c3f0846653048f Mon Sep 17 00:00:00 2001 From: levlam Date: Fri, 14 Jun 2024 14:09:02 +0300 Subject: [PATCH] Add getStarTransactions.owner_id. --- td/generate/scheme/td_api.tl | 6 ++-- td/telegram/StarManager.cpp | 69 ++++++++++++++++++++++-------------- td/telegram/StarManager.h | 4 ++- td/telegram/Td.cpp | 4 +-- td/telegram/cli.cpp | 6 ++-- 5 files changed, 55 insertions(+), 34 deletions(-) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index fdfbbeb41..413027bde 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -10978,11 +10978,13 @@ getPremiumGiveawayInfo chat_id:int53 message_id:int53 = PremiumGiveawayInfo; //@description Returns available options for Telegram stars purchase getStarPaymentOptions = StarPaymentOptions; -//@description Returns the list of Telegram star transactions for the current user +//@description Returns the list of Telegram star transactions for the specified owner +//@owner_id Identifier of the owner of the Telegram stars; can be the identifier of the current user, identifier of an owned bot, +//-or identifier of a channel chat with supergroupFullInfo.can_get_revenue_statistics == true //@direction Direction of the transactions to receive; pass null to get all transactions //@offset Offset of the first transaction to return as received from the previous request; use empty string to get the first chunk of results //@limit The maximum number of transactions to return -getStarTransactions direction:StarTransactionDirection offset:string limit:int32 = StarTransactions; +getStarTransactions owner_id:MessageSender direction:StarTransactionDirection offset:string limit:int32 = StarTransactions; //@description Checks whether an in-store purchase is possible. Must be called before any in-store purchase @purpose Transaction purpose canPurchaseFromStore purpose:StorePaymentPurpose = Ok; diff --git a/td/telegram/StarManager.cpp b/td/telegram/StarManager.cpp index 31aab663e..1e4c30a50 100644 --- a/td/telegram/StarManager.cpp +++ b/td/telegram/StarManager.cpp @@ -11,6 +11,7 @@ #include "td/telegram/DialogManager.h" #include "td/telegram/Global.h" #include "td/telegram/InputInvoice.h" +#include "td/telegram/MessageSender.h" #include "td/telegram/PasswordManager.h" #include "td/telegram/Photo.h" #include "td/telegram/Td.h" @@ -58,13 +59,18 @@ class GetStarsTopupOptionsQuery final : public Td::ResultHandler { class GetStarsTransactionsQuery final : public Td::ResultHandler { Promise> promise_; + DialogId dialog_id_; public: explicit GetStarsTransactionsQuery(Promise> &&promise) : promise_(std::move(promise)) { } - void send(const string &offset, int32 limit, td_api::object_ptr &&direction) { + void send(DialogId dialog_id, const string &offset, int32 limit, + td_api::object_ptr &&direction) { + dialog_id_ = dialog_id; + auto input_peer = td_->dialog_manager_->get_input_peer(dialog_id, AccessRights::Read); + CHECK(input_peer != nullptr); int32 flags = 0; if (direction != nullptr) { switch (direction->get_id()) { @@ -79,8 +85,7 @@ class GetStarsTransactionsQuery final : public Td::ResultHandler { } } send_query(G()->net_query_creator().create(telegram_api::payments_getStarsTransactions( - flags, false /*ignored*/, false /*ignored*/, false /*ignored*/, - telegram_api::make_object(), offset, limit))); + flags, false /*ignored*/, false /*ignored*/, false /*ignored*/, std::move(input_peer), offset, limit))); } void on_result(BufferSlice packet) final { @@ -152,6 +157,7 @@ class GetStarsTransactionsQuery final : public Td::ResultHandler { } void on_error(Status status) final { + td_->dialog_manager_->on_get_dialog_error(dialog_id_, status, "GetStarsTransactionsQuery"); promise_.set_error(std::move(status)); } }; @@ -227,17 +233,46 @@ void StarManager::tear_down() { parent_.reset(); } +Status StarManager::can_manage_stars(DialogId dialog_id) const { + switch (dialog_id.get_type()) { + case DialogType::User: { + auto user_id = dialog_id.get_user_id(); + TRY_RESULT(bot_data, td_->user_manager_->get_bot_data(user_id)); + if (!bot_data.can_be_edited) { + return Status::Error(400, "The bot isn't owned"); + } + break; + } + case DialogType::Channel: { + auto channel_id = dialog_id.get_channel_id(); + if (!td_->chat_manager_->is_broadcast_channel(channel_id)) { + return Status::Error(400, "Chat is not a channel"); + } + if (!td_->chat_manager_->get_channel_permissions(channel_id).is_creator()) { + return Status::Error(400, "Not enough rights to withdraw stars"); + } + break; + } + default: + return Status::Error(400, "Unallowed chat specified"); + } + return Status::OK(); +} + void StarManager::get_star_payment_options(Promise> &&promise) { td_->create_handler(std::move(promise))->send(); } -void StarManager::get_star_transactions(const string &offset, int32 limit, - td_api::object_ptr &&direction, +void StarManager::get_star_transactions(td_api::object_ptr owner_id, const string &offset, + int32 limit, td_api::object_ptr &&direction, Promise> &&promise) { + TRY_RESULT_PROMISE(promise, dialog_id, get_message_sender_dialog_id(td_, owner_id, true, false)); + TRY_STATUS_PROMISE(promise, can_manage_stars(dialog_id)); if (limit < 0) { return promise.set_error(Status::Error(400, "Limit must be non-negative")); } - td_->create_handler(std::move(promise))->send(offset, limit, std::move(direction)); + td_->create_handler(std::move(promise)) + ->send(dialog_id, offset, limit, std::move(direction)); } void StarManager::refund_star_payment(UserId user_id, const string &telegram_payment_charge_id, @@ -251,27 +286,7 @@ void StarManager::get_star_withdrawal_url(DialogId dialog_id, int64 star_count, Promise &&promise) { TRY_STATUS_PROMISE(promise, td_->dialog_manager_->check_dialog_access(dialog_id, false, AccessRights::Write, "get_star_withdrawal_url")); - switch (dialog_id.get_type()) { - case DialogType::User: { - auto user_id = dialog_id.get_user_id(); - if (!td_->user_manager_->is_user_bot(user_id)) { - return promise.set_error(Status::Error(400, "User is not a bot")); - } - break; - } - case DialogType::Channel: { - auto channel_id = dialog_id.get_channel_id(); - if (!td_->chat_manager_->is_broadcast_channel(channel_id)) { - return promise.set_error(Status::Error(400, "Chat is not a channel")); - } - if (!td_->chat_manager_->get_channel_permissions(channel_id).is_creator()) { - return promise.set_error(Status::Error(400, "Not enough rights to withdraw stars")); - } - break; - } - default: - return promise.set_error(Status::Error(400, "Unallowed chat specified")); - } + TRY_STATUS_PROMISE(promise, can_manage_stars(dialog_id)); if (password.empty()) { return promise.set_error(Status::Error(400, "PASSWORD_HASH_INVALID")); } diff --git a/td/telegram/StarManager.h b/td/telegram/StarManager.h index d6568d274..076061f18 100644 --- a/td/telegram/StarManager.h +++ b/td/telegram/StarManager.h @@ -26,7 +26,7 @@ class StarManager final : public Actor { void get_star_payment_options(Promise> &&promise); - void get_star_transactions(const string &offset, int32 limit, + void get_star_transactions(td_api::object_ptr owner_id, const string &offset, int32 limit, td_api::object_ptr &&direction, Promise> &&promise); @@ -37,6 +37,8 @@ class StarManager final : public Actor { private: void tear_down() final; + Status can_manage_stars(DialogId dialog_id) const; + void send_get_star_withdrawal_url_query( DialogId dialog_id, int64 star_count, telegram_api::object_ptr input_check_password, Promise &&promise); diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index 4bd038a1a..a3bb58e34 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -9501,8 +9501,8 @@ void Td::on_request(uint64 id, td_api::getStarTransactions &request) { CHECK_IS_USER(); CLEAN_INPUT_STRING(request.offset_); CREATE_REQUEST_PROMISE(); - star_manager_->get_star_transactions(request.offset_, request.limit_, std::move(request.direction_), - std::move(promise)); + star_manager_->get_star_transactions(std::move(request.owner_id_), request.offset_, request.limit_, + std::move(request.direction_), std::move(promise)); } void Td::on_request(uint64 id, td_api::canPurchaseFromStore &request) { diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index 072556beb..cc1c44ce0 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -3436,16 +3436,18 @@ class CliClient final : public Actor { } else if (op == "gspo") { send_request(td_api::make_object()); } else if (op == "gsta" || op == "gsti" || op == "gsto") { + string owner_id; string offset; string limit; - get_args(args, offset, limit); + get_args(args, owner_id, offset, limit); td_api::object_ptr direction; if (op == "gsti") { direction = td_api::make_object(); } else if (op == "gsto") { direction = td_api::make_object(); } - send_request(td_api::make_object(std::move(direction), offset, as_limit(limit))); + send_request(td_api::make_object(as_message_sender(owner_id), std::move(direction), + offset, as_limit(limit))); } else if (op == "cpfs" || op == "cpfsb") { UserId user_id; string currency;