diff --git a/CMakeLists.txt b/CMakeLists.txt index 045597fa8..7ffe57d9c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -535,6 +535,8 @@ set(TDLIB_SOURCE td/telegram/net/SessionProxy.h td/telegram/net/SessionMultiProxy.h td/telegram/net/TempAuthKeyWatchdog.h + td/telegram/NotificationGroupId.h + td/telegram/NotificationId.h td/telegram/NotificationManager.h td/telegram/NotificationSettings.h td/telegram/NotificationType.h diff --git a/td/telegram/CallId.h b/td/telegram/CallId.h index 227e2240d..8494cd52a 100644 --- a/td/telegram/CallId.h +++ b/td/telegram/CallId.h @@ -15,6 +15,7 @@ #include namespace td { + class CallId { public: CallId() = default; @@ -54,4 +55,5 @@ struct CallIdHash { inline StringBuilder &operator<<(StringBuilder &sb, const CallId call_id) { return sb << "CallId(" << call_id.get() << ")"; } + } // namespace td diff --git a/td/telegram/NotificationGroupId.h b/td/telegram/NotificationGroupId.h new file mode 100644 index 000000000..b5f1c2adf --- /dev/null +++ b/td/telegram/NotificationGroupId.h @@ -0,0 +1,53 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// +// 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/utils/common.h" +#include "td/utils/StringBuilder.h" + +#include +#include + +namespace td { + +class NotificationGroupId { + public: + NotificationGroupId() = default; + + explicit NotificationGroupId(int32 group_id) : id(group_id) { + } + + template ::value>> + NotificationGroupId(T group_id) = delete; + + bool is_valid() const { + return id > 0; + } + + int32 get() const { + return id; + } + + bool operator==(const NotificationGroupId &other) const { + return id == other.id; + } + + private: + int32 id{0}; +}; + +struct NotificationGroupIdHash { + std::size_t operator()(NotificationGroupId group_id) const { + return std::hash()(group_id.get()); + } +}; + +inline StringBuilder &operator<<(StringBuilder &sb, const NotificationGroupId group_id) { + return sb << "NotificationGroup(" << group_id.get() << ")"; +} + +} // namespace td diff --git a/td/telegram/NotificationId.h b/td/telegram/NotificationId.h new file mode 100644 index 000000000..bdd955454 --- /dev/null +++ b/td/telegram/NotificationId.h @@ -0,0 +1,53 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// +// 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/utils/common.h" +#include "td/utils/StringBuilder.h" + +#include +#include + +namespace td { + +class NotificationId { + public: + NotificationId() = default; + + explicit NotificationId(int32 notification_id) : id(notification_id) { + } + + template ::value>> + NotificationId(T notification_id) = delete; + + bool is_valid() const { + return id > 0; + } + + int32 get() const { + return id; + } + + bool operator==(const NotificationId &other) const { + return id == other.id; + } + + private: + int32 id{0}; +}; + +struct NotificationIdHash { + std::size_t operator()(NotificationId notification_id) const { + return std::hash()(notification_id.get()); + } +}; + +inline StringBuilder &operator<<(StringBuilder &sb, const NotificationId notification_id) { + return sb << "Notification(" << notification_id.get() << ")"; +} + +} // namespace td diff --git a/td/telegram/NotificationManager.cpp b/td/telegram/NotificationManager.cpp index 615220743..5ab07dc8b 100644 --- a/td/telegram/NotificationManager.cpp +++ b/td/telegram/NotificationManager.cpp @@ -13,45 +13,37 @@ namespace td { NotificationManager::NotificationManager(Td *td) : td_(td) { } -int32 NotificationManager::get_next_notification_id() { - return 0; +NotificationId NotificationManager::get_next_notification_id() { + return NotificationId(); } -void NotificationManager::add_notification(int32 group_id, int32 total_count, DialogId dialog_id, - DialogId notification_settings_dialog_id, bool silent, int32 notification_id, - unique_ptr type) { +void NotificationManager::add_notification(NotificationGroupId group_id, int32 total_count, DialogId dialog_id, + DialogId notification_settings_dialog_id, bool silent, + NotificationId notification_id, unique_ptr type) { } -void NotificationManager::edit_notification(int32 notification_id, unique_ptr type) { +void NotificationManager::edit_notification(NotificationId notification_id, unique_ptr type) { } -void NotificationManager::delete_notification(int32 notification_id) { +void NotificationManager::delete_notification(NotificationId notification_id) { } -void NotificationManager::remove_notification(int32 notification_id, Promise &&promise) { - if (!is_valid_notification_id(notification_id)) { +void NotificationManager::remove_notification(NotificationId notification_id, Promise &&promise) { + if (!notification_id.is_valid()) { return promise.set_error(Status::Error(400, "Notification identifier is invalid")); } promise.set_value(Unit()); } -void NotificationManager::remove_notification_group(int32 group_id, int32 max_notification_id, +void NotificationManager::remove_notification_group(NotificationGroupId group_id, NotificationId max_notification_id, Promise &&promise) { - if (!is_valid_group_id(group_id)) { + if (!group_id.is_valid()) { return promise.set_error(Status::Error(400, "Group identifier is invalid")); } - if (!is_valid_notification_id(max_notification_id)) { + if (!max_notification_id.is_valid()) { return promise.set_error(Status::Error(400, "Notification identifier is invalid")); } promise.set_value(Unit()); } -bool NotificationManager::is_valid_notification_id(int32 notification_id) { - return notification_id > 0; -} - -bool NotificationManager::is_valid_group_id(int32 group_id) { - return group_id > 0; -} - } // namespace td diff --git a/td/telegram/NotificationManager.h b/td/telegram/NotificationManager.h index bd5203c7a..871b0b6c7 100644 --- a/td/telegram/NotificationManager.h +++ b/td/telegram/NotificationManager.h @@ -7,6 +7,8 @@ #pragma once #include "td/telegram/DialogId.h" +#include "td/telegram/NotificationGroupId.h" +#include "td/telegram/NotificationId.h" #include "td/telegram/NotificationType.h" #include "td/actor/PromiseFuture.h" @@ -21,24 +23,22 @@ class NotificationManager { public: explicit NotificationManager(Td *td); - int32 get_next_notification_id(); + NotificationId get_next_notification_id(); - void add_notification(int32 group_id, int32 total_count, DialogId dialog_id, DialogId notification_settings_dialog_id, - bool silent, int32 notification_id, unique_ptr type); + void add_notification(NotificationGroupId group_id, int32 total_count, DialogId dialog_id, + DialogId notification_settings_dialog_id, bool silent, NotificationId notification_id, + unique_ptr type); - void edit_notification(int32 notification_id, unique_ptr type); + void edit_notification(NotificationId notification_id, unique_ptr type); - void delete_notification(int32 notification_id); + void delete_notification(NotificationId notification_id); - void remove_notification(int32 notification_id, Promise &&promise); + void remove_notification(NotificationId notification_id, Promise &&promise); - void remove_notification_group(int32 group_id, int32 max_notification_id, Promise &&promise); + void remove_notification_group(NotificationGroupId group_id, NotificationId max_notification_id, + Promise &&promise); private: - static bool is_valid_notification_id(int32 notification_id); - - static bool is_valid_group_id(int32 group_id); - Td *td_; }; diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index bd6603fd0..f3dda4f27 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -44,6 +44,8 @@ #include "td/telegram/MessageId.h" #include "td/telegram/MessagesManager.h" #include "td/telegram/misc.h" +#include "td/telegram/NotificationGroupId.h" +#include "td/telegram/NotificationId.h" #include "td/telegram/NotificationManager.h" #include "td/telegram/NotificationSettings.h" #include "td/telegram/PasswordManager.h" @@ -5067,14 +5069,14 @@ void Td::on_request(uint64 id, td_api::getChatMessageCount &request) { void Td::on_request(uint64 id, const td_api::removeNotification &request) { CHECK_IS_USER(); CREATE_OK_REQUEST_PROMISE(); - notification_manager_->remove_notification(request.notification_id_, std::move(promise)); + notification_manager_->remove_notification(NotificationId(request.notification_id_), std::move(promise)); } void Td::on_request(uint64 id, const td_api::removeNotificationGroup &request) { CHECK_IS_USER(); CREATE_OK_REQUEST_PROMISE(); - notification_manager_->remove_notification_group(request.notification_group_id_, request.max_notification_id_, - std::move(promise)); + notification_manager_->remove_notification_group(NotificationGroupId(request.notification_group_id_), + NotificationId(request.max_notification_id_), std::move(promise)); } void Td::on_request(uint64 id, const td_api::deleteMessages &request) {