From 7d237611d9131b8ac85cc499c26dc4f25ab69ea4 Mon Sep 17 00:00:00 2001 From: KMY Date: Wed, 10 May 2023 09:42:29 +0900 Subject: [PATCH] Add stl antenna mode --- .../antenna_adder/components/account.jsx | 2 +- app/models/antenna.rb | 16 ++++++++++++++++ app/services/fan_out_on_write_service.rb | 3 ++- app/views/antennas/_antenna.html.haml | 5 ++++- config/locales/en.yml | 1 + config/locales/ja.yml | 1 + db/migrate/20230510000439_add_stl_to_antennas.rb | 10 ++++++++++ db/schema.rb | 4 +++- 8 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 db/migrate/20230510000439_add_stl_to_antennas.rb diff --git a/app/javascript/mastodon/features/antenna_adder/components/account.jsx b/app/javascript/mastodon/features/antenna_adder/components/account.jsx index 410f1537a5..5dc384aba6 100644 --- a/app/javascript/mastodon/features/antenna_adder/components/account.jsx +++ b/app/javascript/mastodon/features/antenna_adder/components/account.jsx @@ -4,7 +4,7 @@ import { makeGetAccount } from '../../../selectors'; import ImmutablePureComponent from 'react-immutable-pure-component'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { Avatar } from '../../../components/avatar'; -import DisplayName from '../../../components/display_name'; +import { DisplayName } from '../../../components/display_name'; import { injectIntl } from 'react-intl'; const makeMapStateToProps = () => { diff --git a/app/models/antenna.rb b/app/models/antenna.rb index 141ea2e4cc..dfdbf9b70c 100644 --- a/app/models/antenna.rb +++ b/app/models/antenna.rb @@ -22,6 +22,7 @@ # exclude_domains :jsonb # exclude_accounts :jsonb # exclude_tags :jsonb +# stl :boolean default(FALSE), not null # class Antenna < ApplicationRecord include Expireable @@ -33,6 +34,7 @@ class Antenna < ApplicationRecord belongs_to :account belongs_to :list, optional: true + scope :stls, -> { where(stl: true) } scope :all_keywords, -> { where(any_keywords: true) } scope :all_domains, -> { where(any_domains: true) } scope :all_accounts, -> { where(any_accounts: true) } @@ -41,6 +43,8 @@ class Antenna < ApplicationRecord validate :list_owner + before_save :check_stl_mode + def list_owner raise Mastodon::ValidationError, I18n.t('antennas.errors.invalid_list_owner') if !list_id.zero? && list.present? && list.account != account end @@ -208,4 +212,16 @@ class Antenna < ApplicationRecord end self[:exclude_accounts] = accounts end + + private + + def check_stl_mode + self[:stl] = stl_mode? + end + + def stl_mode? + list_id.zero? && !any_domains && any_accounts && any_keywords && any_tags && + exclude_accounts.blank? && exclude_domains.blank? && exclude_keywords.blank? && exclude_tags.blank? && + antenna_domains.count == 1 && antenna_domains.first.name == Rails.configuration.x.local_domain + end end diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb index 42d5263bae..163ac51b7c 100644 --- a/app/services/fan_out_on_write_service.rb +++ b/app/services/fan_out_on_write_service.rb @@ -49,7 +49,7 @@ class FanOutOnWriteService < BaseService when :public, :unlisted, :public_unlisted, :private deliver_to_all_followers! deliver_to_lists! - deliver_to_antennas! if [:public, :public_unlisted].include?(@status.visibility.to_sym) && !@status.account.dissubscribable + deliver_to_antennas! if [:public, :public_unlisted].include?(@status.visibility.to_sym) when :limited deliver_to_mentioned_followers! else @@ -125,6 +125,7 @@ class FanOutOnWriteService < BaseService antennas = Antenna.availables antennas = antennas.left_joins(:antenna_domains).where(any_domains: true).or(Antenna.left_joins(:antenna_domains).where(antenna_domains: { name: domain })) antennas = antennas.where(with_media_only: false) unless @status.with_media? + antennas = antennas.where(stl: true) if @account.dissubscribable antennas = antennas.where.not(account: @account.blocking) antennas = Antenna.where(id: antennas.select(:id)) diff --git a/app/views/antennas/_antenna.html.haml b/app/views/antennas/_antenna.html.haml index eafa57e39e..c1b6460af4 100644 --- a/app/views/antennas/_antenna.html.haml +++ b/app/views/antennas/_antenna.html.haml @@ -65,7 +65,10 @@ .announcements-list__item__action-bar .announcements-list__item__meta - if antenna.enabled_config_raws? - = t('antennas.index.contexts', contexts: antenna.context.map { |context| I18n.t("antennas.contexts.#{context}") }.join(', ')) + - if antenna.stl + = t('antennas.index.stl') + - else + = t('antennas.index.contexts', contexts: antenna.context.map { |context| I18n.t("antennas.contexts.#{context}") }.join(', ')) - else = t('antennas.errors.empty_contexts') diff --git a/config/locales/en.yml b/config/locales/en.yml index 6231a54997..ad1731782d 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1031,6 +1031,7 @@ en: empty: You have no antennas. expires_in: Expires in %{distance} expires_on: Expires on %{date} + stl: This antenna is in STL mode, ignoring reject-subscription settings. title: Antennas new: save: Save new antenna diff --git a/config/locales/ja.yml b/config/locales/ja.yml index bcbef7a42d..472a89906c 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1028,6 +1028,7 @@ ja: expires_on: 有効期限 %{date} keywords: other: "%{count}件のキーワード" + stl: STLモードが適用されます。購読拒否設定は無視されます。 tags: other: "%{count}件のタグ" title: アンテナ diff --git a/db/migrate/20230510000439_add_stl_to_antennas.rb b/db/migrate/20230510000439_add_stl_to_antennas.rb new file mode 100644 index 0000000000..3d4ec6d3be --- /dev/null +++ b/db/migrate/20230510000439_add_stl_to_antennas.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +class AddStlToAntennas < ActiveRecord::Migration[6.1] + def change + safety_assured do + add_column :antennas, :stl, :boolean, null: false, default: false + add_index :antennas, :stl + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 8a0aa1b707..3b5b9900b4 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -12,7 +12,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2023_05_09_045358) do +ActiveRecord::Schema.define(version: 2023_05_10_000439) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -308,6 +308,7 @@ ActiveRecord::Schema.define(version: 2023_05_09_045358) do t.jsonb "exclude_domains" t.jsonb "exclude_accounts" t.jsonb "exclude_tags" + t.boolean "stl", default: false, null: false t.index ["account_id"], name: "index_antennas_on_account_id" t.index ["any_accounts"], name: "index_antennas_on_any_accounts" t.index ["any_domains"], name: "index_antennas_on_any_domains" @@ -315,6 +316,7 @@ ActiveRecord::Schema.define(version: 2023_05_09_045358) do t.index ["any_tags"], name: "index_antennas_on_any_tags" t.index ["available"], name: "index_antennas_on_available" t.index ["list_id"], name: "index_antennas_on_list_id" + t.index ["stl"], name: "index_antennas_on_stl" end create_table "appeals", force: :cascade do |t|