Add setForumTopicNotificationSettings.
This commit is contained in:
parent
c654041d9b
commit
d9e16106af
@ -1005,12 +1005,12 @@ notificationSettingsScopeGroupChats = NotificationSettingsScope;
|
|||||||
notificationSettingsScopeChannelChats = NotificationSettingsScope;
|
notificationSettingsScopeChannelChats = NotificationSettingsScope;
|
||||||
|
|
||||||
|
|
||||||
//@description Contains information about notification settings for a chat
|
//@description Contains information about notification settings for a chat or a froum topic
|
||||||
//@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 or the forum chat is used instead @mute_for Time left before notifications will be unmuted, in seconds
|
||||||
//@use_default_sound If true, the value for the relevant type of chat is used instead of sound_id @sound_id Identifier of the notification sound to be played; 0 if sound is disabled
|
//@use_default_sound If true, the value for the relevant type of chat or the forum chat is used instead of sound_id @sound_id Identifier of the notification sound to be played; 0 if sound is disabled
|
||||||
//@use_default_show_preview If true, show_preview is ignored and the value for the relevant type of chat is used instead @show_preview True, if message content must be displayed in notifications
|
//@use_default_show_preview If true, show_preview is ignored and the value for the relevant type of chat or the forum chat is used instead @show_preview True, if message content must be displayed in notifications
|
||||||
//@use_default_disable_pinned_message_notifications If true, disable_pinned_message_notifications is ignored and the value for the relevant type of chat is used instead @disable_pinned_message_notifications If true, notifications for incoming pinned messages will be created as for an ordinary unread message
|
//@use_default_disable_pinned_message_notifications If true, disable_pinned_message_notifications is ignored and the value for the relevant type of chat or the forum chat is used instead @disable_pinned_message_notifications If true, notifications for incoming pinned messages will be created as for an ordinary unread message
|
||||||
//@use_default_disable_mention_notifications If true, disable_mention_notifications is ignored and the value for the relevant type of chat is used instead @disable_mention_notifications If true, notifications for messages with mentions will be created as for an ordinary unread message
|
//@use_default_disable_mention_notifications If true, disable_mention_notifications is ignored and the value for the relevant type of chat or the forum chat is used instead @disable_mention_notifications If true, notifications for messages with mentions will be created as for an ordinary unread message
|
||||||
chatNotificationSettings use_default_mute_for:Bool mute_for:int32 use_default_sound:Bool sound_id:int64 use_default_show_preview:Bool show_preview:Bool use_default_disable_pinned_message_notifications:Bool disable_pinned_message_notifications:Bool use_default_disable_mention_notifications:Bool disable_mention_notifications:Bool = ChatNotificationSettings;
|
chatNotificationSettings use_default_mute_for:Bool mute_for:int32 use_default_sound:Bool sound_id:int64 use_default_show_preview:Bool show_preview:Bool use_default_disable_pinned_message_notifications:Bool disable_pinned_message_notifications:Bool use_default_disable_mention_notifications:Bool disable_mention_notifications:Bool = ChatNotificationSettings;
|
||||||
|
|
||||||
//@description Contains information about notification settings for several chats
|
//@description Contains information about notification settings for several chats
|
||||||
@ -5346,6 +5346,10 @@ getForumTopic chat_id:int53 message_thread_id:int53 = ForumTopic;
|
|||||||
//@description Returns an HTTPS link to a topic in a forum chat. This is an offline request @chat_id Identifier of the chat @message_thread_id Message thread identifier of the forum topic
|
//@description Returns an HTTPS link to a topic in a forum chat. This is an offline request @chat_id Identifier of the chat @message_thread_id Message thread identifier of the forum topic
|
||||||
getForumTopicLink chat_id:int53 message_thread_id:int53 = HttpUrl;
|
getForumTopicLink chat_id:int53 message_thread_id:int53 = HttpUrl;
|
||||||
|
|
||||||
|
//@description Changes the notification settings of a forum topic
|
||||||
|
//@chat_id Chat identifier @message_thread_id Message thread identifier of the forum topic @notification_settings New notification settings for the forum topic. If the topic is muted for more than 366 days, it is considered to be muted forever
|
||||||
|
setForumTopicNotificationSettings chat_id:int53 message_thread_id:int53 notification_settings:chatNotificationSettings = Ok;
|
||||||
|
|
||||||
//@description Toggles whether a topic is closed in a forum supergroup chat; requires can_manage_topics administrator rights in the supergroup unless the user is creator of the topic
|
//@description Toggles whether a topic is closed in a forum supergroup chat; requires can_manage_topics administrator rights in the supergroup unless the user is creator of the topic
|
||||||
//@chat_id Identifier of the chat
|
//@chat_id Identifier of the chat
|
||||||
//@message_thread_id Message thread identifier of the forum topic
|
//@message_thread_id Message thread identifier of the forum topic
|
||||||
|
@ -40,6 +40,14 @@ class ForumTopic {
|
|||||||
return is_short_;
|
return is_short_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DialogNotificationSettings *get_notification_settings() {
|
||||||
|
return ¬ification_settings_;
|
||||||
|
}
|
||||||
|
|
||||||
|
const DialogNotificationSettings *get_notification_settings() const {
|
||||||
|
return ¬ification_settings_;
|
||||||
|
}
|
||||||
|
|
||||||
td_api::object_ptr<td_api::forumTopic> get_forum_topic_object(Td *td, DialogId dialog_id,
|
td_api::object_ptr<td_api::forumTopic> get_forum_topic_object(Td *td, DialogId dialog_id,
|
||||||
const ForumTopicInfo &info) const;
|
const ForumTopicInfo &info) const;
|
||||||
|
|
||||||
|
@ -19,6 +19,8 @@
|
|||||||
#include "td/telegram/MessagesManager.h"
|
#include "td/telegram/MessagesManager.h"
|
||||||
#include "td/telegram/MessageThreadDb.h"
|
#include "td/telegram/MessageThreadDb.h"
|
||||||
#include "td/telegram/misc.h"
|
#include "td/telegram/misc.h"
|
||||||
|
#include "td/telegram/NotificationManager.h"
|
||||||
|
#include "td/telegram/NotificationSettingsManager.h"
|
||||||
#include "td/telegram/OptionManager.h"
|
#include "td/telegram/OptionManager.h"
|
||||||
#include "td/telegram/ServerMessageId.h"
|
#include "td/telegram/ServerMessageId.h"
|
||||||
#include "td/telegram/Td.h"
|
#include "td/telegram/Td.h"
|
||||||
@ -374,6 +376,115 @@ void ForumTopicManager::edit_forum_topic(DialogId dialog_id, MessageId top_threa
|
|||||||
->send(channel_id, top_thread_message_id, edit_title, new_title, edit_icon_custom_emoji, icon_custom_emoji_id);
|
->send(channel_id, top_thread_message_id, edit_title, new_title, edit_icon_custom_emoji, icon_custom_emoji_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DialogNotificationSettings *ForumTopicManager::get_forum_topic_notification_settings(DialogId dialog_id,
|
||||||
|
MessageId top_thread_message_id) {
|
||||||
|
auto topic = get_topic(dialog_id, top_thread_message_id);
|
||||||
|
if (topic == nullptr || topic->topic_ == nullptr) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
return topic->topic_->get_notification_settings();
|
||||||
|
}
|
||||||
|
|
||||||
|
const DialogNotificationSettings *ForumTopicManager::get_forum_topic_notification_settings(
|
||||||
|
DialogId dialog_id, MessageId top_thread_message_id) const {
|
||||||
|
auto topic = get_topic(dialog_id, top_thread_message_id);
|
||||||
|
if (topic == nullptr || topic->topic_ == nullptr) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
return topic->topic_->get_notification_settings();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ForumTopicManager::on_update_forum_topic_notify_settings(
|
||||||
|
DialogId dialog_id, MessageId top_thread_message_id,
|
||||||
|
tl_object_ptr<telegram_api::peerNotifySettings> &&peer_notify_settings, const char *source) {
|
||||||
|
if (td_->auth_manager_->is_bot()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
VLOG(notifications) << "Receive notification settings for topic of " << top_thread_message_id << " in " << dialog_id
|
||||||
|
<< " from " << source << ": " << to_string(peer_notify_settings);
|
||||||
|
|
||||||
|
DialogNotificationSettings *current_settings =
|
||||||
|
get_forum_topic_notification_settings(dialog_id, top_thread_message_id);
|
||||||
|
if (current_settings == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto notification_settings = get_dialog_notification_settings(
|
||||||
|
std::move(peer_notify_settings), current_settings->use_default_disable_pinned_message_notifications,
|
||||||
|
current_settings->disable_pinned_message_notifications,
|
||||||
|
current_settings->use_default_disable_mention_notifications, current_settings->disable_mention_notifications);
|
||||||
|
if (!notification_settings.is_synchronized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
update_forum_topic_notification_settings(dialog_id, top_thread_message_id, current_settings,
|
||||||
|
std::move(notification_settings));
|
||||||
|
}
|
||||||
|
|
||||||
|
Status ForumTopicManager::set_forum_topic_notification_settings(
|
||||||
|
DialogId dialog_id, MessageId top_thread_message_id,
|
||||||
|
tl_object_ptr<td_api::chatNotificationSettings> &¬ification_settings) {
|
||||||
|
CHECK(!td_->auth_manager_->is_bot());
|
||||||
|
TRY_STATUS(is_forum(dialog_id));
|
||||||
|
TRY_STATUS(can_be_message_thread_id(top_thread_message_id));
|
||||||
|
auto current_settings = get_forum_topic_notification_settings(dialog_id, top_thread_message_id);
|
||||||
|
if (current_settings == nullptr) {
|
||||||
|
return Status::Error(400, "Unknown forum topic identifier specified");
|
||||||
|
}
|
||||||
|
|
||||||
|
TRY_RESULT(new_settings,
|
||||||
|
get_dialog_notification_settings(std::move(notification_settings), current_settings->silent_send_message));
|
||||||
|
if (is_notification_sound_default(current_settings->sound) && is_notification_sound_default(new_settings.sound)) {
|
||||||
|
new_settings.sound = dup_notification_sound(current_settings->sound);
|
||||||
|
}
|
||||||
|
if (update_forum_topic_notification_settings(dialog_id, top_thread_message_id, current_settings,
|
||||||
|
std::move(new_settings))) {
|
||||||
|
// TODO log event
|
||||||
|
td_->notification_settings_manager_->update_dialog_notify_settings(dialog_id, top_thread_message_id,
|
||||||
|
*current_settings, Promise<Unit>());
|
||||||
|
}
|
||||||
|
return Status::OK();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ForumTopicManager::update_forum_topic_notification_settings(DialogId dialog_id, MessageId top_thread_message_id,
|
||||||
|
DialogNotificationSettings *current_settings,
|
||||||
|
DialogNotificationSettings &&new_settings) {
|
||||||
|
if (td_->auth_manager_->is_bot()) {
|
||||||
|
// just in case
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool need_update_server = current_settings->mute_until != new_settings.mute_until ||
|
||||||
|
!are_equivalent_notification_sounds(current_settings->sound, new_settings.sound) ||
|
||||||
|
current_settings->show_preview != new_settings.show_preview ||
|
||||||
|
current_settings->use_default_mute_until != new_settings.use_default_mute_until ||
|
||||||
|
current_settings->use_default_show_preview != new_settings.use_default_show_preview;
|
||||||
|
bool need_update_local =
|
||||||
|
current_settings->use_default_disable_pinned_message_notifications !=
|
||||||
|
new_settings.use_default_disable_pinned_message_notifications ||
|
||||||
|
current_settings->disable_pinned_message_notifications != new_settings.disable_pinned_message_notifications ||
|
||||||
|
current_settings->use_default_disable_mention_notifications !=
|
||||||
|
new_settings.use_default_disable_mention_notifications ||
|
||||||
|
current_settings->disable_mention_notifications != new_settings.disable_mention_notifications;
|
||||||
|
|
||||||
|
bool is_changed = need_update_server || need_update_local ||
|
||||||
|
current_settings->is_synchronized != new_settings.is_synchronized ||
|
||||||
|
current_settings->is_use_default_fixed != new_settings.is_use_default_fixed ||
|
||||||
|
are_different_equivalent_notification_sounds(current_settings->sound, new_settings.sound);
|
||||||
|
|
||||||
|
if (is_changed) {
|
||||||
|
// TODO update unmute timeouts, td_api updates, remove notifications
|
||||||
|
*current_settings = std::move(new_settings);
|
||||||
|
|
||||||
|
auto topic = get_topic(dialog_id, top_thread_message_id);
|
||||||
|
CHECK(topic != nullptr);
|
||||||
|
topic->need_save_to_database_ = true;
|
||||||
|
save_topic_to_database(dialog_id, topic);
|
||||||
|
}
|
||||||
|
return need_update_server;
|
||||||
|
}
|
||||||
|
|
||||||
void ForumTopicManager::get_forum_topic(DialogId dialog_id, MessageId top_thread_message_id,
|
void ForumTopicManager::get_forum_topic(DialogId dialog_id, MessageId top_thread_message_id,
|
||||||
Promise<td_api::object_ptr<td_api::forumTopic>> &&promise) {
|
Promise<td_api::object_ptr<td_api::forumTopic>> &&promise) {
|
||||||
TRY_STATUS_PROMISE(promise, is_forum(dialog_id));
|
TRY_STATUS_PROMISE(promise, is_forum(dialog_id));
|
||||||
|
@ -52,12 +52,23 @@ class ForumTopicManager final : public Actor {
|
|||||||
void toggle_forum_topic_is_closed(DialogId dialog_id, MessageId top_thread_message_id, bool is_closed,
|
void toggle_forum_topic_is_closed(DialogId dialog_id, MessageId top_thread_message_id, bool is_closed,
|
||||||
Promise<Unit> &&promise);
|
Promise<Unit> &&promise);
|
||||||
|
|
||||||
|
const DialogNotificationSettings *get_forum_topic_notification_settings(DialogId dialog_id,
|
||||||
|
MessageId top_thread_message_id) const;
|
||||||
|
|
||||||
|
Status set_forum_topic_notification_settings(DialogId dialog_id, MessageId top_thread_message_id,
|
||||||
|
tl_object_ptr<td_api::chatNotificationSettings> &¬ification_settings)
|
||||||
|
TD_WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
void toggle_forum_topic_is_hidden(DialogId dialog_id, bool is_hidden, Promise<Unit> &&promise);
|
void toggle_forum_topic_is_hidden(DialogId dialog_id, bool is_hidden, Promise<Unit> &&promise);
|
||||||
|
|
||||||
void delete_forum_topic(DialogId dialog_id, MessageId top_thread_message_id, Promise<Unit> &&promise);
|
void delete_forum_topic(DialogId dialog_id, MessageId top_thread_message_id, Promise<Unit> &&promise);
|
||||||
|
|
||||||
void delete_all_dialog_topics(DialogId dialog_id);
|
void delete_all_dialog_topics(DialogId dialog_id);
|
||||||
|
|
||||||
|
void on_update_forum_topic_notify_settings(DialogId dialog_id, MessageId top_thread_message_id,
|
||||||
|
tl_object_ptr<telegram_api::peerNotifySettings> &&peer_notify_settings,
|
||||||
|
const char *source);
|
||||||
|
|
||||||
void on_forum_topic_edited(DialogId dialog_id, MessageId top_thread_message_id,
|
void on_forum_topic_edited(DialogId dialog_id, MessageId top_thread_message_id,
|
||||||
const ForumTopicEditedData &edited_data);
|
const ForumTopicEditedData &edited_data);
|
||||||
|
|
||||||
@ -119,6 +130,13 @@ class ForumTopicManager final : public Actor {
|
|||||||
|
|
||||||
void set_topic_info(DialogId dialog_id, Topic *topic, unique_ptr<ForumTopicInfo> forum_topic_info);
|
void set_topic_info(DialogId dialog_id, Topic *topic, unique_ptr<ForumTopicInfo> forum_topic_info);
|
||||||
|
|
||||||
|
DialogNotificationSettings *get_forum_topic_notification_settings(DialogId dialog_id,
|
||||||
|
MessageId top_thread_message_id);
|
||||||
|
|
||||||
|
bool update_forum_topic_notification_settings(DialogId dialog_id, MessageId top_thread_message_id,
|
||||||
|
DialogNotificationSettings *current_settings,
|
||||||
|
DialogNotificationSettings &&new_settings);
|
||||||
|
|
||||||
void on_delete_forum_topic(DialogId dialog_id, MessageId top_thread_message_id, Promise<Unit> &&promise);
|
void on_delete_forum_topic(DialogId dialog_id, MessageId top_thread_message_id, Promise<Unit> &&promise);
|
||||||
|
|
||||||
td_api::object_ptr<td_api::updateForumTopicInfo> get_update_forum_topic_info(DialogId dialog_id,
|
td_api::object_ptr<td_api::updateForumTopicInfo> get_update_forum_topic_info(DialogId dialog_id,
|
||||||
|
@ -21043,7 +21043,7 @@ void MessagesManager::update_dialog_notification_settings_on_server(DialogId dia
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!from_binlog && td_->notification_settings_manager_->get_input_notify_peer(dialog_id) == nullptr) {
|
if (!from_binlog && td_->notification_settings_manager_->get_input_notify_peer(dialog_id, MessageId()) == nullptr) {
|
||||||
// don't even create new binlog events
|
// don't even create new binlog events
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -21077,8 +21077,8 @@ void MessagesManager::send_update_dialog_notification_settings_query(const Dialo
|
|||||||
CHECK(!td_->auth_manager_->is_bot());
|
CHECK(!td_->auth_manager_->is_bot());
|
||||||
CHECK(d != nullptr);
|
CHECK(d != nullptr);
|
||||||
// TODO do not send two queries simultaneously or use InvokeAfter
|
// TODO do not send two queries simultaneously or use InvokeAfter
|
||||||
td_->notification_settings_manager_->update_dialog_notify_settings(d->dialog_id, d->notification_settings,
|
td_->notification_settings_manager_->update_dialog_notify_settings(d->dialog_id, MessageId(),
|
||||||
std::move(promise));
|
d->notification_settings, std::move(promise));
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessagesManager::on_updated_dialog_notification_settings(DialogId dialog_id, uint64 generation) {
|
void MessagesManager::on_updated_dialog_notification_settings(DialogId dialog_id, uint64 generation) {
|
||||||
@ -31210,8 +31210,8 @@ bool MessagesManager::add_new_message_notification(Dialog *d, Message *m, bool f
|
|||||||
settings_dialog = get_dialog(settings_dialog_id);
|
settings_dialog = get_dialog(settings_dialog_id);
|
||||||
}
|
}
|
||||||
if (settings_dialog != nullptr) {
|
if (settings_dialog != nullptr) {
|
||||||
td_->notification_settings_manager_->send_get_dialog_notification_settings_query(settings_dialog_id,
|
td_->notification_settings_manager_->send_get_dialog_notification_settings_query(
|
||||||
std::move(promise));
|
settings_dialog_id, MessageId() /* TODO */, std::move(promise));
|
||||||
} else {
|
} else {
|
||||||
send_get_dialog_query(settings_dialog_id, std::move(promise), 0, "add_new_message_notification");
|
send_get_dialog_query(settings_dialog_id, std::move(promise), 0, "add_new_message_notification");
|
||||||
}
|
}
|
||||||
@ -37572,7 +37572,8 @@ void MessagesManager::fix_new_dialog(Dialog *d, unique_ptr<Message> &&last_datab
|
|||||||
d->notification_settings.is_use_default_fixed = true;
|
d->notification_settings.is_use_default_fixed = true;
|
||||||
on_dialog_updated(dialog_id, "reget notification settings");
|
on_dialog_updated(dialog_id, "reget notification settings");
|
||||||
} else {
|
} else {
|
||||||
td_->notification_settings_manager_->send_get_dialog_notification_settings_query(dialog_id, Promise<Unit>());
|
td_->notification_settings_manager_->send_get_dialog_notification_settings_query(dialog_id, MessageId(),
|
||||||
|
Promise<Unit>());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (td_->auth_manager_->is_bot() || d->notification_settings.use_default_mute_until ||
|
if (td_->auth_manager_->is_bot() || d->notification_settings.use_default_mute_until ||
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#include "td/telegram/files/FileLocation.h"
|
#include "td/telegram/files/FileLocation.h"
|
||||||
#include "td/telegram/files/FileManager.h"
|
#include "td/telegram/files/FileManager.h"
|
||||||
#include "td/telegram/files/FileType.h"
|
#include "td/telegram/files/FileType.h"
|
||||||
|
#include "td/telegram/ForumTopicManager.h"
|
||||||
#include "td/telegram/Global.h"
|
#include "td/telegram/Global.h"
|
||||||
#include "td/telegram/logevent/LogEvent.h"
|
#include "td/telegram/logevent/LogEvent.h"
|
||||||
#include "td/telegram/logevent/LogEventHelper.h"
|
#include "td/telegram/logevent/LogEventHelper.h"
|
||||||
@ -183,11 +184,14 @@ class GetSavedRingtonesQuery final : public Td::ResultHandler {
|
|||||||
|
|
||||||
class GetDialogNotifySettingsQuery final : public Td::ResultHandler {
|
class GetDialogNotifySettingsQuery final : public Td::ResultHandler {
|
||||||
DialogId dialog_id_;
|
DialogId dialog_id_;
|
||||||
|
MessageId top_thread_message_id_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void send(DialogId dialog_id) {
|
void send(DialogId dialog_id, MessageId top_thread_message_id) {
|
||||||
dialog_id_ = dialog_id;
|
dialog_id_ = dialog_id;
|
||||||
auto input_notify_peer = td_->notification_settings_manager_->get_input_notify_peer(dialog_id);
|
top_thread_message_id_ = top_thread_message_id;
|
||||||
|
auto input_notify_peer =
|
||||||
|
td_->notification_settings_manager_->get_input_notify_peer(dialog_id, top_thread_message_id);
|
||||||
CHECK(input_notify_peer != nullptr);
|
CHECK(input_notify_peer != nullptr);
|
||||||
send_query(G()->net_query_creator().create(telegram_api::account_getNotifySettings(std::move(input_notify_peer))));
|
send_query(G()->net_query_creator().create(telegram_api::account_getNotifySettings(std::move(input_notify_peer))));
|
||||||
}
|
}
|
||||||
@ -199,15 +203,21 @@ class GetDialogNotifySettingsQuery final : public Td::ResultHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto ptr = result_ptr.move_as_ok();
|
auto ptr = result_ptr.move_as_ok();
|
||||||
td_->messages_manager_->on_update_dialog_notify_settings(dialog_id_, std::move(ptr),
|
if (top_thread_message_id_.is_valid()) {
|
||||||
"GetDialogNotifySettingsQuery");
|
td_->forum_topic_manager_->on_update_forum_topic_notify_settings(dialog_id_, top_thread_message_id_,
|
||||||
td_->notification_settings_manager_->on_get_dialog_notification_settings_query_finished(dialog_id_, Status::OK());
|
std::move(ptr), "GetDialogNotifySettingsQuery");
|
||||||
|
} else {
|
||||||
|
td_->messages_manager_->on_update_dialog_notify_settings(dialog_id_, std::move(ptr),
|
||||||
|
"GetDialogNotifySettingsQuery");
|
||||||
|
}
|
||||||
|
td_->notification_settings_manager_->on_get_dialog_notification_settings_query_finished(
|
||||||
|
dialog_id_, top_thread_message_id_, Status::OK());
|
||||||
}
|
}
|
||||||
|
|
||||||
void on_error(Status status) final {
|
void on_error(Status status) final {
|
||||||
td_->messages_manager_->on_get_dialog_error(dialog_id_, status, "GetDialogNotifySettingsQuery");
|
td_->messages_manager_->on_get_dialog_error(dialog_id_, status, "GetDialogNotifySettingsQuery");
|
||||||
td_->notification_settings_manager_->on_get_dialog_notification_settings_query_finished(dialog_id_,
|
td_->notification_settings_manager_->on_get_dialog_notification_settings_query_finished(
|
||||||
std::move(status));
|
dialog_id_, top_thread_message_id_, std::move(status));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -308,15 +318,18 @@ class GetScopeNotifySettingsQuery final : public Td::ResultHandler {
|
|||||||
class UpdateDialogNotifySettingsQuery final : public Td::ResultHandler {
|
class UpdateDialogNotifySettingsQuery final : public Td::ResultHandler {
|
||||||
Promise<Unit> promise_;
|
Promise<Unit> promise_;
|
||||||
DialogId dialog_id_;
|
DialogId dialog_id_;
|
||||||
|
MessageId top_thread_message_id_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit UpdateDialogNotifySettingsQuery(Promise<Unit> &&promise) : promise_(std::move(promise)) {
|
explicit UpdateDialogNotifySettingsQuery(Promise<Unit> &&promise) : promise_(std::move(promise)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void send(DialogId dialog_id, const DialogNotificationSettings &new_settings) {
|
void send(DialogId dialog_id, MessageId top_thread_message_id, const DialogNotificationSettings &new_settings) {
|
||||||
dialog_id_ = dialog_id;
|
dialog_id_ = dialog_id;
|
||||||
|
top_thread_message_id_ = top_thread_message_id;
|
||||||
|
|
||||||
auto input_notify_peer = td_->notification_settings_manager_->get_input_notify_peer(dialog_id);
|
auto input_notify_peer =
|
||||||
|
td_->notification_settings_manager_->get_input_notify_peer(dialog_id, top_thread_message_id);
|
||||||
if (input_notify_peer == nullptr) {
|
if (input_notify_peer == nullptr) {
|
||||||
return on_error(Status::Error(500, "Can't update chat notification settings"));
|
return on_error(Status::Error(500, "Can't update chat notification settings"));
|
||||||
}
|
}
|
||||||
@ -360,9 +373,10 @@ class UpdateDialogNotifySettingsQuery final : public Td::ResultHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!td_->auth_manager_->is_bot() &&
|
if (!td_->auth_manager_->is_bot() &&
|
||||||
td_->notification_settings_manager_->get_input_notify_peer(dialog_id_) != nullptr) {
|
td_->notification_settings_manager_->get_input_notify_peer(dialog_id_, top_thread_message_id_) != nullptr) {
|
||||||
// trying to repair notification settings for this dialog
|
// trying to repair notification settings for this dialog
|
||||||
td_->notification_settings_manager_->send_get_dialog_notification_settings_query(dialog_id_, Promise<>());
|
td_->notification_settings_manager_->send_get_dialog_notification_settings_query(
|
||||||
|
dialog_id_, top_thread_message_id_, Promise<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
promise_.set_error(std::move(status));
|
promise_.set_error(std::move(status));
|
||||||
@ -596,7 +610,7 @@ bool NotificationSettingsManager::get_scope_disable_mention_notifications(Notifi
|
|||||||
}
|
}
|
||||||
|
|
||||||
tl_object_ptr<telegram_api::InputNotifyPeer> NotificationSettingsManager::get_input_notify_peer(
|
tl_object_ptr<telegram_api::InputNotifyPeer> NotificationSettingsManager::get_input_notify_peer(
|
||||||
DialogId dialog_id) const {
|
DialogId dialog_id, MessageId top_thread_message_id) const {
|
||||||
if (!td_->messages_manager_->have_dialog(dialog_id)) {
|
if (!td_->messages_manager_->have_dialog(dialog_id)) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -604,6 +618,11 @@ tl_object_ptr<telegram_api::InputNotifyPeer> NotificationSettingsManager::get_in
|
|||||||
if (input_peer == nullptr) {
|
if (input_peer == nullptr) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
if (top_thread_message_id.is_valid()) {
|
||||||
|
CHECK(top_thread_message_id.is_server());
|
||||||
|
return telegram_api::make_object<telegram_api::inputNotifyForumTopic>(
|
||||||
|
std::move(input_peer), top_thread_message_id.get_server_message_id().get());
|
||||||
|
}
|
||||||
return make_tl_object<telegram_api::inputNotifyPeer>(std::move(input_peer));
|
return make_tl_object<telegram_api::inputNotifyPeer>(std::move(input_peer));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1339,6 +1358,7 @@ FileSourceId NotificationSettingsManager::get_saved_ringtones_file_source_id() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void NotificationSettingsManager::send_get_dialog_notification_settings_query(DialogId dialog_id,
|
void NotificationSettingsManager::send_get_dialog_notification_settings_query(DialogId dialog_id,
|
||||||
|
MessageId top_thread_message_id,
|
||||||
Promise<Unit> &&promise) {
|
Promise<Unit> &&promise) {
|
||||||
if (td_->auth_manager_->is_bot() || dialog_id.get_type() == DialogType::SecretChat) {
|
if (td_->auth_manager_->is_bot() || dialog_id.get_type() == DialogType::SecretChat) {
|
||||||
LOG(WARNING) << "Can't get notification settings for " << dialog_id;
|
LOG(WARNING) << "Can't get notification settings for " << dialog_id;
|
||||||
@ -1349,14 +1369,14 @@ void NotificationSettingsManager::send_get_dialog_notification_settings_query(Di
|
|||||||
return promise.set_error(Status::Error(400, "Can't access the chat"));
|
return promise.set_error(Status::Error(400, "Can't access the chat"));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto &promises = get_dialog_notification_settings_queries_[dialog_id];
|
auto &promises = get_dialog_notification_settings_queries_[{dialog_id, top_thread_message_id}];
|
||||||
promises.push_back(std::move(promise));
|
promises.push_back(std::move(promise));
|
||||||
if (promises.size() != 1) {
|
if (promises.size() != 1) {
|
||||||
// query has already been sent, just wait for the result
|
// query has already been sent, just wait for the result
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
td_->create_handler<GetDialogNotifySettingsQuery>()->send(dialog_id);
|
td_->create_handler<GetDialogNotifySettingsQuery>()->send(dialog_id, top_thread_message_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
const ScopeNotificationSettings *NotificationSettingsManager::get_scope_notification_settings(
|
const ScopeNotificationSettings *NotificationSettingsManager::get_scope_notification_settings(
|
||||||
@ -1383,9 +1403,10 @@ void NotificationSettingsManager::send_get_scope_notification_settings_query(Not
|
|||||||
}
|
}
|
||||||
|
|
||||||
void NotificationSettingsManager::on_get_dialog_notification_settings_query_finished(DialogId dialog_id,
|
void NotificationSettingsManager::on_get_dialog_notification_settings_query_finished(DialogId dialog_id,
|
||||||
|
MessageId top_thread_message_id,
|
||||||
Status &&status) {
|
Status &&status) {
|
||||||
CHECK(!td_->auth_manager_->is_bot());
|
CHECK(!td_->auth_manager_->is_bot());
|
||||||
auto it = get_dialog_notification_settings_queries_.find(dialog_id);
|
auto it = get_dialog_notification_settings_queries_.find({dialog_id, top_thread_message_id});
|
||||||
CHECK(it != get_dialog_notification_settings_queries_.end());
|
CHECK(it != get_dialog_notification_settings_queries_.end());
|
||||||
CHECK(!it->second.empty());
|
CHECK(!it->second.empty());
|
||||||
auto promises = std::move(it->second);
|
auto promises = std::move(it->second);
|
||||||
@ -1398,10 +1419,11 @@ void NotificationSettingsManager::on_get_dialog_notification_settings_query_fini
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NotificationSettingsManager::update_dialog_notify_settings(DialogId dialog_id,
|
void NotificationSettingsManager::update_dialog_notify_settings(DialogId dialog_id, MessageId top_thread_message_id,
|
||||||
const DialogNotificationSettings &new_settings,
|
const DialogNotificationSettings &new_settings,
|
||||||
Promise<Unit> &&promise) {
|
Promise<Unit> &&promise) {
|
||||||
td_->create_handler<UpdateDialogNotifySettingsQuery>(std::move(promise))->send(dialog_id, new_settings);
|
td_->create_handler<UpdateDialogNotifySettingsQuery>(std::move(promise))
|
||||||
|
->send(dialog_id, top_thread_message_id, new_settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
Status NotificationSettingsManager::set_scope_notification_settings(
|
Status NotificationSettingsManager::set_scope_notification_settings(
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
#include "td/telegram/DialogNotificationSettings.h"
|
#include "td/telegram/DialogNotificationSettings.h"
|
||||||
#include "td/telegram/files/FileId.h"
|
#include "td/telegram/files/FileId.h"
|
||||||
#include "td/telegram/files/FileSourceId.h"
|
#include "td/telegram/files/FileSourceId.h"
|
||||||
|
#include "td/telegram/FullMessageId.h"
|
||||||
|
#include "td/telegram/MessageId.h"
|
||||||
#include "td/telegram/NotificationSettingsScope.h"
|
#include "td/telegram/NotificationSettingsScope.h"
|
||||||
#include "td/telegram/ScopeNotificationSettings.h"
|
#include "td/telegram/ScopeNotificationSettings.h"
|
||||||
#include "td/telegram/td_api.h"
|
#include "td/telegram/td_api.h"
|
||||||
@ -52,7 +54,8 @@ class NotificationSettingsManager final : public Actor {
|
|||||||
|
|
||||||
bool get_scope_disable_mention_notifications(NotificationSettingsScope scope) const;
|
bool get_scope_disable_mention_notifications(NotificationSettingsScope scope) const;
|
||||||
|
|
||||||
tl_object_ptr<telegram_api::InputNotifyPeer> get_input_notify_peer(DialogId dialog_id) const;
|
tl_object_ptr<telegram_api::InputNotifyPeer> get_input_notify_peer(DialogId dialog_id,
|
||||||
|
MessageId top_thread_message_id) const;
|
||||||
|
|
||||||
void on_update_scope_notify_settings(NotificationSettingsScope scope,
|
void on_update_scope_notify_settings(NotificationSettingsScope scope,
|
||||||
tl_object_ptr<telegram_api::peerNotifySettings> &&peer_notify_settings);
|
tl_object_ptr<telegram_api::peerNotifySettings> &&peer_notify_settings);
|
||||||
@ -75,16 +78,18 @@ class NotificationSettingsManager final : public Actor {
|
|||||||
void send_save_ringtone_query(FileId ringtone_file_id, bool unsave,
|
void send_save_ringtone_query(FileId ringtone_file_id, bool unsave,
|
||||||
Promise<telegram_api::object_ptr<telegram_api::account_SavedRingtone>> &&promise);
|
Promise<telegram_api::object_ptr<telegram_api::account_SavedRingtone>> &&promise);
|
||||||
|
|
||||||
void send_get_dialog_notification_settings_query(DialogId dialog_id, Promise<Unit> &&promise);
|
void send_get_dialog_notification_settings_query(DialogId dialog_id, MessageId top_thread_message_id,
|
||||||
|
Promise<Unit> &&promise);
|
||||||
|
|
||||||
const ScopeNotificationSettings *get_scope_notification_settings(NotificationSettingsScope scope,
|
const ScopeNotificationSettings *get_scope_notification_settings(NotificationSettingsScope scope,
|
||||||
Promise<Unit> &&promise);
|
Promise<Unit> &&promise);
|
||||||
void send_get_scope_notification_settings_query(NotificationSettingsScope scope, Promise<Unit> &&promise);
|
void send_get_scope_notification_settings_query(NotificationSettingsScope scope, Promise<Unit> &&promise);
|
||||||
|
|
||||||
void on_get_dialog_notification_settings_query_finished(DialogId dialog_id, Status &&status);
|
void on_get_dialog_notification_settings_query_finished(DialogId dialog_id, MessageId top_thread_message_id,
|
||||||
|
Status &&status);
|
||||||
|
|
||||||
void update_dialog_notify_settings(DialogId dialog_id, const DialogNotificationSettings &new_settings,
|
void update_dialog_notify_settings(DialogId dialog_id, MessageId top_thread_message_id,
|
||||||
Promise<Unit> &&promise);
|
const DialogNotificationSettings &new_settings, Promise<Unit> &&promise);
|
||||||
|
|
||||||
Status set_scope_notification_settings(NotificationSettingsScope scope,
|
Status set_scope_notification_settings(NotificationSettingsScope scope,
|
||||||
td_api::object_ptr<td_api::scopeNotificationSettings> &¬ification_settings)
|
td_api::object_ptr<td_api::scopeNotificationSettings> &¬ification_settings)
|
||||||
@ -211,7 +216,7 @@ class NotificationSettingsManager final : public Actor {
|
|||||||
vector<Promise<Unit>> reload_saved_ringtones_queries_;
|
vector<Promise<Unit>> reload_saved_ringtones_queries_;
|
||||||
vector<Promise<Unit>> repair_saved_ringtones_queries_;
|
vector<Promise<Unit>> repair_saved_ringtones_queries_;
|
||||||
|
|
||||||
FlatHashMap<DialogId, vector<Promise<Unit>>, DialogIdHash> get_dialog_notification_settings_queries_;
|
FlatHashMap<FullMessageId, vector<Promise<Unit>>, FullMessageIdHash> get_dialog_notification_settings_queries_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
@ -7424,6 +7424,13 @@ void Td::on_request(uint64 id, td_api::setChatNotificationSettings &request) {
|
|||||||
std::move(request.notification_settings_)));
|
std::move(request.notification_settings_)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Td::on_request(uint64 id, td_api::setForumTopicNotificationSettings &request) {
|
||||||
|
CHECK_IS_USER();
|
||||||
|
answer_ok_query(id, forum_topic_manager_->set_forum_topic_notification_settings(
|
||||||
|
DialogId(request.chat_id_), MessageId(request.message_thread_id_),
|
||||||
|
std::move(request.notification_settings_)));
|
||||||
|
}
|
||||||
|
|
||||||
void Td::on_request(uint64 id, td_api::setScopeNotificationSettings &request) {
|
void Td::on_request(uint64 id, td_api::setScopeNotificationSettings &request) {
|
||||||
CHECK_IS_USER();
|
CHECK_IS_USER();
|
||||||
if (request.scope_ == nullptr) {
|
if (request.scope_ == nullptr) {
|
||||||
|
@ -1218,6 +1218,8 @@ class Td final : public Actor {
|
|||||||
|
|
||||||
void on_request(uint64 id, td_api::setChatNotificationSettings &request);
|
void on_request(uint64 id, td_api::setChatNotificationSettings &request);
|
||||||
|
|
||||||
|
void on_request(uint64 id, td_api::setForumTopicNotificationSettings &request);
|
||||||
|
|
||||||
void on_request(uint64 id, td_api::setScopeNotificationSettings &request);
|
void on_request(uint64 id, td_api::setScopeNotificationSettings &request);
|
||||||
|
|
||||||
void on_request(uint64 id, const td_api::resetAllNotificationSettings &request);
|
void on_request(uint64 id, const td_api::resetAllNotificationSettings &request);
|
||||||
|
@ -4880,29 +4880,37 @@ class CliClient final : public Actor {
|
|||||||
as_notification_settings_scope(args), op == "gcnses"));
|
as_notification_settings_scope(args), op == "gcnses"));
|
||||||
} else if (op == "gsns") {
|
} else if (op == "gsns") {
|
||||||
send_request(td_api::make_object<td_api::getScopeNotificationSettings>(as_notification_settings_scope(args)));
|
send_request(td_api::make_object<td_api::getScopeNotificationSettings>(as_notification_settings_scope(args)));
|
||||||
} else if (op == "scns" || op == "ssns") {
|
} else if (op == "scns" || op == "ssns" || op == "sftns") {
|
||||||
string chat_id_or_scope;
|
string scope;
|
||||||
string mute_for;
|
string mute_for;
|
||||||
int64 sound_id;
|
int64 sound_id;
|
||||||
string show_preview;
|
string show_preview;
|
||||||
string disable_pinned_message_notifications;
|
string disable_pinned_message_notifications;
|
||||||
string disable_mention_notifications;
|
string disable_mention_notifications;
|
||||||
get_args(args, chat_id_or_scope, mute_for, sound_id, show_preview, disable_pinned_message_notifications,
|
get_args(args, scope, mute_for, sound_id, show_preview, disable_pinned_message_notifications,
|
||||||
disable_mention_notifications);
|
disable_mention_notifications);
|
||||||
if (op == "scns") {
|
if (op == "ssns") {
|
||||||
send_request(td_api::make_object<td_api::setChatNotificationSettings>(
|
|
||||||
as_chat_id(chat_id_or_scope),
|
|
||||||
td_api::make_object<td_api::chatNotificationSettings>(
|
|
||||||
mute_for.empty(), to_integer<int32>(mute_for), sound_id == -1, sound_id, show_preview.empty(),
|
|
||||||
as_bool(show_preview), disable_pinned_message_notifications.empty(),
|
|
||||||
as_bool(disable_pinned_message_notifications), disable_mention_notifications.empty(),
|
|
||||||
as_bool(disable_mention_notifications))));
|
|
||||||
} else {
|
|
||||||
send_request(td_api::make_object<td_api::setScopeNotificationSettings>(
|
send_request(td_api::make_object<td_api::setScopeNotificationSettings>(
|
||||||
as_notification_settings_scope(chat_id_or_scope),
|
as_notification_settings_scope(scope),
|
||||||
td_api::make_object<td_api::scopeNotificationSettings>(
|
td_api::make_object<td_api::scopeNotificationSettings>(
|
||||||
to_integer<int32>(mute_for), sound_id, as_bool(show_preview),
|
to_integer<int32>(mute_for), sound_id, as_bool(show_preview),
|
||||||
as_bool(disable_pinned_message_notifications), as_bool(disable_mention_notifications))));
|
as_bool(disable_pinned_message_notifications), as_bool(disable_mention_notifications))));
|
||||||
|
} else {
|
||||||
|
auto settings = td_api::make_object<td_api::chatNotificationSettings>(
|
||||||
|
mute_for.empty(), to_integer<int32>(mute_for), sound_id == -1, sound_id, show_preview.empty(),
|
||||||
|
as_bool(show_preview), disable_pinned_message_notifications.empty(),
|
||||||
|
as_bool(disable_pinned_message_notifications), disable_mention_notifications.empty(),
|
||||||
|
as_bool(disable_mention_notifications));
|
||||||
|
if (op == "scns") {
|
||||||
|
send_request(
|
||||||
|
td_api::make_object<td_api::setChatNotificationSettings>(as_chat_id(scope), std::move(settings)));
|
||||||
|
} else {
|
||||||
|
string chat_id;
|
||||||
|
string message_id;
|
||||||
|
std::tie(chat_id, message_id) = split(scope, ',');
|
||||||
|
send_request(td_api::make_object<td_api::setForumTopicNotificationSettings>(
|
||||||
|
as_chat_id(chat_id), as_message_id(message_id), std::move(settings)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (op == "rans") {
|
} else if (op == "rans") {
|
||||||
send_request(td_api::make_object<td_api::resetAllNotificationSettings>());
|
send_request(td_api::make_object<td_api::resetAllNotificationSettings>());
|
||||||
|
Loading…
Reference in New Issue
Block a user