From 0a32c484e1b8819983514f6f06da30c910cdd133 Mon Sep 17 00:00:00 2001 From: Fire Demon Date: Wed, 21 Oct 2020 01:50:04 -0500 Subject: Make receiving boosts from Tavern timeline in home feed opt-in; always aggregate boosts --- app/lib/feed_manager.rb | 62 ++++++++++++++++++-------------------- app/lib/user_settings_decorator.rb | 11 ++----- 2 files changed, 33 insertions(+), 40 deletions(-) (limited to 'app/lib') diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index 8228dc943..f3b07c3e0 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -56,7 +56,7 @@ class FeedManager # @param [Status] status # @return [Boolean] def push_to_home(account, status) - return false unless add_to_feed(:home, account.id, status, account.user&.aggregates_reblogs?, account.user&.disables_home_reblogs?) + return false unless add_to_feed(:home, account.id, status, account.user&.home_reblogs?) trim(:home, account.id) PushUpdateWorker.perform_async(account.id, status.id, "timeline:#{account.id}") if push_update_required?("timeline:#{account.id}") @@ -68,7 +68,7 @@ class FeedManager # @param [Status] status # @return [Boolean] def unpush_from_home(account, status, include_reblogs_list = true) - return false unless remove_from_feed(:home, account.id, status, account.user&.aggregates_reblogs?, include_reblogs_list) + return false unless remove_from_feed(:home, account.id, status, include_reblogs_list) redis.publish("timeline:#{account.id}", Oj.dump(event: :delete, payload: status.id.to_s)) true @@ -80,7 +80,7 @@ class FeedManager # @return [Boolean] def push_to_list(list, status) return false if filter_from_list?(status, list) - return false unless add_to_feed(:list, list.id, status, list.account.user&.aggregates_reblogs?, !list.reblogs?) + return false unless add_to_feed(:list, list.id, status, list.reblogs?) trim(:list, list.id) PushUpdateWorker.perform_async(list.account_id, status.id, "timeline:list:#{list.id}") if push_update_required?("timeline:list:#{list.id}") @@ -92,7 +92,7 @@ class FeedManager # @param [Status] status # @return [Boolean] def unpush_from_list(list, status) - return false unless remove_from_feed(:list, list.id, status, list.account.user&.aggregates_reblogs?) + return false unless remove_from_feed(:list, list.id, status) redis.publish("timeline:list:#{list.id}", Oj.dump(event: :delete, payload: status.id.to_s)) true @@ -146,8 +146,7 @@ class FeedManager # @return [void] def merge_into_home(from_account, into_account) timeline_key = key(:home, into_account.id) - aggregate = into_account.user&.aggregates_reblogs? - no_reblogs = into_account.user&.disables_home_reblogs? + reblogs = into_account.user&.home_reblogs? no_unknown = into_account.user&.filters_unknown? query = from_account.statuses.where(visibility: [:public, :unlisted, :private]).includes(:preloadable_poll, reblog: :account).limit(FeedManager::MAX_ITEMS / 4) @@ -162,7 +161,7 @@ class FeedManager statuses.each do |status| next if filter_from_home?(status, into_account.id, crutches, no_unknown) - add_to_feed(:home, into_account.id, status, aggregate, no_reblogs) + add_to_feed(:home, into_account.id, status, reblogs) end trim(:home, into_account.id) @@ -174,8 +173,7 @@ class FeedManager # @return [void] def merge_into_list(from_account, list) timeline_key = key(:list, list.id) - aggregate = list.account.user&.aggregates_reblogs? - no_reblogs = list.account.user&.disables_home_reblogs? + reblogs = list.account.user&.home_reblogs? no_unknown = list.account.user&.filters_unknown? query = from_account.statuses.where(visibility: [:public, :unlisted, :private]).includes(:preloadable_poll, reblog: :account).limit(FeedManager::MAX_ITEMS / 4) @@ -190,7 +188,7 @@ class FeedManager statuses.each do |status| next if filter_from_home?(status, list.account_id, crutches, no_unknown) || filter_from_list?(status, list) - add_to_feed(:list, list.id, status, aggregate, no_reblogs) + add_to_feed(:list, list.id, status, reblogs) end trim(:list, list.id) @@ -205,7 +203,7 @@ class FeedManager oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true)&.first&.last&.to_i || 0 from_account.statuses.select('id, reblog_of_id').where('id > ?', oldest_home_score).reorder(nil).find_each do |status| - remove_from_feed(:home, into_account.id, status, into_account.user&.aggregates_reblogs?) + remove_from_feed(:home, into_account.id, status) end end @@ -218,7 +216,7 @@ class FeedManager oldest_list_score = redis.zrange(timeline_key, 0, 0, with_scores: true)&.first&.last&.to_i || 0 from_account.statuses.select('id, reblog_of_id').where('id > ?', oldest_list_score).reorder(nil).find_each do |status| - remove_from_feed(:list, list.id, status, list.account.user&.aggregates_reblogs?, !list.reblogs?) + remove_from_feed(:list, list.id, status, !list.reblogs?) end end @@ -249,7 +247,7 @@ class FeedManager timeline_key = key(:home, account.id) timeline_status_ids = redis.zrange(timeline_key, 0, -1) - Status.reblogs.where(id: timeline_status_ids).find_each do |status| + Status.reblogs.joins(:reblog).where(reblogs_statuses: { local: false }).where(id: timeline_status_ids).find_each do |status| unpush_from_home(account, status, false) end end @@ -280,7 +278,7 @@ class FeedManager statuses.each do |status| next if filter_from_list?(status, account.id) || filter_from_home?(status, account.id, crutches, account.user&.filters_unknown?) - add_to_feed(:list, list.id, status, list.account.user&.aggregates_reblogs?, !list.reblogs?) + add_to_feed(:list, list.id, status, list.reblogs?) end trim(:list, list.id) @@ -293,13 +291,12 @@ class FeedManager # @return [void] def populate_home(account) limit = FeedManager::MAX_ITEMS / 2 - aggregate = account.user&.aggregates_reblogs? - no_reblogs = account.user&.disables_home_reblogs? + reblogs = account.user&.home_reblogs? no_unknown = account.user&.filters_unknown? timeline_key = key(:home, account.id) account.statuses.limit(limit).each do |status| - add_to_feed(:home, account.id, status, aggregate, no_reblogs) + add_to_feed(:home, account.id, status, reblogs) end account.following.includes(:account_stat).find_each do |target_account| @@ -319,7 +316,7 @@ class FeedManager statuses.each do |status| next if filter_from_home?(status, account.id, crutches, no_unknown) - add_to_feed(:home, account.id, status, aggregate, no_reblogs, false) + add_to_feed(:home, account.id, status, reblogs, false) end trim(:home, account.id) @@ -556,18 +553,19 @@ class FeedManager # @param [Symbol] timeline_type # @param [Integer] account_id # @param [Status] status - # @param [Boolean] aggregate_reblogs + # @param [Boolean] home_reblogs + # @param [Boolean] stream # @return [Boolean] - def add_to_feed(timeline_type, account_id, status, aggregate_reblogs = true, skip_reblogs = false, stream = true) + def add_to_feed(timeline_type, account_id, status, home_reblogs = true, stream = true) timeline_key = key(timeline_type, account_id) reblog_key = key(timeline_type, account_id, 'reblogs') if status.reblog? - add_to_reblogs(account_id, status, aggregate_reblogs, stream) if timeline_type == :home - return false if skip_reblogs || (timeline_type == :home && !status.reblog.local?) + add_to_reblogs(account_id, status, stream) if timeline_type == :home + return false unless home_reblogs || (timeline_type == :home && status.reblog.local?) end - if status.reblog? && (aggregate_reblogs.nil? || aggregate_reblogs) + if status.reblog? # If the original status or a reblog of it is within # REBLOG_FALLOFF statuses from the top, do not re-insert it into # the feed @@ -599,7 +597,7 @@ class FeedManager redis.zadd(timeline_key, status.id, status.id) end - add_to_reblogs(account_id, status, aggregate_reblogs, stream) if timeline_type == :home && status.reblog? + add_to_reblogs(account_id, status, stream) if timeline_type == :home && status.reblog? true end @@ -611,15 +609,15 @@ class FeedManager # @param [Symbol] timeline_type # @param [Integer] account_id # @param [Status] status - # @param [Boolean] aggregate_reblogs + # @param [Boolean] include_reblogs_list # @return [Boolean] - def remove_from_feed(timeline_type, account_id, status, aggregate_reblogs = true, include_reblogs_list = true) + def remove_from_feed(timeline_type, account_id, status, include_reblogs_list = true) timeline_key = key(timeline_type, account_id) reblog_key = key(timeline_type, account_id, 'reblogs') - remove_from_reblogs(account_id, status, aggregate_reblogs) if include_reblogs_list && timeline_type == :home && status.reblog? + remove_from_reblogs(account_id, status) if include_reblogs_list && timeline_type == :home && status.reblog? - if status.reblog? && (aggregate_reblogs.nil? || aggregate_reblogs) + if status.reblog? # 1. If the reblogging status is not in the feed, stop. status_rank = redis.zrevrank(timeline_key, status.id) return false if status_rank.nil? @@ -680,9 +678,9 @@ class FeedManager end end - def add_to_reblogs(account_id, status, aggregate_reblogs = true, stream = true) + def add_to_reblogs(account_id, status, stream = true) reblogs_list_id = find_or_create_reblogs_list(account_id).id - return unless add_to_feed(:list, reblogs_list_id, status, aggregate_reblogs) + return unless add_to_feed(:list, reblogs_list_id, status) trim(:list, reblogs_list_id) return unless stream && push_update_required?("timeline:list:#{reblogs_list_id}") @@ -690,9 +688,9 @@ class FeedManager PushUpdateWorker.perform_async(account_id, status.id, "timeline:list:#{reblogs_list_id}") end - def remove_from_reblogs(account_id, status, aggregate_reblogs) + def remove_from_reblogs(account_id, status) reblogs_list_id = find_or_create_reblogs_list(account_id).id - return unless remove_from_feed(:list, reblogs_list_id, status, aggregate_reblogs) + return unless remove_from_feed(:list, reblogs_list_id, status) redis.publish("timeline:list:#{reblogs_list_id}", Oj.dump(event: :delete, payload: status.id.to_s)) end diff --git a/app/lib/user_settings_decorator.rb b/app/lib/user_settings_decorator.rb index ddce9764a..8d1af705a 100644 --- a/app/lib/user_settings_decorator.rb +++ b/app/lib/user_settings_decorator.rb @@ -39,7 +39,6 @@ class UserSettingsDecorator user.settings['flavour'] = flavour_preference if change?('setting_flavour') user.settings['skin'] = skin_preference if change?('setting_skin') user.settings['hide_network'] = hide_network_preference if change?('setting_hide_network') - user.settings['aggregate_reblogs'] = aggregate_reblogs_preference if change?('setting_aggregate_reblogs') user.settings['show_application'] = show_application_preference if change?('setting_show_application') user.settings['advanced_layout'] = advanced_layout_preference if change?('setting_advanced_layout') user.settings['default_content_type'] = default_content_type_preference if change?('setting_default_content_type') @@ -63,7 +62,7 @@ class UserSettingsDecorator user.settings['filter_unknown'] = filter_unknown_preference if change?('setting_filter_unknown') user.settings['unpublish_on_delete'] = unpublish_on_delete_preference if change?('setting_unpublish_on_delete') user.settings['rss_disabled'] = rss_disabled_preference if change?('setting_rss_disabled') - user.settings['no_boosts_home'] = no_boosts_home_preference if change?('setting_no_boosts_home') + user.settings['home_reblogs'] = home_reblogs_preference if change?('setting_home_reblogs') user.settings['max_history_public'] = max_history_public_preference if change?('setting_max_history_public') user.settings['max_history_private'] = max_history_private_preference if change?('setting_max_history_private') end @@ -152,10 +151,6 @@ class UserSettingsDecorator settings['setting_default_language'] end - def aggregate_reblogs_preference - boolean_cast_setting 'setting_aggregate_reblogs' - end - def advanced_layout_preference boolean_cast_setting 'setting_advanced_layout' end @@ -244,8 +239,8 @@ class UserSettingsDecorator boolean_cast_setting 'setting_rss_disabled' end - def no_boosts_home_preference - boolean_cast_setting 'setting_no_boosts_home' + def home_reblogs_preference + boolean_cast_setting 'setting_home_reblogs' end def max_history_public_preference -- cgit