From 9d0ca2670e4b71ddc8ccc69a673e2390c280425d Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 12 Feb 2024 16:12:29 +0300 Subject: [PATCH] Add story.sender_id. --- td/generate/scheme/td_api.tl | 3 ++- td/telegram/StoryManager.cpp | 33 +++++++++++++++++++++++++++++---- td/telegram/StoryManager.h | 1 + 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index c75184f68..bfd1bd855 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -3634,6 +3634,7 @@ storyInteractionInfo view_count:int32 forward_count:int32 reaction_count:int32 r //@description Represents a story //@id Unique story identifier among stories of the given sender //@sender_chat_id Identifier of the chat that posted the story +//@sender_id Identifier of the sender of the story; may be null if the story is posted on behalf of the sender_chat_id //@date Point in time (Unix timestamp) when the story was published //@is_being_sent True, if the story is being sent by the current user //@is_being_edited True, if the story is being edited by the current user @@ -3655,7 +3656,7 @@ storyInteractionInfo view_count:int32 forward_count:int32 reaction_count:int32 r //@content Content of the story //@areas Clickable areas to be shown on the story content //@caption Caption of the story -story id:int32 sender_chat_id:int53 date:int32 is_being_sent:Bool is_being_edited:Bool is_edited:Bool is_pinned:Bool is_visible_only_for_self:Bool can_be_deleted:Bool can_be_edited:Bool can_be_forwarded:Bool can_be_replied:Bool can_toggle_is_pinned:Bool can_get_statistics:Bool can_get_interactions:Bool has_expired_viewers:Bool repost_info:storyRepostInfo interaction_info:storyInteractionInfo chosen_reaction_type:ReactionType privacy_settings:StoryPrivacySettings content:StoryContent areas:vector caption:formattedText = Story; +story id:int32 sender_chat_id:int53 sender_id:MessageSender date:int32 is_being_sent:Bool is_being_edited:Bool is_edited:Bool is_pinned:Bool is_visible_only_for_self:Bool can_be_deleted:Bool can_be_edited:Bool can_be_forwarded:Bool can_be_replied:Bool can_toggle_is_pinned:Bool can_get_statistics:Bool can_get_interactions:Bool has_expired_viewers:Bool repost_info:storyRepostInfo interaction_info:storyInteractionInfo chosen_reaction_type:ReactionType privacy_settings:StoryPrivacySettings content:StoryContent areas:vector caption:formattedText = Story; //@description Represents a list of stories @total_count Approximate total number of stories found @stories The list of stories stories total_count:int32 stories:vector = Stories; diff --git a/td/telegram/StoryManager.cpp b/td/telegram/StoryManager.cpp index af36b7296..dbf6213f7 100644 --- a/td/telegram/StoryManager.cpp +++ b/td/telegram/StoryManager.cpp @@ -19,6 +19,7 @@ #include "td/telegram/logevent/LogEventHelper.h" #include "td/telegram/MediaArea.hpp" #include "td/telegram/MessageEntity.h" +#include "td/telegram/MessageSender.h" #include "td/telegram/MessagesManager.h" #include "td/telegram/NotificationId.h" #include "td/telegram/NotificationManager.h" @@ -1125,6 +1126,7 @@ void StoryManager::Story::store(StorerT &storer) const { bool has_areas = !areas_.empty(); bool has_chosen_reaction_type = !chosen_reaction_type_.is_empty(); bool has_forward_info = forward_info_ != nullptr; + bool has_sender_dialog_id = sender_dialog_id_ != DialogId(); BEGIN_STORE_FLAGS(); STORE_FLAG(is_edited_); STORE_FLAG(is_pinned_); @@ -1142,6 +1144,7 @@ void StoryManager::Story::store(StorerT &storer) const { STORE_FLAG(has_chosen_reaction_type); STORE_FLAG(is_outgoing_); STORE_FLAG(has_forward_info); + STORE_FLAG(has_sender_dialog_id); END_STORE_FLAGS(); store(date_, storer); store(expire_date_, storer); @@ -1169,6 +1172,9 @@ void StoryManager::Story::store(StorerT &storer) const { if (has_forward_info) { store(forward_info_, storer); } + if (has_sender_dialog_id) { + store(sender_dialog_id_, storer); + } } template @@ -1182,6 +1188,7 @@ void StoryManager::Story::parse(ParserT &parser) { bool has_areas; bool has_chosen_reaction_type; bool has_forward_info; + bool has_sender_dialog_id; BEGIN_PARSE_FLAGS(); PARSE_FLAG(is_edited_); PARSE_FLAG(is_pinned_); @@ -1199,6 +1206,7 @@ void StoryManager::Story::parse(ParserT &parser) { PARSE_FLAG(has_chosen_reaction_type); PARSE_FLAG(is_outgoing_); PARSE_FLAG(has_forward_info); + PARSE_FLAG(has_sender_dialog_id); END_PARSE_FLAGS(); parse(date_, parser); parse(expire_date_, parser); @@ -1226,6 +1234,9 @@ void StoryManager::Story::parse(ParserT &parser) { if (has_forward_info) { parse(forward_info_, parser); } + if (has_sender_dialog_id) { + parse(sender_dialog_id_, parser); + } } template @@ -1895,6 +1906,7 @@ void StoryManager::add_story_dependencies(Dependencies &dependencies, const Stor story->forward_info_->add_dependencies(dependencies); } story->interaction_info_.add_dependencies(dependencies); + dependencies.add_message_sender_dependencies(story->sender_dialog_id_); story->privacy_rules_.add_dependencies(dependencies); if (story->content_ != nullptr) { add_story_content_dependencies(dependencies, story->content_.get()); @@ -3208,10 +3220,13 @@ td_api::object_ptr StoryManager::get_story_object(StoryFullId sto story->is_update_sent_ = true; return td_api::make_object( - story_id.get(), td_->dialog_manager_->get_chat_id_object(owner_dialog_id, "get_story_object"), story->date_, - is_being_sent, is_being_edited, is_edited, story->is_pinned_, is_visible_only_for_self, can_be_deleted, - can_be_edited, can_be_forwarded, can_be_replied, can_toggle_is_pinned, can_get_statistics, can_get_interactions, - has_expired_viewers, std::move(repost_info), std::move(interaction_info), + story_id.get(), td_->dialog_manager_->get_chat_id_object(owner_dialog_id, "get_story_object"), + story->sender_dialog_id_ == DialogId() + ? nullptr + : get_message_sender_object(td_, story->sender_dialog_id_, "get_story_object 2"), + story->date_, is_being_sent, is_being_edited, is_edited, story->is_pinned_, is_visible_only_for_self, + can_be_deleted, can_be_edited, can_be_forwarded, can_be_replied, can_toggle_is_pinned, can_get_statistics, + can_get_interactions, has_expired_viewers, std::move(repost_info), std::move(interaction_info), story->chosen_reaction_type_.get_reaction_type_object(), std::move(privacy_settings), get_story_content_object(td_, content), std::move(story_areas), get_formatted_text_object(*caption, true, get_story_content_duration(td_, content))); @@ -3443,6 +3458,11 @@ StoryId StoryManager::on_get_new_story(DialogId owner_dialog_id, story->forward_info_ = std::move(forward_info); is_changed = true; } + auto sender_dialog_id = story_item->from_id_ != nullptr ? DialogId(story_item->from_id_) : DialogId(); + if (sender_dialog_id != story->sender_dialog_id_) { + story->sender_dialog_id_ = sender_dialog_id; + is_changed = true; + } if (!story_item->min_) { auto privacy_rules = UserPrivacySettingRules::get_user_privacy_setting_rules(td_, std::move(story_item->privacy_)); auto interaction_info = StoryInteractionInfo(td_, std::move(story_item->views_)); @@ -4728,6 +4748,10 @@ void StoryManager::send_story(DialogId dialog_id, td_api::object_ptrdialog_manager_->force_create_dialog(dialog_id, "send_story"); auto story = make_unique(); + if (dialog_id.get_type() == DialogType::Channel && + td_->contacts_manager_->is_megagroup_channel(dialog_id.get_channel_id())) { + story->sender_dialog_id_ = td_->messages_manager_->get_dialog_default_send_message_as_dialog_id(dialog_id); + } story->date_ = G()->unix_time(); story->expire_date_ = story->date_ + active_period; story->is_pinned_ = is_pinned; @@ -4797,6 +4821,7 @@ void StoryManager::do_send_story(unique_ptr &&pending_story, vecto if (bad_parts.empty()) { if (!pending_story->story_id_.is_server()) { auto story = make_unique(); + story->sender_dialog_id_ = pending_story->story_->sender_dialog_id_; story->date_ = pending_story->story_->date_; story->expire_date_ = pending_story->story_->expire_date_; story->is_pinned_ = pending_story->story_->is_pinned_; diff --git a/td/telegram/StoryManager.h b/td/telegram/StoryManager.h index da639522e..f630a5198 100644 --- a/td/telegram/StoryManager.h +++ b/td/telegram/StoryManager.h @@ -55,6 +55,7 @@ class Td; class StoryManager final : public Actor { struct Story { + DialogId sender_dialog_id_; int32 date_ = 0; int32 expire_date_ = 0; int32 receive_date_ = 0;