Separate scope notification settings for channels.

GitOrigin-RevId: 11d11b2ddba5381d9dcac84768d923fa367f0248
This commit is contained in:
levlam 2019-01-29 14:40:56 +03:00
parent a93ec0605e
commit f465b460ca
9 changed files with 50 additions and 11 deletions

View File

@ -515,9 +515,12 @@ foundMessages messages:vector<message> next_from_search_id:int64 = FoundMessages
//@description Notification settings applied to all private and secret chats when the corresponding chat setting has a default value //@description Notification settings applied to all private and secret chats when the corresponding chat setting has a default value
notificationSettingsScopePrivateChats = NotificationSettingsScope; notificationSettingsScopePrivateChats = NotificationSettingsScope;
//@description Notification settings applied to all basic groups, supergroups and channels when the corresponding chat setting has a default value //@description Notification settings applied to all basic groups and supergroups when the corresponding chat setting has a default value
notificationSettingsScopeGroupChats = NotificationSettingsScope; notificationSettingsScopeGroupChats = NotificationSettingsScope;
//@description Notification settings applied to all channels when the corresponding chat setting has a default value
notificationSettingsScopeChannelChats = NotificationSettingsScope;
//@description Contains information about notification settings for a chat //@description Contains information about notification settings for a chat
//@use_default_mute_for If true, mute_for is ignored and the value for the relevant type of chat is used instead @mute_for Time left before notifications will be unmuted, in seconds //@use_default_mute_for If true, mute_for is ignored and the value for the relevant type of chat is used instead @mute_for Time left before notifications will be unmuted, in seconds

Binary file not shown.

View File

