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/controllers/settings/preferences_controller.rb | 7 +-- app/javascript/mastodon/locales/en-MP.json | 2 +- app/lib/feed_manager.rb | 62 +++++++++++----------- app/lib/user_settings_decorator.rb | 11 ++-- app/models/user.rb | 12 ++--- .../settings/preferences/appearance/show.html.haml | 3 -- .../settings/preferences/filters/show.html.haml | 2 +- config/locales/simple_form.en-MP.yml | 4 +- 8 files changed, 45 insertions(+), 58 deletions(-) diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb index 12c03ce76..0a7c53f83 100644 --- a/app/controllers/settings/preferences_controller.rb +++ b/app/controllers/settings/preferences_controller.rb @@ -4,8 +4,10 @@ class Settings::PreferencesController < Settings::BaseController def show; end def update + old_home_reblogs = current_user.home_reblogs? + if user_settings.update(user_settings_params.to_h) - ClearReblogsWorker.perform_async(current_user.account_id) if current_user.disables_home_reblogs? + ClearReblogsWorker.perform_async(current_user.account_id) unless old_home_reblogs == current_user.home_reblogs? || current_user.home_reblogs? end if current_user.update(user_params) @@ -51,7 +53,6 @@ class Settings::PreferencesController < Settings::BaseController :setting_noindex, :setting_hide_network, :setting_hide_followers_count, - :setting_aggregate_reblogs, :setting_show_application, :setting_advanced_layout, :setting_default_content_type, @@ -74,7 +75,7 @@ class Settings::PreferencesController < Settings::BaseController :setting_filter_unknown, :setting_unpublish_on_delete, :setting_rss_disabled, - :setting_no_boosts_home, + :setting_home_reblogs, :setting_max_history_public, :setting_max_history_private, notification_emails: %i(follow follow_request reblog favourite mention digest report pending_account trending_tag), diff --git a/app/javascript/mastodon/locales/en-MP.json b/app/javascript/mastodon/locales/en-MP.json index ca175119e..88a0087b6 100644 --- a/app/javascript/mastodon/locales/en-MP.json +++ b/app/javascript/mastodon/locales/en-MP.json @@ -24,7 +24,7 @@ "column.public": "Fediverse", "column.toot": "Roars & Growls", "community.column_settings.local_only": "Monsterpit only", - "community.column_settings.remote_only": "Rowdy tavern mode", + "community.column_settings.remote_only": "Rowdy Tavern mode", "compose_form.clear": "Double-click to clear", "compose_form.direct_message_warning": "This roar will only be sent to the mentioned creatures.", "compose_form.hashtag_warning": "This roar won't be listed under any hashtag as it is unlisted. Only public roars can be searched by hashtag.", 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 diff --git a/app/models/user.rb b/app/models/user.rb index c494aa7a5..afe248f57 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -116,14 +116,14 @@ class User < ApplicationRecord delegate :auto_play_gif, :default_sensitive, :unfollow_modal, :boost_modal, :favourite_modal, :delete_modal, :reduce_motion, :system_font_ui, :noindex, :flavour, :skin, :display_media, :hide_network, :hide_followers_count, - :expand_spoilers, :default_language, :aggregate_reblogs, :show_application, + :expand_spoilers, :default_language, :show_application, :advanced_layout, :use_blurhash, :use_pending_items, :trends, :crop_images, :default_content_type, :system_emoji_font, :manual_publish, :style_dashed_nest, :style_underline_a, :style_css_profile, :style_css_profile_errors, :style_css_webapp, :style_css_webapp_errors, :style_wide_media, :publish_in, :unpublish_in, :unpublish_delete, :boost_every, :boost_jitter, - :boost_random, :unpublish_on_delete, :rss_disabled, :no_boosts_home, + :boost_random, :unpublish_on_delete, :rss_disabled, :home_reblogs, :filter_unknown, :max_history_public, :max_history_private, to: :settings, prefix: :setting, allow_nil: false @@ -255,16 +255,12 @@ class User < ApplicationRecord @hides_network ||= settings.hide_network end - def aggregates_reblogs? - @aggregates_reblogs ||= settings.aggregate_reblogs - end - def shows_application? @shows_application ||= settings.show_application end - def disables_home_reblogs? - @disables_home_reblogs ||= settings.no_boosts_home + def home_reblogs? + @home_reblogs ||= settings.home_reblogs end def filters_unknown? diff --git a/app/views/settings/preferences/appearance/show.html.haml b/app/views/settings/preferences/appearance/show.html.haml index 87e7b91c5..48031a973 100644 --- a/app/views/settings/preferences/appearance/show.html.haml +++ b/app/views/settings/preferences/appearance/show.html.haml @@ -16,9 +16,6 @@ %p.hint= t 'appearance.advanced_web_interface_hint' - .fields-group - = f.input :setting_aggregate_reblogs, as: :boolean, wrapper: :with_label, recommended: true - .fields-group = f.input :setting_advanced_layout, as: :boolean, wrapper: :with_label, hint: false diff --git a/app/views/settings/preferences/filters/show.html.haml b/app/views/settings/preferences/filters/show.html.haml index c30167cb5..17fa4c4a6 100644 --- a/app/views/settings/preferences/filters/show.html.haml +++ b/app/views/settings/preferences/filters/show.html.haml @@ -10,7 +10,7 @@ %h4= t 'preferences.filtering' .fields-group - = f.input :setting_no_boosts_home, as: :boolean, wrapper: :with_label + = f.input :setting_home_reblogs, as: :boolean, wrapper: :with_label .fields-group = f.input :setting_filter_unknown, as: :boolean, wrapper: :with_label diff --git a/config/locales/simple_form.en-MP.yml b/config/locales/simple_form.en-MP.yml index 6beb88d3f..33dfa4fda 100644 --- a/config/locales/simple_form.en-MP.yml +++ b/config/locales/simple_form.en-MP.yml @@ -27,7 +27,7 @@ en-MP: setting_default_content_type_bbcode_html: "[b]Bold[/b], [u]Underline[/u], [i]Italic[/i], [code]Console[/code], ..." setting_default_language: The language of your roars can be detected automatically, but it's not always accurate setting_filter_unknown: Strictly filter unfollowed authors, including those of boosts, from your home and list timelines. Takes effect for newly-pushed items. - setting_no_boosts_home: Filters boosts from the home timeline, reguardless of the app you use. These boosts will still be available in the Boosts list. + setting_home_reblogs: Allow packmates to boost unfollowed authors and Rowdy Tavern participants to your home timeline. Note that enabling this option has the potential to place offensive or triggering Fediverse content in your home timeline without warning! setting_manual_publish: This allows you to draft, proofread, and edit your roars before publishing them. You can publish a roar from its action menu (the three dots). setting_max_history_public: How long public users and other servers may directly access roars on your public profile or ActivityPub outbox. setting_max_history_private: How long followers may directly access roars from your public profile or ActivityPub outbox. Takes precedence if shorter than the public setting. @@ -61,7 +61,7 @@ en-MP: setting_manual_publish: Manually publish roars setting_max_history_public: Roar history visible to public setting_max_history_private: Roar history visible to followers - setting_no_boosts_home: Disable boosts in home timeline + setting_home_reblogs: Allow Rowdy Tavern content in home setting_publish_in: Auto-publish setting_show_application: Disclose application used to send roars setting_style_css_profile: Custom CSS for profile page -- cgit