/* This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "data/business/data_business_info.h" #include "apiwrap.h" #include "data/business/data_business_common.h" #include "data/data_session.h" #include "data/data_user.h" #include "main/main_session.h" namespace Data { namespace { [[nodiscard]] MTPBusinessWorkHours ToMTP(const WorkingHours &data) { const auto list = data.intervals.normalized().list; const auto proj = [](const WorkingInterval &data) { return MTPBusinessWeeklyOpen(MTP_businessWeeklyOpen( MTP_int(data.start / 60), MTP_int(data.end / 60))); }; return MTP_businessWorkHours( MTP_flags(0), MTP_string(data.timezoneId), MTP_vector_from_range(list | ranges::views::transform(proj))); } [[nodiscard]] MTPInputBusinessRecipients ToMTP( const BusinessRecipients &data) { //MTP_flags(RecipientsFlags(data.recipients, Flag())), // MTP_vector_from_range( // (data.recipients.allButExcluded // ? data.recipients.excluded // : data.recipients.included).list // | ranges::views::transform(&UserData::inputUser)), using Flag = MTPDinputBusinessRecipients::Flag; using Type = BusinessChatType; const auto &chats = data.allButExcluded ? data.excluded : data.included; const auto flags = Flag() | ((chats.types & Type::NewChats) ? Flag::f_new_chats : Flag()) | ((chats.types & Type::ExistingChats) ? Flag::f_existing_chats : Flag()) | ((chats.types & Type::Contacts) ? Flag::f_contacts : Flag()) | ((chats.types & Type::NonContacts) ? Flag::f_non_contacts : Flag()) | (chats.list.empty() ? Flag() : Flag::f_users) | (data.allButExcluded ? Flag::f_exclude_selected : Flag()); const auto &users = data.allButExcluded ? data.excluded : data.included; return MTP_inputBusinessRecipients( MTP_flags(flags), MTP_vector_from_range(users.list | ranges::views::transform(&UserData::inputUser))); } template [[nodiscard]] auto RecipientsFlags( const BusinessRecipients &data, Flag) { using Type = BusinessChatType; const auto &chats = data.allButExcluded ? data.excluded : data.included; return Flag() | ((chats.types & Type::NewChats) ? Flag::f_new_chats : Flag()) | ((chats.types & Type::ExistingChats) ? Flag::f_existing_chats : Flag()) | ((chats.types & Type::Contacts) ? Flag::f_contacts : Flag()) | ((chats.types & Type::NonContacts) ? Flag::f_non_contacts : Flag()) | (chats.list.empty() ? Flag() : Flag::f_users) | (data.allButExcluded ? Flag::f_exclude_selected : Flag()); } [[nodiscard]] MTPBusinessAwayMessageSchedule ToMTP( const AwaySchedule &data) { Expects(data.type != AwayScheduleType::Never); return (data.type == AwayScheduleType::Always) ? MTP_businessAwayMessageScheduleAlways() : (data.type == AwayScheduleType::OutsideWorkingHours) ? MTP_businessAwayMessageScheduleOutsideWorkHours() : MTP_businessAwayMessageScheduleCustom( MTP_int(data.customInterval.start), MTP_int(data.customInterval.end)); } [[nodiscard]] MTPInputBusinessAwayMessage ToMTP(const AwaySettings &data) { using Flag = MTPDinputBusinessAwayMessage::Flag; return MTP_inputBusinessAwayMessage( MTP_flags(data.offlineOnly ? Flag::f_offline_only : Flag()), MTP_int(data.shortcutId), ToMTP(data.schedule), ToMTP(data.recipients)); } [[nodiscard]] MTPInputBusinessGreetingMessage ToMTP( const GreetingSettings &data) { return MTP_inputBusinessGreetingMessage( MTP_int(data.shortcutId), ToMTP(data.recipients), MTP_int(data.noActivityDays)); } } // namespace BusinessInfo::BusinessInfo(not_null owner) : _owner(owner) { } BusinessInfo::~BusinessInfo() = default; void BusinessInfo::saveWorkingHours(WorkingHours data) { auto details = _owner->session().user()->businessDetails(); if (details.hours == data) { return; } using Flag = MTPaccount_UpdateBusinessWorkHours::Flag; _owner->session().api().request(MTPaccount_UpdateBusinessWorkHours( MTP_flags(data ? Flag::f_business_work_hours : Flag()), ToMTP(data) )).send(); details.hours = std::move(data); _owner->session().user()->setBusinessDetails(std::move(details)); } void BusinessInfo::applyAwaySettings(AwaySettings data) { if (_awaySettings == data) { return; } _awaySettings = data; _awaySettingsChanged.fire({}); } void BusinessInfo::saveAwaySettings(AwaySettings data) { if (_awaySettings == data) { return; } using Flag = MTPaccount_UpdateBusinessAwayMessage::Flag; _owner->session().api().request(MTPaccount_UpdateBusinessAwayMessage( MTP_flags(data ? Flag::f_message : Flag()), data ? ToMTP(data) : MTPInputBusinessAwayMessage() )).send(); _awaySettings = std::move(data); _awaySettingsChanged.fire({}); } bool BusinessInfo::awaySettingsLoaded() const { return _awaySettings.has_value(); } AwaySettings BusinessInfo::awaySettings() const { return _awaySettings.value_or(AwaySettings()); } rpl::producer<> BusinessInfo::awaySettingsChanged() const { return _awaySettingsChanged.events(); } void BusinessInfo::applyGreetingSettings(GreetingSettings data) { if (_greetingSettings == data) { return; } _greetingSettings = data; _greetingSettingsChanged.fire({}); } void BusinessInfo::saveGreetingSettings(GreetingSettings data) { if (_greetingSettings == data) { return; } using Flag = MTPaccount_UpdateBusinessGreetingMessage::Flag; _owner->session().api().request(MTPaccount_UpdateBusinessGreetingMessage( MTP_flags(data ? Flag::f_message : Flag()), data ? ToMTP(data) : MTPInputBusinessGreetingMessage() )).send(); _greetingSettings = std::move(data); _greetingSettingsChanged.fire({}); } bool BusinessInfo::greetingSettingsLoaded() const { return _greetingSettings.has_value(); } GreetingSettings BusinessInfo::greetingSettings() const { return _greetingSettings.value_or(GreetingSettings()); } rpl::producer<> BusinessInfo::greetingSettingsChanged() const { return _greetingSettingsChanged.events(); } void BusinessInfo::preload() { preloadTimezones(); } void BusinessInfo::preloadTimezones() { if (!_timezones.current().list.empty() || _timezonesRequestId) { return; } _timezonesRequestId = _owner->session().api().request( MTPhelp_GetTimezonesList(MTP_int(_timezonesHash)) ).done([=](const MTPhelp_TimezonesList &result) { result.match([&](const MTPDhelp_timezonesList &data) { _timezonesHash = data.vhash().v; const auto proj = [](const MTPtimezone &result) { return Timezone{ .id = qs(result.data().vid()), .name = qs(result.data().vname()), .utcOffset = result.data().vutc_offset().v, }; }; _timezones = Timezones{ .list = ranges::views::all( data.vtimezones().v ) | ranges::views::transform( proj ) | ranges::to_vector, }; }, [](const MTPDhelp_timezonesListNotModified &) { }); }).send(); } rpl::producer BusinessInfo::timezonesValue() const { const_cast(this)->preloadTimezones(); return _timezones.value(); } } // namespace Data