@ -4076,7 +4076,7 @@ void MessagesManager::on_dialog_unmute_timeout_callback(void *messages_manager_p
} }
auto messages_manager = static_cast<MessagesManager *>(messages_manager_ptr); auto messages_manager = static_cast<MessagesManager *>(messages_manager_ptr);
if (1 <= dialog_id_int && dialog_id_int <= 2) { if (1 <= dialog_id_int && dialog_id_int <= 3) {
send_closure_later(messages_manager->actor_id(messages_manager), &MessagesManager::on_scope_unmute, send_closure_later(messages_manager->actor_id(messages_manager), &MessagesManager::on_scope_unmute,
static_cast<NotificationSettingsScope>(dialog_id_int - 1)); static_cast<NotificationSettingsScope>(dialog_id_int - 1));
} else { } else {
@ -5514,6 +5514,8 @@ string MessagesManager::get_notification_settings_scope_database_key(Notificatio
return "nsfpc"; return "nsfpc";
case NotificationSettingsScope::Group: case NotificationSettingsScope::Group:
return "nsfgc"; return "nsfgc";
case NotificationSettingsScope::Channel:
return "nsfcc";
default: default:
UNREACHABLE(); UNREACHABLE();
return ""; return "";
@ -8722,7 +8724,8 @@ void MessagesManager::init() {
load_calls_db_state(); load_calls_db_state();
vector<NotificationSettingsScope> scopes{NotificationSettingsScope::Private, NotificationSettingsScope::Group}; vector<NotificationSettingsScope> scopes{NotificationSettingsScope::Private, NotificationSettingsScope::Group,
NotificationSettingsScope::Channel};
for (auto scope : scopes) { for (auto scope : scopes) {
auto notification_settings_string = auto notification_settings_string =
G()->td_db()->get_binlog_pmc()->get(get_notification_settings_scope_database_key(scope)); G()->td_db()->get_binlog_pmc()->get(get_notification_settings_scope_database_key(scope));
@ -8736,6 +8739,11 @@ void MessagesManager::init() {
update_scope_notification_settings(scope, current_settings, notification_settings); update_scope_notification_settings(scope, current_settings, notification_settings);
} }
} }
if (!channels_notification_settings_.is_synchronized) {
channels_notification_settings_ = chats_notification_settings_;
channels_notification_settings_.is_synchronized = false;
send_get_scope_notification_settings_query(NotificationSettingsScope::Channel, Promise<>());
}
G()->td_db()->get_binlog_pmc()->erase("nsfac"); G()->td_db()->get_binlog_pmc()->erase("nsfac");
/* /*
@ -12793,14 +12801,15 @@ std::pair<bool, int32> MessagesManager::get_dialog_mute_until(DialogId dialog_id
return {d->notification_settings.is_use_default_fixed, get_dialog_mute_until(d)}; return {d->notification_settings.is_use_default_fixed, get_dialog_mute_until(d)};
} }
NotificationSettingsScope MessagesManager::get_dialog_notification_setting_scope(DialogId dialog_id) { NotificationSettingsScope MessagesManager::get_dialog_notification_setting_scope(DialogId dialog_id) const {
switch (dialog_id.get_type()) { switch (dialog_id.get_type()) {
case DialogType::User: case DialogType::User:
case DialogType::SecretChat: case DialogType::SecretChat:
return NotificationSettingsScope::Private; return NotificationSettingsScope::Private;
case DialogType::Chat: case DialogType::Chat:
case DialogType::Channel:
return NotificationSettingsScope::Group; return NotificationSettingsScope::Group;
case DialogType::Channel:
return is_broadcast_channel(dialog_id) ? NotificationSettingsScope::Channel : NotificationSettingsScope::Group;
case DialogType::None: case DialogType::None:
default: default:
UNREACHABLE(); UNREACHABLE();
@ -12814,8 +12823,10 @@ int32 MessagesManager::get_scope_mute_until(DialogId dialog_id) const {
case DialogType::SecretChat: case DialogType::SecretChat:
return users_notification_settings_.mute_until; return users_notification_settings_.mute_until;
case DialogType::Chat: case DialogType::Chat:
case DialogType::Channel:
return chats_notification_settings_.mute_until; return chats_notification_settings_.mute_until;
case DialogType::Channel:
return is_broadcast_channel(dialog_id) ? channels_notification_settings_.mute_until
: chats_notification_settings_.mute_until;
case DialogType::None: case DialogType::None:
default: default:
UNREACHABLE(); UNREACHABLE();
@ -12853,6 +12864,8 @@ ScopeNotificationSettings *MessagesManager::get_scope_notification_settings(Noti
return &users_notification_settings_; return &users_notification_settings_;
case NotificationSettingsScope::Group: case NotificationSettingsScope::Group:
return &chats_notification_settings_; return &chats_notification_settings_;
case NotificationSettingsScope::Channel:
return &channels_notification_settings_;
default: default:
UNREACHABLE(); UNREACHABLE();
return nullptr; return nullptr;
@ -12866,6 +12879,8 @@ const ScopeNotificationSettings *MessagesManager::get_scope_notification_setting
return &users_notification_settings_; return &users_notification_settings_;
case NotificationSettingsScope::Group: case NotificationSettingsScope::Group:
return &chats_notification_settings_; return &chats_notification_settings_;
case NotificationSettingsScope::Channel:
return &channels_notification_settings_;
default: default:
UNREACHABLE(); UNREACHABLE();
return nullptr; return nullptr;
@ -12997,6 +13012,8 @@ void MessagesManager::reset_all_notification_settings() {
new_scope_settings); new_scope_settings);
update_scope_notification_settings(NotificationSettingsScope::Group, &chats_notification_settings_, update_scope_notification_settings(NotificationSettingsScope::Group, &chats_notification_settings_,
new_scope_settings); new_scope_settings);
update_scope_notification_settings(NotificationSettingsScope::Channel, &channels_notification_settings_,
new_scope_settings);
for (auto &dialog : dialogs_) { for (auto &dialog : dialogs_) {
Dialog *d = dialog.second.get(); Dialog *d = dialog.second.get();
@ -23194,6 +23211,9 @@ void MessagesManager::load_notification_settings() {
if (!chats_notification_settings_.is_synchronized) { if (!chats_notification_settings_.is_synchronized) {
send_get_scope_notification_settings_query(NotificationSettingsScope::Group, Promise<>()); send_get_scope_notification_settings_query(NotificationSettingsScope::Group, Promise<>());
} }
if (!channels_notification_settings_.is_synchronized) {
send_get_scope_notification_settings_query(NotificationSettingsScope::Channel, Promise<>());
}
} }
string MessagesManager::get_channel_pts_key(DialogId dialog_id) { string MessagesManager::get_channel_pts_key(DialogId dialog_id) {
@ -24781,7 +24801,8 @@ void MessagesManager::get_current_state(vector<td_api::object_ptr<td_api::Update
} }
} }
vector<NotificationSettingsScope> scopes{NotificationSettingsScope::Private, NotificationSettingsScope::Group}; vector<NotificationSettingsScope> scopes{NotificationSettingsScope::Private, NotificationSettingsScope::Group,
NotificationSettingsScope::Channel};
for (auto scope : scopes) { for (auto scope : scopes) {
auto current_settings = get_scope_notification_settings(scope); auto current_settings = get_scope_notification_settings(scope);
CHECK(current_settings != nullptr); CHECK(current_settings != nullptr);

View File

@ -1778,7 +1778,7 @@ class MessagesManager : public Actor {
std::pair<bool, int32> get_dialog_mute_until(DialogId dialog_id, const Dialog *d) const; std::pair<bool, int32> get_dialog_mute_until(DialogId dialog_id, const Dialog *d) const;
static NotificationSettingsScope get_dialog_notification_setting_scope(DialogId dialog_id); NotificationSettingsScope get_dialog_notification_setting_scope(DialogId dialog_id) const;
int32 get_scope_mute_until(DialogId dialog_id) const; int32 get_scope_mute_until(DialogId dialog_id) const;
@ -2214,6 +2214,7 @@ class MessagesManager : public Actor {
ScopeNotificationSettings users_notification_settings_; ScopeNotificationSettings users_notification_settings_;
ScopeNotificationSettings chats_notification_settings_; ScopeNotificationSettings chats_notification_settings_;
ScopeNotificationSettings channels_notification_settings_;
std::unordered_map<NotificationGroupId, DialogId, NotificationGroupIdHash> notification_group_id_to_dialog_id_; std::unordered_map<NotificationGroupId, DialogId, NotificationGroupIdHash> notification_group_id_to_dialog_id_;

View File

@ -31,6 +31,8 @@ StringBuilder &operator<<(StringBuilder &string_builder, NotificationSettingsSco
return string_builder << "notification settings for private chats"; return string_builder << "notification settings for private chats";
case NotificationSettingsScope::Group: case NotificationSettingsScope::Group:
return string_builder << "notification settings for group chats"; return string_builder << "notification settings for group chats";
case NotificationSettingsScope::Channel:
return string_builder << "notification settings for channel chats";
default: default:
UNREACHABLE(); UNREACHABLE();
return string_builder; return string_builder;
@ -51,6 +53,8 @@ td_api::object_ptr<td_api::NotificationSettingsScope> get_notification_settings_
return td_api::make_object<td_api::notificationSettingsScopePrivateChats>(); return td_api::make_object<td_api::notificationSettingsScopePrivateChats>();
case NotificationSettingsScope::Group: case NotificationSettingsScope::Group:
return td_api::make_object<td_api::notificationSettingsScopeGroupChats>(); return td_api::make_object<td_api::notificationSettingsScopeGroupChats>();
case NotificationSettingsScope::Channel:
return td_api::make_object<td_api::notificationSettingsScopeChannelChats>();
default: default:
UNREACHABLE(); UNREACHABLE();
return nullptr; return nullptr;
@ -85,6 +89,8 @@ telegram_api::object_ptr<telegram_api::InputNotifyPeer> get_input_notify_peer(No
return telegram_api::make_object<telegram_api::inputNotifyUsers>(); return telegram_api::make_object<telegram_api::inputNotifyUsers>();
case NotificationSettingsScope::Group: case NotificationSettingsScope::Group:
return telegram_api::make_object<telegram_api::inputNotifyChats>(); return telegram_api::make_object<telegram_api::inputNotifyChats>();
case NotificationSettingsScope::Channel:
return telegram_api::make_object<telegram_api::inputNotifyBroadcasts>();
default: default:
return nullptr; return nullptr;
} }
@ -98,6 +104,8 @@ NotificationSettingsScope get_notification_settings_scope(
return NotificationSettingsScope::Private; return NotificationSettingsScope::Private;
case td_api::notificationSettingsScopeGroupChats::ID: case td_api::notificationSettingsScopeGroupChats::ID:
return NotificationSettingsScope::Group; return NotificationSettingsScope::Group;
case td_api::notificationSettingsScopeChannelChats::ID:
return NotificationSettingsScope::Channel;
default: default:
UNREACHABLE(); UNREACHABLE();
return NotificationSettingsScope::Private; return NotificationSettingsScope::Private;

View File

@ -54,7 +54,7 @@ class DialogNotificationSettings {
} }
}; };
enum class NotificationSettingsScope : int32 { Private, Group }; enum class NotificationSettingsScope : int32 { Private, Group, Channel };
class ScopeNotificationSettings { class ScopeNotificationSettings {
public: public:

View File

@ -1521,6 +1521,9 @@ void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateNotifySettings>
case telegram_api::notifyChats::ID: case telegram_api::notifyChats::ID:
return td_->messages_manager_->on_update_scope_notify_settings(NotificationSettingsScope::Group, return td_->messages_manager_->on_update_scope_notify_settings(NotificationSettingsScope::Group,
std::move(update->notify_settings_)); std::move(update->notify_settings_));
case telegram_api::notifyBroadcasts::ID:
return td_->messages_manager_->on_update_scope_notify_settings(NotificationSettingsScope::Channel,
std::move(update->notify_settings_));
default: default:
UNREACHABLE(); UNREACHABLE();
} }

View File

@ -883,7 +883,10 @@ class CliClient final : public Actor {
} }
tl_object_ptr<td_api::NotificationSettingsScope> get_notification_settings_scope(Slice scope) const { tl_object_ptr<td_api::NotificationSettingsScope> get_notification_settings_scope(Slice scope) const {
if (scope == "chats" || scope == "groups" || scope == "channels" || as_bool(scope.str())) { if (scope == "channels" || scope == "ch") {
return make_tl_object<td_api::notificationSettingsScopeChannelChats>();
}
if (scope == "chats" || scope == "groups" || as_bool(scope.str())) {
return make_tl_object<td_api::notificationSettingsScopeGroupChats>(); return make_tl_object<td_api::notificationSettingsScopeGroupChats>();
} }
return make_tl_object<td_api::notificationSettingsScopePrivateChats>(); return make_tl_object<td_api::notificationSettingsScopePrivateChats>();

View File

@ -21,7 +21,7 @@ class HeaderStorer {
} }
template <class StorerT> template <class StorerT>
void store(StorerT &storer) const { void store(StorerT &storer) const {
constexpr int32 LAYER = 86; constexpr int32 LAYER = 87;
using td::store; using td::store;
// invokeWithLayer#da9b0d0d {X:Type} layer:int query:!X = X; // invokeWithLayer#da9b0d0d {X:Type} layer:int query:!X = X;