summaryrefslogtreecommitdiff
path: root/protocols/Telegram/tdlib/td/td/telegram/GiveawayParameters.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Telegram/tdlib/td/td/telegram/GiveawayParameters.cpp')
-rw-r--r--protocols/Telegram/tdlib/td/td/telegram/GiveawayParameters.cpp202
1 files changed, 202 insertions, 0 deletions
diff --git a/protocols/Telegram/tdlib/td/td/telegram/GiveawayParameters.cpp b/protocols/Telegram/tdlib/td/td/telegram/GiveawayParameters.cpp
new file mode 100644
index 0000000000..068d6ed86c
--- /dev/null
+++ b/protocols/Telegram/tdlib/td/td/telegram/GiveawayParameters.cpp
@@ -0,0 +1,202 @@
+//
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2024
+//
+// 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/GiveawayParameters.h"
+
+#include "td/telegram/AccessRights.h"
+#include "td/telegram/ChatManager.h"
+#include "td/telegram/Dependencies.h"
+#include "td/telegram/DialogId.h"
+#include "td/telegram/DialogManager.h"
+#include "td/telegram/Global.h"
+#include "td/telegram/misc.h"
+#include "td/telegram/OptionManager.h"
+#include "td/telegram/Td.h"
+#include "td/telegram/telegram_api.h"
+
+#include "td/utils/Random.h"
+
+namespace td {
+
+Result<ChannelId> GiveawayParameters::get_boosted_channel_id(Td *td, DialogId dialog_id) {
+ if (!td->dialog_manager_->have_dialog_force(dialog_id, "get_boosted_channel_id")) {
+ return Status::Error(400, "Chat to boost not found");
+ }
+ if (dialog_id.get_type() != DialogType::Channel) {
+ return Status::Error(400, "Can't boost the chat");
+ }
+ auto channel_id = dialog_id.get_channel_id();
+ auto status = td->chat_manager_->get_channel_status(channel_id);
+ if (td->chat_manager_->is_broadcast_channel(channel_id) ? !status.can_post_messages() : !status.is_administrator()) {
+ return Status::Error(400, "Not enough rights in the chat");
+ }
+ return channel_id;
+}
+
+Result<GiveawayParameters> GiveawayParameters::get_giveaway_parameters(Td *td,
+ const td_api::giveawayParameters *parameters) {
+ if (parameters == nullptr) {
+ return Status::Error(400, "Giveaway parameters must be non-empty");
+ }
+ TRY_RESULT(boosted_channel_id, get_boosted_channel_id(td, DialogId(parameters->boosted_chat_id_)));
+ vector<ChannelId> additional_channel_ids;
+ for (auto additional_chat_id : parameters->additional_chat_ids_) {
+ TRY_RESULT(channel_id, get_boosted_channel_id(td, DialogId(additional_chat_id)));
+ additional_channel_ids.push_back(channel_id);
+ }
+ if (static_cast<int64>(additional_channel_ids.size()) >
+ td->option_manager_->get_option_integer("giveaway_additional_chat_count_max")) {
+ return Status::Error(400, "Too many additional chats specified");
+ }
+ if (parameters->winners_selection_date_ < G()->unix_time()) {
+ return Status::Error(400, "Giveaway date is in the past");
+ }
+ for (auto &country_code : parameters->country_codes_) {
+ if (country_code.size() != 2 || country_code[0] < 'A' || country_code[0] > 'Z') {
+ return Status::Error(400, "Invalid country code specified");
+ }
+ }
+ if (static_cast<int64>(parameters->country_codes_.size()) >
+ td->option_manager_->get_option_integer("giveaway_country_count_max")) {
+ return Status::Error(400, "Too many countries specified");
+ }
+ auto prize_description = parameters->prize_description_;
+ if (!clean_input_string(prize_description)) {
+ return Status::Error(400, "Strings must be encoded in UTF-8");
+ }
+ return GiveawayParameters(boosted_channel_id, std::move(additional_channel_ids), parameters->only_new_members_,
+ parameters->has_public_winners_, parameters->winners_selection_date_,
+ vector<string>(parameters->country_codes_), std::move(prize_description));
+}
+
+vector<ChannelId> GiveawayParameters::get_channel_ids() const {
+ auto result = additional_channel_ids_;
+ result.push_back(boosted_channel_id_);
+ return result;
+}
+
+void GiveawayParameters::add_dependencies(Dependencies &dependencies) const {
+ dependencies.add_dialog_and_dependencies(DialogId(boosted_channel_id_));
+ for (auto channel_id : additional_channel_ids_) {
+ dependencies.add_dialog_and_dependencies(DialogId(channel_id));
+ }
+}
+
+telegram_api::object_ptr<telegram_api::inputStorePaymentPremiumGiveaway>
+GiveawayParameters::get_input_store_payment_premium_giveaway(Td *td, const string &currency, int64 amount) const {
+ int64 random_id;
+ do {
+ random_id = Random::secure_int64();
+ } while (random_id == 0);
+
+ auto boost_input_peer = td->dialog_manager_->get_input_peer(DialogId(boosted_channel_id_), AccessRights::Write);
+ CHECK(boost_input_peer != nullptr);
+
+ vector<telegram_api::object_ptr<telegram_api::InputPeer>> additional_input_peers;
+ for (auto additional_channel_id : additional_channel_ids_) {
+ auto input_peer = td->dialog_manager_->get_input_peer(DialogId(additional_channel_id), AccessRights::Write);
+ CHECK(input_peer != nullptr);
+ additional_input_peers.push_back(std::move(input_peer));
+ }
+
+ int32 flags = 0;
+ if (only_new_subscribers_) {
+ flags |= telegram_api::inputStorePaymentPremiumGiveaway::ONLY_NEW_SUBSCRIBERS_MASK;
+ }
+ if (winners_are_visible_) {
+ flags |= telegram_api::inputStorePaymentPremiumGiveaway::WINNERS_ARE_VISIBLE_MASK;
+ }
+ if (!additional_input_peers.empty()) {
+ flags |= telegram_api::inputStorePaymentPremiumGiveaway::ADDITIONAL_PEERS_MASK;
+ }
+ if (!country_codes_.empty()) {
+ flags |= telegram_api::inputStorePaymentPremiumGiveaway::COUNTRIES_ISO2_MASK;
+ }
+ if (!prize_description_.empty()) {
+ flags |= telegram_api::inputStorePaymentPremiumGiveaway::PRIZE_DESCRIPTION_MASK;
+ }
+ return telegram_api::make_object<telegram_api::inputStorePaymentPremiumGiveaway>(
+ flags, false /*ignored*/, false /*ignored*/, std::move(boost_input_peer), std::move(additional_input_peers),
+ vector<string>(country_codes_), prize_description_, random_id, date_, currency, amount);
+}
+
+telegram_api::object_ptr<telegram_api::inputStorePaymentStarsGiveaway>
+GiveawayParameters::get_input_store_payment_stars_giveaway(Td *td, const string &currency, int64 amount,
+ int32 user_count, int64 star_count) const {
+ int64 random_id;
+ do {
+ random_id = Random::secure_int64();
+ } while (random_id == 0);
+
+ auto boost_input_peer = td->dialog_manager_->get_input_peer(DialogId(boosted_channel_id_), AccessRights::Write);
+ CHECK(boost_input_peer != nullptr);
+
+ vector<telegram_api::object_ptr<telegram_api::InputPeer>> additional_input_peers;
+ for (auto additional_channel_id : additional_channel_ids_) {
+ auto input_peer = td->dialog_manager_->get_input_peer(DialogId(additional_channel_id), AccessRights::Write);
+ CHECK(input_peer != nullptr);
+ additional_input_peers.push_back(std::move(input_peer));
+ }
+
+ int32 flags = 0;
+ if (only_new_subscribers_) {
+ flags |= telegram_api::inputStorePaymentStarsGiveaway::ONLY_NEW_SUBSCRIBERS_MASK;
+ }
+ if (winners_are_visible_) {
+ flags |= telegram_api::inputStorePaymentStarsGiveaway::WINNERS_ARE_VISIBLE_MASK;
+ }
+ if (!additional_input_peers.empty()) {
+ flags |= telegram_api::inputStorePaymentStarsGiveaway::ADDITIONAL_PEERS_MASK;
+ }
+ if (!country_codes_.empty()) {
+ flags |= telegram_api::inputStorePaymentStarsGiveaway::COUNTRIES_ISO2_MASK;
+ }
+ if (!prize_description_.empty()) {
+ flags |= telegram_api::inputStorePaymentStarsGiveaway::PRIZE_DESCRIPTION_MASK;
+ }
+ return telegram_api::make_object<telegram_api::inputStorePaymentStarsGiveaway>(
+ flags, false /*ignored*/, false /*ignored*/, star_count, std::move(boost_input_peer),
+ std::move(additional_input_peers), vector<string>(country_codes_), prize_description_, random_id, date_, currency,
+ amount, user_count);
+}
+
+td_api::object_ptr<td_api::giveawayParameters> GiveawayParameters::get_giveaway_parameters_object(Td *td) const {
+ CHECK(is_valid());
+ vector<int64> chat_ids;
+ for (auto channel_id : additional_channel_ids_) {
+ DialogId dialog_id(channel_id);
+ td->dialog_manager_->force_create_dialog(dialog_id, "giveawayParameters", true);
+ chat_ids.push_back(td->dialog_manager_->get_chat_id_object(dialog_id, "giveawayParameters"));
+ }
+ DialogId dialog_id(boosted_channel_id_);
+ td->dialog_manager_->force_create_dialog(dialog_id, "giveawayParameters", true);
+ return td_api::make_object<td_api::giveawayParameters>(
+ td->dialog_manager_->get_chat_id_object(dialog_id, "giveawayParameters"), std::move(chat_ids), date_,
+ only_new_subscribers_, winners_are_visible_, vector<string>(country_codes_), prize_description_);
+}
+
+bool operator==(const GiveawayParameters &lhs, const GiveawayParameters &rhs) {
+ return lhs.boosted_channel_id_ == rhs.boosted_channel_id_ &&
+ lhs.additional_channel_ids_ == rhs.additional_channel_ids_ &&
+ lhs.only_new_subscribers_ == rhs.only_new_subscribers_ &&
+ lhs.winners_are_visible_ == rhs.winners_are_visible_ && lhs.date_ == rhs.date_ &&
+ lhs.country_codes_ == rhs.country_codes_ && lhs.prize_description_ == rhs.prize_description_;
+}
+
+bool operator!=(const GiveawayParameters &lhs, const GiveawayParameters &rhs) {
+ return !(lhs == rhs);
+}
+
+StringBuilder &operator<<(StringBuilder &string_builder, const GiveawayParameters &giveaway_parameters) {
+ return string_builder << "Giveaway[" << giveaway_parameters.boosted_channel_id_ << " + "
+ << giveaway_parameters.additional_channel_ids_
+ << (giveaway_parameters.only_new_subscribers_ ? " only for new members" : "")
+ << (giveaway_parameters.winners_are_visible_ ? " with public list of winners" : "")
+ << " for countries " << giveaway_parameters.country_codes_ << " at "
+ << giveaway_parameters.date_ << ']';
+}
+
+} // namespace td