Add userFullInfo.business_work_hours.

This commit is contained in:
levlam 2024-02-20 15:22:02 +03:00
parent 8d9edcb31d
commit ea58ed8831
7 changed files with 242 additions and 3 deletions

View File

@ -301,6 +301,7 @@ set(TDLIB_SOURCE
td/telegram/BotCommandScope.cpp
td/telegram/BotInfoManager.cpp
td/telegram/BotMenuButton.cpp
td/telegram/BusinessWorkHours.cpp
td/telegram/CallActor.cpp
td/telegram/CallbackQueriesManager.cpp
td/telegram/CallDiscardReason.cpp
@ -578,6 +579,7 @@ set(TDLIB_SOURCE
td/telegram/BotCommandScope.h
td/telegram/BotInfoManager.h
td/telegram/BotMenuButton.h
td/telegram/BusinessWorkHours.h
td/telegram/CallActor.h
td/telegram/CallDiscardReason.h
td/telegram/CallId.h
@ -874,6 +876,7 @@ set(TDLIB_SOURCE
td/telegram/AuthManager.hpp
td/telegram/BackgroundInfo.hpp
td/telegram/BackgroundType.hpp
td/telegram/BusinessWorkHours.hpp
td/telegram/ChatReactions.hpp
td/telegram/DialogNotificationSettings.hpp
td/telegram/DialogFilter.hpp

View File

@ -576,6 +576,15 @@ botMenuButton text:string url:string = BotMenuButton;
chatLocation location:location address:string = ChatLocation;
//@description Describes an interval of time when the business is open
//@start_minute The first minute of the interval since start of the week; 0-7*24*60
//@end_minute The first minute after the end of the interval since start of the week; 1-8*24*60
businessWorkHoursInterval start_minute:int32 end_minute:int32 = BusinessWorkHoursInterval;
//@description Describes work hours of a business @time_zone_id Unique time zone identifier @work_hours Intervals of the time when the business is open
businessWorkHours time_zone_id:string work_hours:vector<businessWorkHoursInterval> = BusinessWorkHours;
//@class ChatPhotoStickerType @description Describes type of a sticker, which was used to create a chat photo
//@description Information about the sticker, which was used to create the chat photo
@ -848,8 +857,9 @@ botInfo short_description:string description:string photo:photo animation:animat
//@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
//@business_location Location of the business for Telegram Business users; may be null if none
//@business_work_hours Work hours of the business for Telegram Business users; may be null if none
//@bot_info For bots, information about the bot; may be null if the user isn't a bot
userFullInfo personal_photo:chatPhoto photo:chatPhoto public_photo:chatPhoto block_list:BlockList can_be_called:Bool supports_video_calls:Bool has_private_calls:Bool has_private_forwards:Bool has_restricted_voice_and_video_note_messages:Bool has_pinned_stories:Bool need_phone_number_privacy_exception:Bool set_chat_background:Bool bio:formattedText premium_gift_options:vector<premiumPaymentOption> group_in_common_count:int32 business_location:chatLocation bot_info:botInfo = UserFullInfo;
userFullInfo personal_photo:chatPhoto photo:chatPhoto public_photo:chatPhoto block_list:BlockList can_be_called:Bool supports_video_calls:Bool has_private_calls:Bool has_private_forwards:Bool has_restricted_voice_and_video_note_messages:Bool has_pinned_stories:Bool need_phone_number_privacy_exception:Bool set_chat_background:Bool bio:formattedText premium_gift_options:vector<premiumPaymentOption> group_in_common_count:int32 business_location:chatLocation business_work_hours:businessWorkHours 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

@ -0,0 +1,67 @@
//
// 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/BusinessWorkHours.h"
#include "td/utils/algorithm.h"
#include "td/utils/format.h"
namespace td {
td_api::object_ptr<td_api::businessWorkHoursInterval>
BusinessWorkHours::WorkHoursInterval::get_business_work_hours_interval_object() const {
return td_api::make_object<td_api::businessWorkHoursInterval>(start_minute_, end_minute_);
}
BusinessWorkHours::BusinessWorkHours(telegram_api::object_ptr<telegram_api::businessWorkHours> &&work_hours) {
if (work_hours != nullptr) {
work_hours_ = transform(work_hours->weekly_open_,
[](const telegram_api::object_ptr<telegram_api::businessWeeklyOpen> &weekly_open) {
return WorkHoursInterval(weekly_open->start_minute_, weekly_open->end_minute_);
});
time_zone_id_ = std::move(work_hours->timezone_id_);
}
}
bool BusinessWorkHours::is_empty() const {
return work_hours_.empty();
}
td_api::object_ptr<td_api::businessWorkHours> BusinessWorkHours::get_business_work_hours_object() const {
if (is_empty()) {
return nullptr;
}
return td_api::make_object<td_api::businessWorkHours>(time_zone_id_,
transform(work_hours_, [](const WorkHoursInterval &interval) {
return interval.get_business_work_hours_interval_object();
}));
}
bool operator==(const BusinessWorkHours::WorkHoursInterval &lhs, const BusinessWorkHours::WorkHoursInterval &rhs) {
return lhs.start_minute_ == rhs.start_minute_ && lhs.end_minute_ == rhs.end_minute_;
}
bool operator!=(const BusinessWorkHours::WorkHoursInterval &lhs, const BusinessWorkHours::WorkHoursInterval &rhs) {
return !(lhs == rhs);
}
StringBuilder &operator<<(StringBuilder &string_builder, const BusinessWorkHours::WorkHoursInterval &interval) {
return string_builder << '[' << interval.start_minute_ << ',' << interval.end_minute_ << ')';
}
bool operator==(const BusinessWorkHours &lhs, const BusinessWorkHours &rhs) {
return lhs.work_hours_ == rhs.work_hours_ && lhs.time_zone_id_ == rhs.time_zone_id_;
}
bool operator!=(const BusinessWorkHours &lhs, const BusinessWorkHours &rhs) {
return !(lhs == rhs);
}
StringBuilder &operator<<(StringBuilder &string_builder, const BusinessWorkHours &work_hours) {
return string_builder << "BusinessWorkHours[" << work_hours.work_hours_ << " in " << work_hours.time_zone_id_ << ']';
}
} // namespace td

View File

@ -0,0 +1,75 @@
//
// 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)
//
#pragma once
#include "td/telegram/td_api.h"
#include "td/telegram/telegram_api.h"
#include "td/utils/common.h"
#include "td/utils/StringBuilder.h"
namespace td {
class Td;
class BusinessWorkHours {
struct WorkHoursInterval {
int32 start_minute_ = 0;
int32 end_minute_ = 0;
WorkHoursInterval() = default;
WorkHoursInterval(int32 start_minute, int32 end_minute) : start_minute_(start_minute), end_minute_(end_minute) {
}
td_api::object_ptr<td_api::businessWorkHoursInterval> get_business_work_hours_interval_object() const;
template <class StorerT>
void store(StorerT &storer) const;
template <class ParserT>
void parse(ParserT &parser);
};
vector<WorkHoursInterval> work_hours_;
string time_zone_id_;
friend bool operator==(const WorkHoursInterval &lhs, const WorkHoursInterval &rhs);
friend bool operator!=(const WorkHoursInterval &lhs, const WorkHoursInterval &rhs);
friend bool operator==(const BusinessWorkHours &lhs, const BusinessWorkHours &rhs);
friend bool operator!=(const BusinessWorkHours &lhs, const BusinessWorkHours &rhs);
friend StringBuilder &operator<<(StringBuilder &string_builder, const WorkHoursInterval &interval);
friend StringBuilder &operator<<(StringBuilder &string_builder, const BusinessWorkHours &work_hours);
public:
BusinessWorkHours() = default;
BusinessWorkHours(telegram_api::object_ptr<telegram_api::businessWorkHours> &&work_hours);
bool is_empty() const;
td_api::object_ptr<td_api::businessWorkHours> get_business_work_hours_object() const;
template <class StorerT>
void store(StorerT &storer) const;
template <class ParserT>
void parse(ParserT &parser);
};
bool operator==(const BusinessWorkHours::WorkHoursInterval &lhs, const BusinessWorkHours::WorkHoursInterval &rhs);
bool operator!=(const BusinessWorkHours::WorkHoursInterval &lhs, const BusinessWorkHours::WorkHoursInterval &rhs);
StringBuilder &operator<<(StringBuilder &string_builder, const BusinessWorkHours::WorkHoursInterval &interval);
bool operator==(const BusinessWorkHours &lhs, const BusinessWorkHours &rhs);
bool operator!=(const BusinessWorkHours &lhs, const BusinessWorkHours &rhs);
StringBuilder &operator<<(StringBuilder &string_builder, const BusinessWorkHours &work_hours);
} // namespace td

View File

@ -0,0 +1,43 @@
//
// 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)
//
#pragma once
#include "td/telegram/BusinessWorkHours.h"
#include "td/utils/tl_helpers.h"
namespace td {
template <class StorerT>
void BusinessWorkHours::WorkHoursInterval::store(StorerT &storer) const {
td::store(start_minute_, storer);
td::store(end_minute_, storer);
}
template <class ParserT>
void BusinessWorkHours::WorkHoursInterval::parse(ParserT &parser) {
td::parse(start_minute_, parser);
td::parse(end_minute_, parser);
}
template <class StorerT>
void BusinessWorkHours::store(StorerT &storer) const {
BEGIN_STORE_FLAGS();
END_STORE_FLAGS();
td::store(work_hours_, storer);
td::store(time_zone_id_, storer);
}
template <class ParserT>
void BusinessWorkHours::parse(ParserT &parser) {
BEGIN_PARSE_FLAGS();
END_PARSE_FLAGS();
td::parse(work_hours_, parser);
td::parse(time_zone_id_, parser);
}
} // namespace td

View File

@ -11,6 +11,7 @@
#include "td/telegram/AuthManager.h"
#include "td/telegram/BlockListId.h"
#include "td/telegram/BotMenuButton.h"
#include "td/telegram/BusinessWorkHours.hpp"
#include "td/telegram/CommonDialogManager.h"
#include "td/telegram/ConfigManager.h"
#include "td/telegram/Dependencies.h"
@ -3464,6 +3465,7 @@ void ContactsManager::UserFull::store(StorerT &storer) const {
bool has_personal_photo = !personal_photo.is_empty();
bool has_fallback_photo = !fallback_photo.is_empty();
bool has_location = !location.empty();
bool has_work_hours = !work_hours.is_empty();
BEGIN_STORE_FLAGS();
STORE_FLAG(has_about);
STORE_FLAG(is_blocked);
@ -3490,7 +3492,8 @@ void ContactsManager::UserFull::store(StorerT &storer) const {
STORE_FLAG(wallpaper_overridden);
STORE_FLAG(read_dates_private);
STORE_FLAG(contact_require_premium);
STORE_FLAG(has_location);
STORE_FLAG(has_location); // 25
STORE_FLAG(has_work_hours);
END_STORE_FLAGS();
if (has_about) {
store(about, storer);
@ -3537,6 +3540,9 @@ void ContactsManager::UserFull::store(StorerT &storer) const {
if (has_location) {
store(location, storer);
}
if (has_work_hours) {
store(work_hours, storer);
}
}
template <class ParserT>
@ -3556,6 +3562,7 @@ void ContactsManager::UserFull::parse(ParserT &parser) {
bool has_personal_photo;
bool has_fallback_photo;
bool has_location;
bool has_work_hours;
BEGIN_PARSE_FLAGS();
PARSE_FLAG(has_about);
PARSE_FLAG(is_blocked);
@ -3583,6 +3590,7 @@ void ContactsManager::UserFull::parse(ParserT &parser) {
PARSE_FLAG(read_dates_private);
PARSE_FLAG(contact_require_premium);
PARSE_FLAG(has_location);
PARSE_FLAG(has_work_hours);
END_PARSE_FLAGS();
if (has_about) {
parse(about, parser);
@ -3629,6 +3637,9 @@ void ContactsManager::UserFull::parse(ParserT &parser) {
if (has_location) {
parse(location, parser);
}
if (has_work_hours) {
parse(work_hours, parser);
}
}
template <class StorerT>
@ -12725,6 +12736,30 @@ void ContactsManager::on_update_user_full_location(UserFull *user_full, UserId u
}
}
void ContactsManager::on_update_user_work_hours(UserId user_id, BusinessWorkHours &&work_hours) {
LOG(INFO) << "Receive " << work_hours << " for " << user_id;
if (!user_id.is_valid()) {
LOG(ERROR) << "Receive invalid " << user_id;
return;
}
UserFull *user_full = get_user_full_force(user_id, "on_update_user_work_hours");
if (user_full == nullptr) {
return;
}
on_update_user_full_work_hours(user_full, user_id, std::move(work_hours));
update_user_full(user_full, user_id, "on_update_user_work_hours");
}
void ContactsManager::on_update_user_full_work_hours(UserFull *user_full, UserId user_id,
BusinessWorkHours &&work_hours) {
CHECK(user_full != nullptr);
if (user_full->work_hours != work_hours) {
user_full->work_hours = std::move(work_hours);
user_full->is_changed = true;
}
}
void ContactsManager::on_update_user_full_commands(UserFull *user_full, UserId user_id,
vector<tl_object_ptr<telegram_api::botCommand>> &&bot_commands) {
CHECK(user_full != nullptr);
@ -13112,6 +13147,7 @@ void ContactsManager::drop_user_full(UserId user_id) {
user_full->commands.clear();
user_full->common_chat_count = 0;
user_full->location = {};
user_full->work_hours = {};
user_full->private_forward_name.clear();
user_full->group_administrator_rights = {};
user_full->broadcast_administrator_rights = {};
@ -17084,7 +17120,8 @@ tl_object_ptr<td_api::userFullInfo> ContactsManager::get_user_full_info_object(U
!user_full->private_forward_name.empty(), voice_messages_forbidden, user_full->has_pinned_stories,
user_full->need_phone_number_privacy_exception, user_full->wallpaper_overridden, std::move(bio_object),
get_premium_payment_options_object(user_full->premium_gift_options), user_full->common_chat_count,
user_full->location.get_chat_location_object(), std::move(bot_info));
user_full->location.get_chat_location_object(), user_full->work_hours.get_business_work_hours_object(),
std::move(bot_info));
}
td_api::object_ptr<td_api::updateBasicGroup> ContactsManager::get_update_basic_group_object(ChatId chat_id,

View File

@ -10,6 +10,7 @@
#include "td/telegram/AccessRights.h"
#include "td/telegram/BotCommand.h"
#include "td/telegram/BotMenuButton.h"
#include "td/telegram/BusinessWorkHours.h"
#include "td/telegram/ChannelId.h"
#include "td/telegram/ChannelType.h"
#include "td/telegram/ChatId.h"
@ -251,6 +252,7 @@ class ContactsManager final : public Actor {
void on_update_user_has_pinned_stories(UserId user_id, bool has_pinned_stories);
void on_update_user_common_chat_count(UserId user_id, int32 common_chat_count);
void on_update_user_location(UserId user_id, DialogLocation &&location);
void on_update_user_work_hours(UserId user_id, BusinessWorkHours &&work_hours);
void on_update_user_need_phone_number_privacy_exception(UserId user_id, bool need_phone_number_privacy_exception);
void on_update_user_wallpaper_overridden(UserId user_id, bool wallpaper_overridden);
@ -828,6 +830,7 @@ class ContactsManager final : public Actor {
int32 common_chat_count = 0;
DialogLocation location;
BusinessWorkHours work_hours;
bool is_blocked = false;
bool is_blocked_for_stories = false;
@ -1435,6 +1438,7 @@ class ContactsManager final : public Actor {
bool is_blocked_for_stories);
static void on_update_user_full_common_chat_count(UserFull *user_full, UserId user_id, int32 common_chat_count);
static void on_update_user_full_location(UserFull *user_full, UserId user_id, DialogLocation &&location);
static void on_update_user_full_work_hours(UserFull *user_full, UserId user_id, BusinessWorkHours &&work_hours);
static void on_update_user_full_commands(UserFull *user_full, UserId user_id,
vector<tl_object_ptr<telegram_api::botCommand>> &&bot_commands);
static void on_update_user_full_menu_button(UserFull *user_full, UserId user_id,