8
8
9
9
#include " td/telegram/AccessRights.h"
10
10
#include " td/telegram/AudiosManager.h"
11
+ #include " td/telegram/AudiosManager.hpp"
11
12
#include " td/telegram/AuthManager.h"
12
13
#include " td/telegram/ConfigShared.h"
13
14
#include " td/telegram/ContactsManager.h"
@@ -460,6 +461,39 @@ class NotificationSettingsManager::UploadRingtoneCallback final : public FileMan
460
461
}
461
462
};
462
463
464
+ class NotificationSettingsManager ::RingtoneListLogEvent {
465
+ public:
466
+ int64 hash_;
467
+ vector<FileId> ringtone_file_ids_;
468
+
469
+ RingtoneListLogEvent () = default ;
470
+
471
+ RingtoneListLogEvent (int64 hash, vector<FileId> ringtone_file_ids)
472
+ : hash_(hash), ringtone_file_ids_(std::move(ringtone_file_ids)) {
473
+ }
474
+
475
+ template <class StorerT >
476
+ void store (StorerT &storer) const {
477
+ td::store (hash_, storer);
478
+ AudiosManager *audios_manager = storer.context ()->td ().get_actor_unsafe ()->audios_manager_ .get ();
479
+ td::store (narrow_cast<int32>(ringtone_file_ids_.size ()), storer);
480
+ for (auto ringtone_file_id : ringtone_file_ids_) {
481
+ audios_manager->store_audio (ringtone_file_id, storer);
482
+ }
483
+ }
484
+
485
+ template <class ParserT >
486
+ void parse (ParserT &parser) {
487
+ td::parse (hash_, parser);
488
+ AudiosManager *audios_manager = parser.context ()->td ().get_actor_unsafe ()->audios_manager_ .get ();
489
+ int32 size = parser.fetch_int ();
490
+ ringtone_file_ids_.resize (size);
491
+ for (auto &ringtone_file_id : ringtone_file_ids_) {
492
+ ringtone_file_id = audios_manager->parse_audio (parser);
493
+ }
494
+ }
495
+ };
496
+
463
497
NotificationSettingsManager::NotificationSettingsManager (Td *td, ActorShared<> parent)
464
498
: td_(td), parent_(std::move(parent)) {
465
499
upload_ringtone_callback_ = std::make_shared<UploadRingtoneCallback>();
@@ -761,7 +795,7 @@ bool NotificationSettingsManager::is_active() const {
761
795
762
796
FileId NotificationSettingsManager::get_saved_ringtone (int64 ringtone_id, Promise<Unit> &&promise) {
763
797
if (!are_saved_ringtones_loaded_) {
764
- reload_saved_ringtones (std::move (promise));
798
+ load_saved_ringtones (std::move (promise));
765
799
return {};
766
800
}
767
801
@@ -780,7 +814,7 @@ FileId NotificationSettingsManager::get_saved_ringtone(int64 ringtone_id, Promis
780
814
781
815
vector<FileId> NotificationSettingsManager::get_saved_ringtones (Promise<Unit> &&promise) {
782
816
if (!are_saved_ringtones_loaded_) {
783
- reload_saved_ringtones (std::move (promise));
817
+ load_saved_ringtones (std::move (promise));
784
818
return {};
785
819
}
786
820
@@ -808,8 +842,8 @@ void NotificationSettingsManager::add_saved_ringtone(td_api::object_ptr<td_api::
808
842
TRY_STATUS_PROMISE (promise, G ()->close_status ());
809
843
810
844
if (!are_saved_ringtones_loaded_) {
811
- reload_saved_ringtones (PromiseCreator::lambda ([actor_id = actor_id (this ), input_file = std::move (input_file),
812
- promise = std::move (promise)](Result<Unit> &&result) mutable {
845
+ load_saved_ringtones (PromiseCreator::lambda ([actor_id = actor_id (this ), input_file = std::move (input_file),
846
+ promise = std::move (promise)](Result<Unit> &&result) mutable {
813
847
if (result.is_error ()) {
814
848
return promise.set_error (result.move_as_error ());
815
849
}
@@ -1017,7 +1051,7 @@ void NotificationSettingsManager::on_add_saved_ringtone(
1017
1051
1018
1052
void NotificationSettingsManager::remove_saved_ringtone (int64 ringtone_id, Promise<Unit> &&promise) {
1019
1053
if (!are_saved_ringtones_loaded_) {
1020
- reload_saved_ringtones (std::move (promise));
1054
+ load_saved_ringtones (std::move (promise));
1021
1055
return ;
1022
1056
}
1023
1057
@@ -1093,12 +1127,51 @@ Result<FileId> NotificationSettingsManager::get_ringtone(
1093
1127
return parsed_document.file_id ;
1094
1128
}
1095
1129
1130
+ void NotificationSettingsManager::load_saved_ringtones (Promise<Unit> &&promise) {
1131
+ CHECK (!are_saved_ringtones_loaded_);
1132
+ auto saved_ringtones_string = G ()->td_db ()->get_binlog_pmc ()->get (get_saved_ringtones_database_key ());
1133
+ if (saved_ringtones_string.empty ()) {
1134
+ return reload_saved_ringtones (std::move (promise));
1135
+ }
1136
+
1137
+ RingtoneListLogEvent saved_ringtones_log_event;
1138
+ bool is_valid = log_event_parse (saved_ringtones_log_event, saved_ringtones_string).is_ok ();
1139
+
1140
+ for (auto &ringtone_file_id : saved_ringtones_log_event.ringtone_file_ids_ ) {
1141
+ if (!ringtone_file_id.is_valid ()) {
1142
+ is_valid = false ;
1143
+ break ;
1144
+ }
1145
+ }
1146
+ if (is_valid) {
1147
+ saved_ringtone_hash_ = saved_ringtones_log_event.hash_ ;
1148
+ saved_ringtone_file_ids_ = std::move (saved_ringtones_log_event.ringtone_file_ids_ );
1149
+ are_saved_ringtones_loaded_ = true ;
1150
+
1151
+ if (!saved_ringtone_file_ids_.empty ()) {
1152
+ on_saved_ringtones_updated (true );
1153
+ }
1154
+
1155
+ // the promis must not be set synchronously
1156
+ send_closure_later (actor_id (this ), &NotificationSettingsManager::on_load_saved_ringtones, std::move (promise));
1157
+ reload_saved_ringtones (Auto ());
1158
+ } else {
1159
+ LOG (ERROR) << " Ignore invalid saved notification sounds log event" ;
1160
+ reload_saved_ringtones (std::move (promise));
1161
+ }
1162
+ }
1163
+
1164
+ void NotificationSettingsManager::on_load_saved_ringtones (Promise<Unit> &&promise) {
1165
+ promise.set_value (Unit ());
1166
+ }
1167
+
1096
1168
void NotificationSettingsManager::reload_saved_ringtones (Promise<Unit> &&promise) {
1097
1169
if (!is_active ()) {
1098
1170
return promise.set_error (Status::Error (400 , " Don't need to reload saved notification sounds" ));
1099
1171
}
1100
1172
reload_saved_ringtones_queries_.push_back (std::move (promise));
1101
1173
if (reload_saved_ringtones_queries_.size () == 1 ) {
1174
+ are_saved_ringtones_reloaded_ = true ;
1102
1175
auto query_promise = PromiseCreator::lambda (
1103
1176
[actor_id = actor_id (this )](Result<telegram_api::object_ptr<telegram_api::account_SavedRingtones>> &&result) {
1104
1177
send_closure (actor_id, &NotificationSettingsManager::on_reload_saved_ringtones, false , std::move (result));
@@ -1114,6 +1187,7 @@ void NotificationSettingsManager::repair_saved_ringtones(Promise<Unit> &&promise
1114
1187
1115
1188
repair_saved_ringtones_queries_.push_back (std::move (promise));
1116
1189
if (repair_saved_ringtones_queries_.size () == 1u ) {
1190
+ are_saved_ringtones_reloaded_ = true ;
1117
1191
auto query_promise = PromiseCreator::lambda (
1118
1192
[actor_id = actor_id (this )](Result<telegram_api::object_ptr<telegram_api::account_SavedRingtones>> &&result) {
1119
1193
send_closure (actor_id, &NotificationSettingsManager::on_reload_saved_ringtones, true , std::move (result));
@@ -1201,6 +1275,16 @@ NotificationSettingsManager::get_update_saved_notification_sounds_object() const
1201
1275
return td_api::make_object<td_api::updateSavedNotificationSounds>(std::move (ringtone_ids));
1202
1276
}
1203
1277
1278
+ string NotificationSettingsManager::get_saved_ringtones_database_key () {
1279
+ return " ringtones" ;
1280
+ }
1281
+
1282
+ void NotificationSettingsManager::save_saved_ringtones_to_database () const {
1283
+ RingtoneListLogEvent ringtone_list_log_event{saved_ringtone_hash_, saved_ringtone_file_ids_};
1284
+ G ()->td_db ()->get_binlog_pmc ()->set (get_saved_ringtones_database_key (),
1285
+ log_event_store (ringtone_list_log_event).as_slice ().str ());
1286
+ }
1287
+
1204
1288
void NotificationSettingsManager::on_saved_ringtones_updated (bool from_database) {
1205
1289
CHECK (are_saved_ringtones_loaded_);
1206
1290
vector<FileId> new_sorted_saved_ringtone_file_ids = saved_ringtone_file_ids_;
@@ -1212,7 +1296,7 @@ void NotificationSettingsManager::on_saved_ringtones_updated(bool from_database)
1212
1296
}
1213
1297
1214
1298
if (!from_database) {
1215
- // save_saved_ringtones_to_database();
1299
+ save_saved_ringtones_to_database ();
1216
1300
}
1217
1301
1218
1302
send_closure (G ()->td (), &Td::send_update, get_update_saved_notification_sounds_object ());
@@ -1365,7 +1449,6 @@ void NotificationSettingsManager::after_get_difference() {
1365
1449
}
1366
1450
1367
1451
if (td_->is_online () && !are_saved_ringtones_reloaded_) {
1368
- are_saved_ringtones_reloaded_ = true ;
1369
1452
reload_saved_ringtones (Auto ());
1370
1453
}
1371
1454
}
0 commit comments