Add td_api::backgroundTypeChatTheme for boosted chats.
This commit is contained in:
parent
b3ce27c4ea
commit
93aa765f44
@ -511,14 +511,14 @@ poll id:int64 question:string options:vector<pollOption> total_voter_count:int32
|
||||
//@is_default True, if this is one of default backgrounds
|
||||
//@is_dark True, if the background is dark and is recommended to be used with dark theme
|
||||
//@name Unique background name
|
||||
//@document Document with the background; may be null. Null only for filled backgrounds
|
||||
//@document Document with the background; may be null. Null only for filled and chat theme backgrounds
|
||||
//@type Type of the background
|
||||
background id:int64 is_default:Bool is_dark:Bool name:string document:document type:BackgroundType = Background;
|
||||
|
||||
//@description Contains a list of backgrounds @backgrounds A list of backgrounds
|
||||
backgrounds backgrounds:vector<background> = Backgrounds;
|
||||
|
||||
//@description Describes a background set for a specific chat @background The background @dark_theme_dimming Dimming of the background in dark themes, as a percentage; 0-100
|
||||
//@description Describes a background set for a specific chat @background The background @dark_theme_dimming Dimming of the background in dark themes, as a percentage; 0-100. Applied only to Wallpaper and Fill types of background
|
||||
chatBackground background:background dark_theme_dimming:int32 = ChatBackground;
|
||||
|
||||
|
||||
@ -4814,6 +4814,9 @@ backgroundTypePattern fill:BackgroundFill intensity:int32 is_inverted:Bool is_mo
|
||||
//@description A filled background @fill The background fill
|
||||
backgroundTypeFill fill:BackgroundFill = BackgroundType;
|
||||
|
||||
//@description A background from a chat theme; can be used only as a chat background in channels @theme_name Name of the chat theme
|
||||
backgroundTypeChatTheme theme_name:string = BackgroundType;
|
||||
|
||||
|
||||
//@class InputBackground @description Contains information about background to set
|
||||
|
||||
@ -7896,9 +7899,9 @@ setChatPermissions chat_id:int53 permissions:chatPermissions = Ok;
|
||||
|
||||
//@description Sets the background in a specific chat. Supported only in private and secret chats with non-deleted users
|
||||
//@chat_id Chat identifier
|
||||
//@background The input background to use; pass null to create a new filled background
|
||||
//@background The input background to use; pass null to create a new filled or chat theme background
|
||||
//@type Background type; pass null to use default background type for the chosen background
|
||||
//@dark_theme_dimming Dimming of the background in dark themes, as a percentage; 0-100
|
||||
//@dark_theme_dimming Dimming of the background in dark themes, as a percentage; 0-100. Applied only to Wallpaper and Fill types of background
|
||||
//@only_for_self Pass true to set background only for self; pass false to set background for both chat users. Background can be set for both users only by Telegram Premium users and if set background isn't of the type inputBackgroundPrevious
|
||||
setChatBackground chat_id:int53 background:InputBackground type:BackgroundType dark_theme_dimming:int32 only_for_self:Bool = Ok;
|
||||
|
||||
@ -9131,7 +9134,7 @@ createInvoiceLink invoice:InputMessageContent = HttpUrl;
|
||||
getSupportUser = User;
|
||||
|
||||
|
||||
//@description Constructs a persistent HTTP URL for a background @name Background name @type Background type
|
||||
//@description Constructs a persistent HTTP URL for a background @name Background name @type Background type; backgroundTypeChatTheme isn't supported
|
||||
getBackgroundUrl name:string type:BackgroundType = HttpUrl;
|
||||
|
||||
//@description Searches for a background by its name @name The name of the background
|
||||
@ -9139,7 +9142,7 @@ searchBackground name:string = Background;
|
||||
|
||||
//@description Sets default background for chats; adds the background to the list of installed backgrounds
|
||||
//@background The input background to use; pass null to create a new filled background
|
||||
//@type Background type; pass null to use the default type of the remote background
|
||||
//@type Background type; pass null to use the default type of the remote background; backgroundTypeChatTheme isn't supported
|
||||
//@for_dark_theme Pass true if the background is set for a dark theme
|
||||
setDefaultBackground background:InputBackground type:BackgroundType for_dark_theme:Bool = Background;
|
||||
|
||||
|
@ -683,9 +683,12 @@ void BackgroundManager::set_background(const td_api::InputBackground *input_back
|
||||
TRY_RESULT_PROMISE(promise, type, BackgroundType::get_background_type(background_type, 0));
|
||||
|
||||
if (input_background == nullptr) {
|
||||
if (background_type == nullptr || type.has_file()) {
|
||||
if (type.has_file() || background_type == nullptr) {
|
||||
return promise.set_error(Status::Error(400, "Input background must be non-empty for the background type"));
|
||||
}
|
||||
if (background_type->get_id() == td_api::backgroundTypeChatTheme::ID) {
|
||||
return promise.set_error(Status::Error(400, "Background type isn't supported"));
|
||||
}
|
||||
|
||||
auto background_id = add_local_background(type);
|
||||
set_background_id(background_id, type, for_dark_theme);
|
||||
@ -745,8 +748,9 @@ Result<DialogId> BackgroundManager::get_background_dialog(DialogId dialog_id) {
|
||||
case DialogType::User:
|
||||
return dialog_id;
|
||||
case DialogType::Chat:
|
||||
case DialogType::Channel:
|
||||
return Status::Error(400, "Can't change background in the chat");
|
||||
case DialogType::Channel:
|
||||
return dialog_id;
|
||||
case DialogType::SecretChat: {
|
||||
auto user_id = td_->contacts_manager_->get_secret_chat_user_id(dialog_id.get_secret_chat_id());
|
||||
if (!user_id.is_valid()) {
|
||||
|
@ -50,6 +50,9 @@ BackgroundFill::BackgroundFill(const telegram_api::wallPaperSettings *settings)
|
||||
}
|
||||
|
||||
auto flags = settings->flags_;
|
||||
if ((flags & telegram_api::wallPaperSettings::EMOTICON_MASK) != 0) {
|
||||
LOG(ERROR) << "Receive filled background with " << to_string(*settings);
|
||||
}
|
||||
if ((flags & telegram_api::wallPaperSettings::BACKGROUND_COLOR_MASK) != 0) {
|
||||
top_color_ = settings->background_color_;
|
||||
if (!validate_alpha_color(top_color_)) {
|
||||
@ -194,12 +197,12 @@ Result<BackgroundFill> BackgroundFill::get_background_fill(Slice name) {
|
||||
|
||||
string BackgroundFill::get_link(bool is_first) const {
|
||||
switch (get_type()) {
|
||||
case BackgroundFill::Type::Solid:
|
||||
case Type::Solid:
|
||||
return get_color_hex_string(top_color_);
|
||||
case BackgroundFill::Type::Gradient:
|
||||
case Type::Gradient:
|
||||
return PSTRING() << get_color_hex_string(top_color_) << '-' << get_color_hex_string(bottom_color_)
|
||||
<< (is_first ? '?' : '&') << "rotation=" << rotation_angle_;
|
||||
case BackgroundFill::Type::FreeformGradient: {
|
||||
case Type::FreeformGradient: {
|
||||
SliceBuilder sb;
|
||||
sb << get_color_hex_string(top_color_) << '~' << get_color_hex_string(bottom_color_) << '~'
|
||||
<< get_color_hex_string(third_color_);
|
||||
@ -305,6 +308,8 @@ string BackgroundType::get_link(bool is_first) const {
|
||||
}
|
||||
case Type::Fill:
|
||||
return fill_.get_link(is_first);
|
||||
case Type::ChatTheme:
|
||||
return string();
|
||||
default:
|
||||
UNREACHABLE();
|
||||
return string();
|
||||
@ -313,7 +318,7 @@ string BackgroundType::get_link(bool is_first) const {
|
||||
|
||||
bool operator==(const BackgroundType &lhs, const BackgroundType &rhs) {
|
||||
return lhs.type_ == rhs.type_ && lhs.is_blurred_ == rhs.is_blurred_ && lhs.is_moving_ == rhs.is_moving_ &&
|
||||
lhs.intensity_ == rhs.intensity_ && lhs.fill_ == rhs.fill_;
|
||||
lhs.intensity_ == rhs.intensity_ && lhs.fill_ == rhs.fill_ && lhs.theme_name_ == rhs.theme_name_;
|
||||
}
|
||||
|
||||
StringBuilder &operator<<(StringBuilder &string_builder, const BackgroundType &type) {
|
||||
@ -328,6 +333,9 @@ StringBuilder &operator<<(StringBuilder &string_builder, const BackgroundType &t
|
||||
case BackgroundType::Type::Fill:
|
||||
string_builder << "Fill";
|
||||
break;
|
||||
case BackgroundType::Type::ChatTheme:
|
||||
string_builder << "ChatTheme";
|
||||
break;
|
||||
default:
|
||||
UNREACHABLE();
|
||||
break;
|
||||
@ -363,6 +371,10 @@ Result<BackgroundType> BackgroundType::get_background_type(const td_api::Backgro
|
||||
TRY_RESULT(background_fill, BackgroundFill::get_background_fill(fill_type->fill_.get()));
|
||||
return BackgroundType(std::move(background_fill), dark_theme_dimming);
|
||||
}
|
||||
case td_api::backgroundTypeChatTheme::ID: {
|
||||
auto chat_theme_type = static_cast<const td_api::backgroundTypeChatTheme *>(background_type);
|
||||
return BackgroundType(chat_theme_type->theme_name_);
|
||||
}
|
||||
default:
|
||||
UNREACHABLE();
|
||||
return BackgroundType();
|
||||
@ -378,7 +390,7 @@ bool BackgroundType::is_background_name_local(Slice name) {
|
||||
return name.size() <= 13u || name.find('?') <= 13u || !is_base64url_characters(name.substr(0, name.find('?')));
|
||||
}
|
||||
|
||||
BackgroundType::BackgroundType(bool is_fill, bool is_pattern,
|
||||
BackgroundType::BackgroundType(bool has_no_file, bool is_pattern,
|
||||
telegram_api::object_ptr<telegram_api::wallPaperSettings> settings) {
|
||||
if (settings != nullptr && (settings->flags_ & telegram_api::wallPaperSettings::INTENSITY_MASK) != 0) {
|
||||
intensity_ = settings->intensity_;
|
||||
@ -387,10 +399,15 @@ BackgroundType::BackgroundType(bool is_fill, bool is_pattern,
|
||||
intensity_ = is_pattern ? 50 : 0;
|
||||
}
|
||||
}
|
||||
if (is_fill) {
|
||||
type_ = Type::Fill;
|
||||
if (has_no_file) {
|
||||
CHECK(settings != nullptr);
|
||||
if ((settings->flags_ & telegram_api::wallPaperSettings::EMOTICON_MASK) != 0) {
|
||||
type_ = Type::ChatTheme;
|
||||
theme_name_ = std::move(settings->emoticon_);
|
||||
} else {
|
||||
type_ = Type::Fill;
|
||||
fill_ = BackgroundFill(settings.get());
|
||||
}
|
||||
} else if (is_pattern) {
|
||||
type_ = Type::Pattern;
|
||||
if (settings != nullptr) {
|
||||
@ -408,11 +425,11 @@ BackgroundType::BackgroundType(bool is_fill, bool is_pattern,
|
||||
|
||||
td_api::object_ptr<td_api::BackgroundFill> BackgroundFill::get_background_fill_object() const {
|
||||
switch (get_type()) {
|
||||
case BackgroundFill::Type::Solid:
|
||||
case Type::Solid:
|
||||
return td_api::make_object<td_api::backgroundFillSolid>(top_color_);
|
||||
case BackgroundFill::Type::Gradient:
|
||||
case Type::Gradient:
|
||||
return td_api::make_object<td_api::backgroundFillGradient>(top_color_, bottom_color_, rotation_angle_);
|
||||
case BackgroundFill::Type::FreeformGradient: {
|
||||
case Type::FreeformGradient: {
|
||||
vector<int32> colors{top_color_, bottom_color_, third_color_, fourth_color_};
|
||||
if (colors.back() == -1) {
|
||||
colors.pop_back();
|
||||
@ -434,6 +451,8 @@ td_api::object_ptr<td_api::BackgroundType> BackgroundType::get_background_type_o
|
||||
fill_.get_background_fill_object(), intensity_ < 0 ? -intensity_ : intensity_, intensity_ < 0, is_moving_);
|
||||
case Type::Fill:
|
||||
return td_api::make_object<td_api::backgroundTypeFill>(fill_.get_background_fill_object());
|
||||
case Type::ChatTheme:
|
||||
return td_api::make_object<td_api::backgroundTypeChatTheme>(theme_name_);
|
||||
default:
|
||||
UNREACHABLE();
|
||||
return nullptr;
|
||||
@ -464,12 +483,15 @@ telegram_api::object_ptr<telegram_api::wallPaperSettings> BackgroundType::get_in
|
||||
default:
|
||||
UNREACHABLE();
|
||||
}
|
||||
if (!theme_name_.empty()) {
|
||||
flags |= telegram_api::wallPaperSettings::EMOTICON_MASK;
|
||||
}
|
||||
if (intensity_ != 0) {
|
||||
flags |= telegram_api::wallPaperSettings::INTENSITY_MASK;
|
||||
}
|
||||
return telegram_api::make_object<telegram_api::wallPaperSettings>(
|
||||
flags, is_blurred_, is_moving_, fill_.top_color_, fill_.bottom_color_, fill_.third_color_, fill_.fourth_color_,
|
||||
intensity_, fill_.rotation_angle_, string());
|
||||
intensity_, fill_.rotation_angle_, theme_name_);
|
||||
}
|
||||
|
||||
} // namespace td
|
||||
|
@ -64,12 +64,13 @@ class BackgroundFill {
|
||||
bool operator==(const BackgroundFill &lhs, const BackgroundFill &rhs);
|
||||
|
||||
class BackgroundType {
|
||||
enum class Type : int32 { Wallpaper, Pattern, Fill };
|
||||
enum class Type : int32 { Wallpaper, Pattern, Fill, ChatTheme };
|
||||
Type type_ = Type::Fill;
|
||||
bool is_blurred_ = false;
|
||||
bool is_moving_ = false;
|
||||
int32 intensity_ = 0;
|
||||
BackgroundFill fill_;
|
||||
string theme_name_;
|
||||
|
||||
friend bool operator==(const BackgroundType &lhs, const BackgroundType &rhs);
|
||||
|
||||
@ -84,11 +85,13 @@ class BackgroundType {
|
||||
BackgroundType(BackgroundFill &&fill, int32 dark_theme_dimming)
|
||||
: type_(Type::Fill), intensity_(dark_theme_dimming), fill_(std::move(fill)) {
|
||||
}
|
||||
explicit BackgroundType(string theme_name) : type_(Type::ChatTheme), theme_name_(std::move(theme_name)) {
|
||||
}
|
||||
|
||||
public:
|
||||
BackgroundType() = default;
|
||||
|
||||
BackgroundType(bool is_fill, bool is_pattern, telegram_api::object_ptr<telegram_api::wallPaperSettings> settings);
|
||||
BackgroundType(bool has_no_file, bool is_pattern, telegram_api::object_ptr<telegram_api::wallPaperSettings> settings);
|
||||
|
||||
static Result<BackgroundType> get_background_type(const td_api::BackgroundType *background_type,
|
||||
int32 dark_theme_dimming);
|
||||
|
@ -20,6 +20,7 @@ void BackgroundType::store(StorerT &storer) const {
|
||||
auto fill_type = fill_.get_type();
|
||||
bool is_gradient = fill_type == BackgroundFill::Type::Gradient;
|
||||
bool is_freeform_gradient = fill_type == BackgroundFill::Type::FreeformGradient;
|
||||
bool has_theme_name = !theme_name_.empty();
|
||||
BEGIN_STORE_FLAGS();
|
||||
STORE_FLAG(is_blurred_);
|
||||
STORE_FLAG(is_moving_);
|
||||
@ -27,6 +28,7 @@ void BackgroundType::store(StorerT &storer) const {
|
||||
STORE_FLAG(has_intensity);
|
||||
STORE_FLAG(is_gradient);
|
||||
STORE_FLAG(is_freeform_gradient);
|
||||
STORE_FLAG(has_theme_name);
|
||||
END_STORE_FLAGS();
|
||||
store(type_, storer);
|
||||
if (is_freeform_gradient) {
|
||||
@ -44,6 +46,9 @@ void BackgroundType::store(StorerT &storer) const {
|
||||
if (has_intensity) {
|
||||
store(intensity_, storer);
|
||||
}
|
||||
if (has_theme_name) {
|
||||
store(theme_name_, storer);
|
||||
}
|
||||
}
|
||||
|
||||
template <class ParserT>
|
||||
@ -53,6 +58,7 @@ void BackgroundType::parse(ParserT &parser) {
|
||||
bool has_intensity;
|
||||
bool is_gradient;
|
||||
bool is_freeform_gradient;
|
||||
bool has_theme_name;
|
||||
BEGIN_PARSE_FLAGS();
|
||||
PARSE_FLAG(is_blurred_);
|
||||
PARSE_FLAG(is_moving_);
|
||||
@ -60,6 +66,7 @@ void BackgroundType::parse(ParserT &parser) {
|
||||
PARSE_FLAG(has_intensity);
|
||||
PARSE_FLAG(is_gradient);
|
||||
PARSE_FLAG(is_freeform_gradient);
|
||||
PARSE_FLAG(has_theme_name);
|
||||
END_PARSE_FLAGS();
|
||||
parse(type_, parser);
|
||||
if (is_freeform_gradient) {
|
||||
@ -79,6 +86,9 @@ void BackgroundType::parse(ParserT &parser) {
|
||||
if (has_intensity) {
|
||||
parse(intensity_, parser);
|
||||
}
|
||||
if (has_theme_name) {
|
||||
parse(theme_name_, parser);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace td
|
||||
|
@ -2498,6 +2498,9 @@ Result<string> LinkManager::get_background_url(const string &name,
|
||||
if (background_type == nullptr) {
|
||||
return Status::Error(400, "Type must be non-empty");
|
||||
}
|
||||
if (background_type->get_id() == td_api::backgroundTypeChatTheme::ID) {
|
||||
return Status::Error(400, "Background has no link");
|
||||
}
|
||||
TRY_RESULT(type, BackgroundType::get_background_type(background_type.get(), 0));
|
||||
auto url = PSTRING() << get_t_me_url() << "bg/";
|
||||
auto link = type.get_link();
|
||||
|
@ -1150,9 +1150,10 @@ class CliClient final : public Actor {
|
||||
}
|
||||
|
||||
struct BackgroundType {
|
||||
enum class Type : int32 { Null, Wallpaper, SolidPattern, GradientPattern, Fill };
|
||||
enum class Type : int32 { Null, Wallpaper, SolidPattern, GradientPattern, Fill, ChatTheme };
|
||||
Type type = Type::Null;
|
||||
vector<int32> colors;
|
||||
string theme_name;
|
||||
|
||||
operator td_api::object_ptr<td_api::BackgroundType>() const {
|
||||
switch (type) {
|
||||
@ -1172,6 +1173,8 @@ class CliClient final : public Actor {
|
||||
return as_gradient_background(colors[0], colors[1]);
|
||||
}
|
||||
return as_freeform_gradient_background(colors);
|
||||
case Type::ChatTheme:
|
||||
return as_chat_theme_background(theme_name);
|
||||
default:
|
||||
UNREACHABLE();
|
||||
return nullptr;
|
||||
@ -1190,6 +1193,9 @@ class CliClient final : public Actor {
|
||||
arg.type = BackgroundType::Type::SolidPattern;
|
||||
} else if (args == "gp") {
|
||||
arg.type = BackgroundType::Type::GradientPattern;
|
||||
} else if (args[0] == 't') {
|
||||
arg.type = BackgroundType::Type::ChatTheme;
|
||||
arg.theme_name = args.substr(1);
|
||||
} else {
|
||||
arg.type = BackgroundType::Type::Fill;
|
||||
arg.colors = to_integers<int32>(args);
|
||||
@ -2257,6 +2263,10 @@ class CliClient final : public Actor {
|
||||
return td_api::make_object<td_api::backgroundTypeFill>(as_background_fill(std::move(colors)));
|
||||
}
|
||||
|
||||
static td_api::object_ptr<td_api::BackgroundType> as_chat_theme_background(const string &theme_name) {
|
||||
return td_api::make_object<td_api::backgroundTypeChatTheme>(theme_name);
|
||||
}
|
||||
|
||||
td_api::object_ptr<td_api::phoneNumberAuthenticationSettings> as_phone_number_authentication_settings() const {
|
||||
return td_api::make_object<td_api::phoneNumberAuthenticationSettings>(false, true, false, false, nullptr,
|
||||
vector<string>(authentication_tokens_));
|
||||
@ -3117,6 +3127,7 @@ class CliClient final : public Actor {
|
||||
send_get_background_url(as_freeform_gradient_background({0xFEDCBA, 0x222222}));
|
||||
send_get_background_url(as_freeform_gradient_background({0xFEDCBA, 0x111111, 0x222222}));
|
||||
send_get_background_url(as_freeform_gradient_background({0xABCDEF, 0xFEDCBA, 0x111111, 0x222222}));
|
||||
send_get_background_url(as_chat_theme_background(args));
|
||||
} else {
|
||||
op_not_found_count++;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user