Add userFullInfo.premium_gift_options.

This commit is contained in:
levlam 2022-07-01 15:57:38 +03:00
parent 4f7113395b
commit 035f24b8e9
7 changed files with 198 additions and 4 deletions

View File

@ -414,6 +414,7 @@ set(TDLIB_SOURCE
td/telegram/PhotoSizeSource.cpp
td/telegram/PollManager.cpp
td/telegram/Premium.cpp
td/telegram/PremiumGiftOption.cpp
td/telegram/QueryCombiner.cpp
td/telegram/RecentDialogList.cpp
td/telegram/ReplyMarkup.cpp
@ -650,6 +651,7 @@ set(TDLIB_SOURCE
td/telegram/PollId.h
td/telegram/PollManager.h
td/telegram/Premium.h
td/telegram/PremiumGiftOption.h
td/telegram/PrivacyManager.h
td/telegram/PtsManager.h
td/telegram/PublicDialogType.h
@ -729,6 +731,7 @@ set(TDLIB_SOURCE
td/telegram/PhotoSizeSource.hpp
td/telegram/PollId.hpp
td/telegram/PollManager.hpp
td/telegram/PremiumGiftOption.hpp
td/telegram/ReplyMarkup.hpp
td/telegram/SecureValue.hpp
td/telegram/SendCodeHelper.hpp

View File

@ -455,6 +455,15 @@ chatPermissions can_send_messages:Bool can_send_media_messages:Bool can_send_pol
chatAdministratorRights can_manage_chat:Bool can_change_info:Bool can_post_messages:Bool can_edit_messages:Bool can_delete_messages:Bool can_invite_users:Bool can_restrict_members:Bool can_pin_messages:Bool can_promote_members:Bool can_manage_video_chats:Bool is_anonymous:Bool = ChatAdministratorRights;
//@description Describes an option for gifting Telegram Premium to a user
//@currency ISO 4217 currency code for Telegram Premium subscription payment
//@amount The amount to pay, in the smallest units of the currency
//@month_count Number of month the Telegram Premium subscription will be active
//@store_product Name of the store product associated with the option
//@payment_link An internal link to be opened for gifting Telegram Premium to the user if store payment isn't possible; may be null if direct payment isn't available
premiumGiftOption currency:string amount:int53 month_count:int32 store_product:string payment_link:InternalLinkType = PremiumGiftOption;
//@description Represents a user
//@id User identifier
//@first_name First name of the user
@ -477,6 +486,7 @@ chatAdministratorRights can_manage_chat:Bool can_change_info:Bool can_post_messa
//@added_to_attachment_menu True, if the user added the current bot to attachment menu; only available to bots
user id:int53 first_name:string last_name:string username:string phone_number:string status:UserStatus profile_photo:profilePhoto is_contact:Bool is_mutual_contact:Bool is_verified:Bool is_premium:Bool is_support:Bool restriction_reason:string is_scam:Bool is_fake:Bool have_access:Bool type:UserType language_code:string added_to_attachment_menu:Bool = User;
//@description Contains information about a bot
//@share_text The text that is shown on the bot's profile page and is sent together with the link when users share the bot
//@param_description The text shown in the chat with the bot if the chat is empty
@ -488,7 +498,6 @@ user id:int53 first_name:string last_name:string username:string phone_number:st
//@default_channel_administrator_rights Default administrator rights for adding the bot to channels; may be null
botInfo share_text:string description:string photo:photo animation:animation menu_button:botMenuButton commands:vector<botCommand> default_group_administrator_rights:chatAdministratorRights default_channel_administrator_rights:chatAdministratorRights = BotInfo;
//@description Contains full information about a user
//@photo User profile photo; may be null
//@is_blocked True, if the user is blocked by the current user
@ -498,9 +507,10 @@ botInfo share_text:string description:string photo:photo animation:animation men
//@has_private_forwards True, if the user can't be linked in forwarded messages due to their privacy settings
//@need_phone_number_privacy_exception True, if the current user needs to explicitly allow to share their phone number with the user when the method addContact is used
//@bio A short user bio; may be null for bots
//@premium_gift_options The list of available options for gifting Telegram Premium to the user
//@group_in_common_count Number of group chats where both the other user and the current user are a member; 0 for the current user
//@bot_info For bots, information about the bot; may be null
userFullInfo photo:chatPhoto is_blocked:Bool can_be_called:Bool supports_video_calls:Bool has_private_calls:Bool has_private_forwards:Bool need_phone_number_privacy_exception:Bool bio:formattedText group_in_common_count:int32 bot_info:botInfo = UserFullInfo;
userFullInfo photo:chatPhoto is_blocked:Bool can_be_called:Bool supports_video_calls:Bool has_private_calls:Bool has_private_forwards:Bool need_phone_number_privacy_exception:Bool bio:formattedText premium_gift_options:vector<premiumGiftOption> group_in_common_count:int32 bot_info:botInfo = UserFullInfo;
//@description Represents a list of users @total_count Approximate total number of users found @user_ids A list of user identifiers
users total_count:int32 user_ids:vector<int53> = Users;

View File

@ -38,6 +38,7 @@
#include "td/telegram/PasswordManager.h"
#include "td/telegram/Photo.h"
#include "td/telegram/Photo.hpp"
#include "td/telegram/PremiumGiftOption.hpp"
#include "td/telegram/SecretChatLayer.h"
#include "td/telegram/SecretChatsManager.h"
#include "td/telegram/ServerMessageId.h"
@ -3808,6 +3809,7 @@ void ContactsManager::UserFull::store(StorerT &storer) const {
bool has_menu_button = menu_button != nullptr;
bool has_description_photo = !description_photo.is_empty();
bool has_description_animation = description_animation_file_id.is_valid();
bool has_premium_gift_options = !premium_gift_options.empty();
BEGIN_STORE_FLAGS();
STORE_FLAG(has_about);
STORE_FLAG(is_blocked);
@ -3825,6 +3827,7 @@ void ContactsManager::UserFull::store(StorerT &storer) const {
STORE_FLAG(has_menu_button);
STORE_FLAG(has_description_photo);
STORE_FLAG(has_description_animation);
STORE_FLAG(has_premium_gift_options);
END_STORE_FLAGS();
if (has_about) {
store(about, storer);
@ -3859,6 +3862,9 @@ void ContactsManager::UserFull::store(StorerT &storer) const {
storer.context()->td().get_actor_unsafe()->animations_manager_->store_animation(description_animation_file_id,
storer);
}
if (has_premium_gift_options) {
store(premium_gift_options, storer);
}
}
template <class ParserT>
@ -3874,6 +3880,7 @@ void ContactsManager::UserFull::parse(ParserT &parser) {
bool has_menu_button;
bool has_description_photo;
bool has_description_animation;
bool has_premium_gift_options;
BEGIN_PARSE_FLAGS();
PARSE_FLAG(has_about);
PARSE_FLAG(is_blocked);
@ -3891,6 +3898,7 @@ void ContactsManager::UserFull::parse(ParserT &parser) {
PARSE_FLAG(has_menu_button);
PARSE_FLAG(has_description_photo);
PARSE_FLAG(has_description_animation);
PARSE_FLAG(has_premium_gift_options);
END_PARSE_FLAGS();
if (has_about) {
parse(about, parser);
@ -3925,6 +3933,9 @@ void ContactsManager::UserFull::parse(ParserT &parser) {
description_animation_file_id =
parser.context()->td().get_actor_unsafe()->animations_manager_->parse_animation(parser);
}
if (has_premium_gift_options) {
parse(premium_gift_options, parser);
}
}
template <class StorerT>
@ -10757,19 +10768,24 @@ void ContactsManager::on_get_user_full(tl_object_ptr<telegram_api::userFull> &&u
bool can_be_called = user->phone_calls_available_ && !user->phone_calls_private_;
bool supports_video_calls = user->video_calls_available_ && !user->phone_calls_private_;
bool has_private_calls = user->phone_calls_private_;
auto premium_gift_options = transform(std::move(user->premium_gifts_), [](auto &&premium_gift_option) {
return PremiumGiftOption(std::move(premium_gift_option));
});
AdministratorRights group_administrator_rights(user->bot_group_admin_rights_, ChannelType::Megagroup);
AdministratorRights broadcast_administrator_rights(user->bot_broadcast_admin_rights_, ChannelType::Broadcast);
if (user_full->can_be_called != can_be_called || user_full->supports_video_calls != supports_video_calls ||
user_full->has_private_calls != has_private_calls ||
user_full->private_forward_name != user->private_forward_name_ ||
user_full->group_administrator_rights != group_administrator_rights ||
user_full->broadcast_administrator_rights != broadcast_administrator_rights) {
user_full->broadcast_administrator_rights != broadcast_administrator_rights ||
user_full->premium_gift_options != premium_gift_options) {
user_full->can_be_called = can_be_called;
user_full->supports_video_calls = supports_video_calls;
user_full->has_private_calls = has_private_calls;
user_full->private_forward_name = std::move(user->private_forward_name_);
user_full->group_administrator_rights = group_administrator_rights;
user_full->broadcast_administrator_rights = broadcast_administrator_rights;
user_full->premium_gift_options = std::move(premium_gift_options);
user_full->is_changed = true;
}
@ -12087,6 +12103,7 @@ void ContactsManager::drop_user_full(UserId user_id) {
user_full->private_forward_name.clear();
user_full->group_administrator_rights = {};
user_full->broadcast_administrator_rights = {};
user_full->premium_gift_options.clear();
user_full->is_changed = true;
update_user_full(user_full, user_id, "drop_user_full");
@ -16722,11 +16739,15 @@ tl_object_ptr<td_api::userFullInfo> ContactsManager::get_user_full_info_object(U
}
bio_object = get_formatted_text_object(bio, true, 0);
}
auto premium_gift_options = transform(user_full->premium_gift_options, [](const auto &option) {
return option.get_premium_gift_option_object();
});
return make_tl_object<td_api::userFullInfo>(
get_chat_photo_object(td_->file_manager_.get(), user_full->photo), user_full->is_blocked,
user_full->can_be_called, user_full->supports_video_calls, user_full->has_private_calls,
!user_full->private_forward_name.empty(), user_full->need_phone_number_privacy_exception, std::move(bio_object),
user_full->common_chat_count, std::move(bot_info));
std::move(premium_gift_options), user_full->common_chat_count,
std::move(bot_info));
}
td_api::object_ptr<td_api::updateBasicGroup> ContactsManager::get_update_unknown_basic_group_object(ChatId chat_id) {

View File

@ -27,6 +27,7 @@
#include "td/telegram/MessageId.h"
#include "td/telegram/net/DcId.h"
#include "td/telegram/Photo.h"
#include "td/telegram/PremiumGiftOption.h"
#include "td/telegram/PublicDialogType.h"
#include "td/telegram/QueryCombiner.h"
#include "td/telegram/RestrictionReason.h"
@ -715,6 +716,8 @@ class ContactsManager final : public Actor {
Photo description_photo;
FileId description_animation_file_id;
vector<PremiumGiftOption> premium_gift_options;
unique_ptr<BotMenuButton> menu_button;
vector<BotCommand> commands;
AdministratorRights group_administrator_rights;

View File

@ -0,0 +1,39 @@
//
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// 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/PremiumGiftOption.h"
#include "td/telegram/LinkManager.h"
#include "td/utils/common.h"
namespace td {
PremiumGiftOption::PremiumGiftOption(telegram_api::object_ptr<telegram_api::premiumGiftOption> &&option)
: months_(option->months_)
, currency_(std::move(option->currency_))
, amount_(option->amount_)
, bot_url_(std::move(option->bot_url_))
, store_product_(std::move(option->store_product_)) {
}
td_api::object_ptr<td_api::premiumGiftOption> PremiumGiftOption::get_premium_gift_option_object() const {
auto link_type = LinkManager::parse_internal_link(bot_url_, true);
return td_api::make_object<td_api::premiumGiftOption>(
currency_, amount_, months_, store_product_,
link_type == nullptr ? nullptr : link_type->get_internal_link_type_object());
}
bool operator==(const PremiumGiftOption &lhs, const PremiumGiftOption &rhs) {
return lhs.months_ == rhs.months_ && lhs.currency_ == rhs.currency_ && lhs.amount_ == rhs.amount_ &&
lhs.bot_url_ == rhs.bot_url_ && lhs.store_product_ == rhs.store_product_;
}
bool operator!=(const PremiumGiftOption &lhs, const PremiumGiftOption &rhs) {
return !(lhs == rhs);
}
} // namespace td

View File

@ -0,0 +1,41 @@
//
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// 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)
//
#pragma once
#include "td/telegram/td_api.h"
#include "td/telegram/telegram_api.h"
#include "td/utils/common.h"
namespace td {
class PremiumGiftOption {
int32 months_ = 0;
string currency_;
int64 amount_ = 0;
string bot_url_;
string store_product_;
friend bool operator==(const PremiumGiftOption &lhs, const PremiumGiftOption &rhs);
public:
PremiumGiftOption() = default;
explicit PremiumGiftOption(telegram_api::object_ptr<telegram_api::premiumGiftOption> &&option);
td_api::object_ptr<td_api::premiumGiftOption> get_premium_gift_option_object() const;
template <class StorerT>
void store(StorerT &storer) const;
template <class ParserT>
void parse(ParserT &parser);
};
bool operator==(const PremiumGiftOption &lhs, const PremiumGiftOption &rhs);
bool operator!=(const PremiumGiftOption &lhs, const PremiumGiftOption &rhs);
} // namespace td

View File

@ -0,0 +1,77 @@
//
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// 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)
//
#pragma once
#include "td/telegram/PremiumGiftOption.h"
#include "td/utils/tl_helpers.h"
namespace td {
template <class StorerT>
void PremiumGiftOption::store(StorerT &storer) const {
bool has_months = months_ != 0;
bool has_currency = !currency_.empty();
bool has_amount = amount_ != 0;
bool has_bot_url = !bot_url_.empty();
bool has_store_product = !store_product_.empty();
BEGIN_STORE_FLAGS();
STORE_FLAG(has_months);
STORE_FLAG(has_currency);
STORE_FLAG(has_amount);
STORE_FLAG(has_bot_url);
STORE_FLAG(has_store_product);
END_STORE_FLAGS();
if (has_months) {
td::store(months_, storer);
}
if (has_currency) {
td::store(currency_, storer);
}
if (has_amount) {
td::store(amount_, storer);
}
if (has_bot_url) {
td::store(bot_url_, storer);
}
if (has_store_product) {
td::store(store_product_, storer);
}
}
template <class ParserT>
void PremiumGiftOption::parse(ParserT &parser) {
bool has_months;
bool has_currency;
bool has_amount;
bool has_bot_url;
bool has_store_product;
BEGIN_PARSE_FLAGS();
PARSE_FLAG(has_months);
PARSE_FLAG(has_currency);
PARSE_FLAG(has_amount);
PARSE_FLAG(has_bot_url);
PARSE_FLAG(has_store_product);
END_PARSE_FLAGS();
if (has_months) {
td::parse(months_, parser);
}
if (has_currency) {
td::parse(currency_, parser);
}
if (has_amount) {
td::parse(amount_, parser);
}
if (has_bot_url) {
td::parse(bot_url_, parser);
}
if (has_store_product) {
td::parse(store_product_, parser);
}
}
} // namespace td