Add log event for story reading.

This commit is contained in:
levlam 2023-06-15 15:25:32 +03:00
parent d3a08e06dc
commit 2aeeb09b4d
4 changed files with 50 additions and 4 deletions

View File

@ -715,7 +715,7 @@ void StoryManager::open_story(DialogId owner_dialog_id, StoryId story_id, Promis
}
if (need_read_story && on_update_read_stories(owner_dialog_id, story_id)) {
read_stories_on_server(owner_dialog_id, story_id);
read_stories_on_server(owner_dialog_id, story_id, 0);
}
promise.set_value(Unit());
@ -753,8 +753,36 @@ void StoryManager::on_increment_story_views(DialogId owner_dialog_id) {
increment_story_views(owner_dialog_id, story_views);
}
void StoryManager::read_stories_on_server(DialogId owner_dialog_id, StoryId story_id) {
td_->create_handler<ReadStoriesQuery>(Promise<Unit>())->send(owner_dialog_id, story_id);
class StoryManager::ReadStoriesOnServerLogEvent {
public:
DialogId dialog_id_;
StoryId max_story_id_;
template <class StorerT>
void store(StorerT &storer) const {
td::store(dialog_id_, storer);
td::store(max_story_id_, storer);
}
template <class ParserT>
void parse(ParserT &parser) {
td::parse(dialog_id_, parser);
td::parse(max_story_id_, parser);
}
};
uint64 StoryManager::save_read_stories_on_server_log_event(DialogId dialog_id, StoryId max_story_id) {
ReadStoriesOnServerLogEvent log_event{dialog_id, max_story_id};
return binlog_add(G()->td_db()->get_binlog(), LogEvent::HandlerType::ReadStoriesOnServer,
get_log_event_storer(log_event));
}
void StoryManager::read_stories_on_server(DialogId owner_dialog_id, StoryId story_id, uint64 log_event_id) {
if (log_event_id == 0 && G()->use_chat_info_database()) {
log_event_id = save_read_stories_on_server_log_event(owner_dialog_id, story_id);
}
td_->create_handler<ReadStoriesQuery>(get_erase_log_event_promise(log_event_id))->send(owner_dialog_id, story_id);
}
bool StoryManager::have_story(StoryFullId story_full_id) const {
@ -1756,9 +1784,22 @@ void StoryManager::on_binlog_events(vector<BinlogEvent> &&events) {
break;
}
td_->messages_manager_->have_dialog_info_force(dialog_id);
delete_story_on_server(dialog_id, log_event.story_id_, event.id_, Auto());
break;
}
case LogEvent::HandlerType::ReadStoriesOnServer: {
ReadStoriesOnServerLogEvent log_event;
log_event_parse(log_event, event.get_data()).ensure();
auto dialog_id = log_event.dialog_id_;
if (!td_->messages_manager_->have_dialog_info_force(dialog_id)) {
binlog_erase(G()->td_db()->get_binlog(), event.id_);
break;
}
read_stories_on_server(dialog_id, log_event.max_story_id_, event.id_);
break;
}
default:
LOG(FATAL) << "Unsupported log event type " << event.type_;
}

View File

@ -159,6 +159,7 @@ class StoryManager final : public Actor {
class EditStoryQuery;
class DeleteStoryOnServerLogEvent;
class ReadStoriesOnServerLogEvent;
void tear_down() final;
@ -239,7 +240,9 @@ class StoryManager final : public Actor {
void on_increment_story_views(DialogId owner_dialog_id);
void read_stories_on_server(DialogId owner_dialog_id, StoryId story_id);
static uint64 save_read_stories_on_server_log_event(DialogId dialog_id, StoryId max_story_id);
void read_stories_on_server(DialogId owner_dialog_id, StoryId story_id, uint64 log_event_id);
std::shared_ptr<UploadMediaCallback> upload_media_callback_;

View File

@ -127,6 +127,7 @@ Status init_binlog(Binlog &binlog, string path, BinlogKeyValue<Binlog> &binlog_p
events.to_messages_manager.push_back(event.clone());
break;
case LogEvent::HandlerType::DeleteStoryOnServer:
case LogEvent::HandlerType::ReadStoriesOnServer:
events.to_story_manager.push_back(event.clone());
break;
case LogEvent::HandlerType::UpdateScopeNotificationSettingsOnServer:

View File

@ -108,6 +108,7 @@ class LogEvent {
EditMessagePushNotification = 0x201,
SaveAppLog = 0x300,
DeleteStoryOnServer = 0x400,
ReadStoriesOnServer = 0x401,
ConfigPmcMagic = 0x1f18,
BinlogPmcMagic = 0x4327
};