diff --git a/td/telegram/ContactsManager.cpp b/td/telegram/ContactsManager.cpp index 4e3e48d47..b390d2b59 100644 --- a/td/telegram/ContactsManager.cpp +++ b/td/telegram/ContactsManager.cpp @@ -4043,6 +4043,9 @@ ContactsManager::ContactsManager(Td *td, ActorShared<> parent) : td_(td), parent user_emoji_status_timeout_.set_callback(on_user_emoji_status_timeout_callback); user_emoji_status_timeout_.set_callback_data(static_cast(this)); + channel_emoji_status_timeout_.set_callback(on_channel_emoji_status_timeout_callback); + channel_emoji_status_timeout_.set_callback_data(static_cast(this)); + channel_unban_timeout_.set_callback(on_channel_unban_timeout_callback); channel_unban_timeout_.set_callback_data(static_cast(this)); @@ -4176,6 +4179,28 @@ void ContactsManager::on_user_emoji_status_timeout(UserId user_id) { update_user(u, user_id); } +void ContactsManager::on_channel_emoji_status_timeout_callback(void *contacts_manager_ptr, int64 channel_id_long) { + if (G()->close_flag()) { + return; + } + + auto contacts_manager = static_cast(contacts_manager_ptr); + send_closure_later(contacts_manager->actor_id(contacts_manager), &ContactsManager::on_channel_emoji_status_timeout, + ChannelId(channel_id_long)); +} + +void ContactsManager::on_channel_emoji_status_timeout(ChannelId channel_id) { + if (G()->close_flag()) { + return; + } + + auto c = get_channel(channel_id); + CHECK(c != nullptr); + CHECK(c->is_update_supergroup_sent); + + update_channel(c, channel_id); +} + void ContactsManager::on_channel_unban_timeout_callback(void *contacts_manager_ptr, int64 channel_id_long) { if (G()->close_flag()) { return; @@ -5006,6 +5031,7 @@ void ContactsManager::Channel::store(StorerT &storer) const { bool has_profile_accent_color_id = profile_accent_color_id.is_valid(); bool has_profile_background_custom_emoji_id = profile_background_custom_emoji_id.is_valid(); bool has_boost_level = boost_level != 0; + bool has_emoji_status = !emoji_status.is_empty(); BEGIN_STORE_FLAGS(); STORE_FLAG(false); STORE_FLAG(false); @@ -5050,6 +5076,7 @@ void ContactsManager::Channel::store(StorerT &storer) const { STORE_FLAG(has_profile_accent_color_id); STORE_FLAG(has_profile_background_custom_emoji_id); STORE_FLAG(has_boost_level); + STORE_FLAG(has_emoji_status); END_STORE_FLAGS(); } @@ -5099,6 +5126,9 @@ void ContactsManager::Channel::store(StorerT &storer) const { if (has_boost_level) { store(boost_level, storer); } + if (has_emoji_status) { + store(emoji_status, storer); + } } template @@ -5129,6 +5159,7 @@ void ContactsManager::Channel::parse(ParserT &parser) { bool has_profile_accent_color_id = false; bool has_profile_background_custom_emoji_id = false; bool has_boost_level = false; + bool has_emoji_status = false; BEGIN_PARSE_FLAGS(); PARSE_FLAG(left); PARSE_FLAG(kicked); @@ -5173,6 +5204,7 @@ void ContactsManager::Channel::parse(ParserT &parser) { PARSE_FLAG(has_profile_accent_color_id); PARSE_FLAG(has_profile_background_custom_emoji_id); PARSE_FLAG(has_boost_level); + PARSE_FLAG(has_emoji_status); END_PARSE_FLAGS(); } @@ -5252,6 +5284,9 @@ void ContactsManager::Channel::parse(ParserT &parser) { if (has_boost_level) { parse(boost_level, parser); } + if (has_emoji_status) { + parse(emoji_status, parser); + } if (!check_utf8(title)) { LOG(ERROR) << "Have invalid title \"" << title << '"'; @@ -6152,7 +6187,11 @@ td_api::object_ptr ContactsManager::get_chat_emoji_status_o } td_api::object_ptr ContactsManager::get_channel_emoji_status_object(ChannelId channel_id) const { - return nullptr; + auto c = get_channel(channel_id); + if (c == nullptr) { + return nullptr; + } + return c->last_sent_emoji_status.get_emoji_status_object(); } td_api::object_ptr ContactsManager::get_secret_chat_emoji_status_object( @@ -12865,6 +12904,24 @@ void ContactsManager::update_channel(Channel *c, ChannelId channel_id, bool from DialogId(channel_id), "stories_hidden"); c->is_stories_hidden_changed = false; } + auto unix_time = G()->unix_time(); + auto effective_emoji_status = c->emoji_status.get_effective_emoji_status(true, unix_time); + if (effective_emoji_status != c->last_sent_emoji_status) { + if (!c->last_sent_emoji_status.is_empty()) { + channel_emoji_status_timeout_.cancel_timeout(channel_id.get()); + } + c->last_sent_emoji_status = effective_emoji_status; + if (!c->last_sent_emoji_status.is_empty()) { + auto until_date = c->last_sent_emoji_status.get_until_date(); + auto left_time = until_date - unix_time; + if (left_time >= 0 && left_time < 30 * 86400) { + channel_emoji_status_timeout_.set_timeout_in(channel_id.get(), left_time); + } + } + + td_->messages_manager_->on_dialog_emoji_status_updated(DialogId(channel_id)); + } + c->is_emoji_status_changed = false; if (!td_->auth_manager_->is_bot()) { if (c->restriction_reasons.empty()) { @@ -14220,7 +14277,7 @@ void ContactsManager::on_update_user_emoji_status(UserId user_id, void ContactsManager::on_update_user_emoji_status(User *u, UserId user_id, EmojiStatus emoji_status) { if (u->emoji_status != emoji_status) { LOG(DEBUG) << "Change emoji status of " << user_id << " from " << u->emoji_status << " to " << emoji_status; - u->emoji_status = emoji_status; + u->emoji_status = std::move(emoji_status); u->is_emoji_status_changed = true; // effective emoji status might not be changed; checked in update_user // u->is_changed = true; @@ -16893,6 +16950,15 @@ void ContactsManager::on_update_channel_photo(Channel *c, ChannelId channel_id, } } +void ContactsManager::on_update_channel_emoji_status(Channel *c, ChannelId channel_id, EmojiStatus emoji_status) { + if (c->emoji_status != emoji_status) { + LOG(DEBUG) << "Change emoji status of " << channel_id << " from " << c->emoji_status << " to " << emoji_status; + c->emoji_status = std::move(emoji_status); + c->is_emoji_status_changed = true; + c->need_save_to_database = true; + } +} + void ContactsManager::on_update_channel_accent_color_id(Channel *c, ChannelId channel_id, AccentColorId accent_color_id) { if (accent_color_id == AccentColorId(channel_id) || !accent_color_id.is_valid()) { diff --git a/td/telegram/ContactsManager.h b/td/telegram/ContactsManager.h index 0013c313d..f339eca1a 100644 --- a/td/telegram/ContactsManager.h +++ b/td/telegram/ContactsManager.h @@ -1009,6 +1009,8 @@ class ContactsManager final : public Actor { int64 access_hash = 0; string title; DialogPhoto photo; + EmojiStatus emoji_status; + EmojiStatus last_sent_emoji_status; AccentColorId accent_color_id; CustomEmojiId background_custom_emoji_id; AccentColorId profile_accent_color_id; @@ -1051,6 +1053,7 @@ class ContactsManager final : public Actor { bool is_title_changed = true; bool is_username_changed = true; bool is_photo_changed = true; + bool is_emoji_status_changed = true; bool is_accent_color_changed = true; bool is_default_permissions_changed = true; bool is_status_changed = true; @@ -1560,6 +1563,7 @@ class ContactsManager final : public Actor { void on_update_channel_photo(Channel *c, ChannelId channel_id, tl_object_ptr &&chat_photo_ptr); void on_update_channel_photo(Channel *c, ChannelId channel_id, DialogPhoto &&photo, bool invalidate_photo_cache); + void on_update_channel_emoji_status(Channel *c, ChannelId channel_id, EmojiStatus emoji_status); void on_update_channel_accent_color_id(Channel *c, ChannelId channel_id, AccentColorId accent_color_id); void on_update_channel_background_custom_emoji_id(Channel *c, ChannelId channel_id, CustomEmojiId background_custom_emoji_id); @@ -1992,6 +1996,8 @@ class ContactsManager final : public Actor { static void on_user_emoji_status_timeout_callback(void *contacts_manager_ptr, int64 user_id_long); + static void on_channel_emoji_status_timeout_callback(void *contacts_manager_ptr, int64 channel_id_long); + static void on_channel_unban_timeout_callback(void *contacts_manager_ptr, int64 channel_id_long); static void on_user_nearby_timeout_callback(void *contacts_manager_ptr, int64 user_id_long); @@ -2006,6 +2012,8 @@ class ContactsManager final : public Actor { void on_user_emoji_status_timeout(UserId user_id); + void on_channel_emoji_status_timeout(ChannelId channel_id); + void on_channel_unban_timeout(ChannelId channel_id); void on_user_nearby_timeout(UserId user_id); @@ -2200,6 +2208,7 @@ class ContactsManager final : public Actor { MultiTimeout user_online_timeout_{"UserOnlineTimeout"}; MultiTimeout user_emoji_status_timeout_{"UserEmojiStatusTimeout"}; + MultiTimeout channel_emoji_status_timeout_{"ChannelEmojiStatusTimeout"}; MultiTimeout channel_unban_timeout_{"ChannelUnbanTimeout"}; MultiTimeout user_nearby_timeout_{"UserNearbyTimeout"}; MultiTimeout slow_mode_delay_timeout_{"SlowModeDelayTimeout"};