Update antenna stl mode
This commit is contained in:
parent
16f05fcaa1
commit
5fa4e98a65
7 changed files with 121 additions and 90 deletions
|
@ -59,7 +59,7 @@ class AntennasController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def resource_params
|
def resource_params
|
||||||
params.require(:antenna).permit(:title, :list, :available, :expires_in, :with_media_only, :ignore_reblog, :keywords_raw, :exclude_keywords_raw, :domains_raw, :exclude_domains_raw, :accounts_raw, :exclude_accounts_raw, :tags_raw, :exclude_tags_raw)
|
params.require(:antenna).permit(:title, :list, :available, :stl, :expires_in, :with_media_only, :ignore_reblog, :keywords_raw, :exclude_keywords_raw, :domains_raw, :exclude_domains_raw, :accounts_raw, :exclude_accounts_raw, :tags_raw, :exclude_tags_raw)
|
||||||
end
|
end
|
||||||
|
|
||||||
def thin_resource_params
|
def thin_resource_params
|
||||||
|
|
|
@ -41,11 +41,10 @@ class Antenna < ApplicationRecord
|
||||||
scope :all_accounts, -> { where(any_accounts: true) }
|
scope :all_accounts, -> { where(any_accounts: true) }
|
||||||
scope :all_tags, -> { where(any_tags: true) }
|
scope :all_tags, -> { where(any_tags: true) }
|
||||||
scope :availables, -> { where(available: true).where(Arel.sql('any_keywords = FALSE OR any_domains = FALSE OR any_accounts = FALSE OR any_tags = FALSE')) }
|
scope :availables, -> { where(available: true).where(Arel.sql('any_keywords = FALSE OR any_domains = FALSE OR any_accounts = FALSE OR any_tags = FALSE')) }
|
||||||
|
scope :available_stls, -> { where(available: true, stl: true) }
|
||||||
|
|
||||||
validate :list_owner
|
validate :list_owner
|
||||||
|
|
||||||
before_save :check_stl_mode
|
|
||||||
|
|
||||||
def list_owner
|
def list_owner
|
||||||
raise Mastodon::ValidationError, I18n.t('antennas.errors.invalid_list_owner') if !list_id.zero? && list.present? && list.account != account
|
raise Mastodon::ValidationError, I18n.t('antennas.errors.invalid_list_owner') if !list_id.zero? && list.present? && list.account != account
|
||||||
end
|
end
|
||||||
|
@ -213,16 +212,4 @@ class Antenna < ApplicationRecord
|
||||||
end
|
end
|
||||||
self[:exclude_accounts] = accounts
|
self[:exclude_accounts] = accounts
|
||||||
end
|
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
|
end
|
||||||
|
|
|
@ -49,7 +49,8 @@ class FanOutOnWriteService < BaseService
|
||||||
when :public, :unlisted, :public_unlisted, :private
|
when :public, :unlisted, :public_unlisted, :private
|
||||||
deliver_to_all_followers!
|
deliver_to_all_followers!
|
||||||
deliver_to_lists!
|
deliver_to_lists!
|
||||||
deliver_to_antennas! if [:public, :public_unlisted].include?(@status.visibility.to_sym)
|
deliver_to_antennas! if [:public, :public_unlisted].include?(@status.visibility.to_sym) && !@account.dissubscribable
|
||||||
|
deliver_to_stl_antennas!
|
||||||
when :limited
|
when :limited
|
||||||
deliver_to_mentioned_followers!
|
deliver_to_mentioned_followers!
|
||||||
else
|
else
|
||||||
|
@ -116,11 +117,27 @@ class FanOutOnWriteService < BaseService
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def deliver_to_antennas!
|
def deliver_to_stl_antennas!
|
||||||
return if @account.dissubscribable && @status.reblog?
|
return if @status.reblog?
|
||||||
|
|
||||||
lists = []
|
antennas = Antenna.available_stls
|
||||||
homes = []
|
antennas = antennas.where(account_id: Account.without_suspended.joins(:user).select('accounts.id').where('users.current_sign_in_at > ?', User::ACTIVE_DURATION.ago))
|
||||||
|
antennas = antennas.where(account: @account.followers) unless @account.domain.nil?
|
||||||
|
|
||||||
|
collection = AntennaCollection.new(@status, @options[:update])
|
||||||
|
|
||||||
|
antennas.in_batches do |ans|
|
||||||
|
ans.each do |antenna|
|
||||||
|
next if antenna.expired?
|
||||||
|
|
||||||
|
collection.push(antenna)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
collection.deliver!
|
||||||
|
end
|
||||||
|
|
||||||
|
def deliver_to_antennas!
|
||||||
tag_ids = @status.tags.pluck(:id)
|
tag_ids = @status.tags.pluck(:id)
|
||||||
domain = @account.domain || Rails.configuration.x.local_domain
|
domain = @account.domain || Rails.configuration.x.local_domain
|
||||||
|
|
||||||
|
@ -128,7 +145,7 @@ class FanOutOnWriteService < BaseService
|
||||||
antennas = antennas.left_joins(:antenna_domains).where(any_domains: true).or(Antenna.left_joins(:antenna_domains).where(antenna_domains: { name: domain }))
|
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(with_media_only: false) unless @status.with_media?
|
||||||
antennas = antennas.where(ignore_reblog: false) unless @status.reblog?
|
antennas = antennas.where(ignore_reblog: false) unless @status.reblog?
|
||||||
antennas = antennas.where(stl: true) if @account.dissubscribable
|
antennas = antennas.where(stl: false)
|
||||||
|
|
||||||
antennas = Antenna.where(id: antennas.select(:id))
|
antennas = Antenna.where(id: antennas.select(:id))
|
||||||
antennas = antennas.left_joins(:antenna_accounts).where(any_accounts: true).or(Antenna.left_joins(:antenna_accounts).where(antenna_accounts: { account: @account }))
|
antennas = antennas.left_joins(:antenna_accounts).where(any_accounts: true).or(Antenna.left_joins(:antenna_accounts).where(antenna_accounts: { account: @account }))
|
||||||
|
@ -139,6 +156,8 @@ class FanOutOnWriteService < BaseService
|
||||||
|
|
||||||
antennas = antennas.where(account_id: Account.without_suspended.joins(:user).select('accounts.id').where('users.current_sign_in_at > ?', User::ACTIVE_DURATION.ago))
|
antennas = antennas.where(account_id: Account.without_suspended.joins(:user).select('accounts.id').where('users.current_sign_in_at > ?', User::ACTIVE_DURATION.ago))
|
||||||
|
|
||||||
|
collection = AntennaCollection.new(@status, @options[:update])
|
||||||
|
|
||||||
antennas.in_batches do |ans|
|
antennas.in_batches do |ans|
|
||||||
ans.each do |antenna|
|
ans.each do |antenna|
|
||||||
next unless antenna.enabled?
|
next unless antenna.enabled?
|
||||||
|
@ -148,27 +167,11 @@ class FanOutOnWriteService < BaseService
|
||||||
next if antenna.exclude_domains&.include?(domain)
|
next if antenna.exclude_domains&.include?(domain)
|
||||||
next if antenna.exclude_tags&.any? { |tag_id| tag_ids.include?(tag_id) }
|
next if antenna.exclude_tags&.any? { |tag_id| tag_ids.include?(tag_id) }
|
||||||
|
|
||||||
if antenna.list_id.zero?
|
collection.push(antenna)
|
||||||
homes << antenna.account_id
|
|
||||||
else
|
|
||||||
lists << antenna.list_id
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
lists = lists.uniq
|
|
||||||
homes = homes.uniq
|
|
||||||
|
|
||||||
if lists.any?
|
|
||||||
FeedInsertWorker.push_bulk(lists) do |list|
|
|
||||||
[@status.id, list, 'list', { 'update' => update? }]
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if homes.any?
|
collection.deliver!
|
||||||
FeedInsertWorker.push_bulk(homes) do |home|
|
|
||||||
[@status.id, home, 'home', { 'update' => update? }]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def deliver_to_mentioned_followers!
|
def deliver_to_mentioned_followers!
|
||||||
|
@ -238,4 +241,38 @@ class FanOutOnWriteService < BaseService
|
||||||
def broadcastable_unlisted?
|
def broadcastable_unlisted?
|
||||||
@status.public_unlisted_visibility? && !@status.reblog? && !@account.silenced?
|
@status.public_unlisted_visibility? && !@status.reblog? && !@account.silenced?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class AntennaCollection
|
||||||
|
def initialize(status, update)
|
||||||
|
@status = status
|
||||||
|
@update = update
|
||||||
|
@home_account_ids = []
|
||||||
|
@list_ids = []
|
||||||
|
end
|
||||||
|
|
||||||
|
def push(antenna)
|
||||||
|
if antenna.list_id.zero?
|
||||||
|
@home_account_ids << antenna.account_id
|
||||||
|
else
|
||||||
|
@list_ids << antenna.list_id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def deliver!
|
||||||
|
lists = @list_ids.uniq
|
||||||
|
homes = @home_account_ids.uniq
|
||||||
|
|
||||||
|
if lists.any?
|
||||||
|
FeedInsertWorker.push_bulk(lists) do |list|
|
||||||
|
[@status.id, list, 'list', { 'update' => @update }]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if homes.any?
|
||||||
|
FeedInsertWorker.push_bulk(homes) do |home|
|
||||||
|
[@status.id, home, 'home', { 'update' => @update }]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
= link_to edit_antenna_path(antenna), class: 'filters-list__item__title' do
|
= link_to edit_antenna_path(antenna), class: 'filters-list__item__title' do
|
||||||
= antenna.title
|
= antenna.title
|
||||||
|
|
||||||
- if !antenna.enabled_config?
|
- if !antenna.enabled_config? && !antenna.stl
|
||||||
.expiration{ title: t('antennas.index.disabled') }
|
.expiration{ title: t('antennas.index.disabled') }
|
||||||
= t('antennas.index.disabled')
|
= t('antennas.index.disabled')
|
||||||
- elsif antenna.expires?
|
- elsif antenna.expires?
|
||||||
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
.filters-list__item__permissions
|
.filters-list__item__permissions
|
||||||
%ul.permissions-list
|
%ul.permissions-list
|
||||||
|
- unless antenna.stl
|
||||||
- unless antenna.antenna_domains.empty?
|
- unless antenna.antenna_domains.empty?
|
||||||
%li.permissions-list__item
|
%li.permissions-list__item
|
||||||
.permissions-list__item__icon
|
.permissions-list__item__icon
|
||||||
|
@ -64,10 +65,9 @@
|
||||||
|
|
||||||
.announcements-list__item__action-bar
|
.announcements-list__item__action-bar
|
||||||
.announcements-list__item__meta
|
.announcements-list__item__meta
|
||||||
- if antenna.enabled_config_raws?
|
|
||||||
- if antenna.stl
|
- if antenna.stl
|
||||||
= t('antennas.index.stl')
|
= t('antennas.index.stl')
|
||||||
- else
|
- elsif antenna.enabled_config_raws?
|
||||||
= t('antennas.index.contexts', contexts: antenna.context.map { |context| I18n.t("antennas.contexts.#{context}") }.join(', '))
|
= t('antennas.index.contexts', contexts: antenna.context.map { |context| I18n.t("antennas.contexts.#{context}") }.join(', '))
|
||||||
- else
|
- else
|
||||||
= t('antennas.errors.empty_contexts')
|
= t('antennas.errors.empty_contexts')
|
||||||
|
|
|
@ -13,6 +13,9 @@
|
||||||
.fields-group.fields-row__column.fields-row__column-6
|
.fields-group.fields-row__column.fields-row__column-6
|
||||||
= f.input :available, wrapper: :with_label, label: t('antennas.edit.available'), hint: false
|
= f.input :available, wrapper: :with_label, label: t('antennas.edit.available'), hint: false
|
||||||
|
|
||||||
|
.fields-row
|
||||||
|
= f.input :stl, wrapper: :with_label, label: t('antennas.edit.stl'), hint: t('antennas.edit.stl_hint')
|
||||||
|
|
||||||
%hr.spacer/
|
%hr.spacer/
|
||||||
%p.hint= t 'antennas.edit.hint'
|
%p.hint= t 'antennas.edit.hint'
|
||||||
%hr.spacer/
|
%hr.spacer/
|
||||||
|
|
|
@ -1019,6 +1019,8 @@ en:
|
||||||
keywords_hint: キーワードは1つあたり最低2文字です。キーワードによる絞り込みを指定した場合、検索許可に対応しているサーバーからの投稿は、検索許可が「公開」以外のものは掲載されなくなります
|
keywords_hint: キーワードは1つあたり最低2文字です。キーワードによる絞り込みを指定した場合、検索許可に対応しているサーバーからの投稿は、検索許可が「公開」以外のものは掲載されなくなります
|
||||||
keywords_raw: Keyword list
|
keywords_raw: Keyword list
|
||||||
list: Destination list
|
list: Destination list
|
||||||
|
stl: Enable stl (Social timeline) mode
|
||||||
|
stl_hint: All of under settings will be ignored, but rejecting subscription settings are ignored
|
||||||
tags_raw: Hashtag list
|
tags_raw: Hashtag list
|
||||||
title: Edit antenna
|
title: Edit antenna
|
||||||
with_media_only: With media only
|
with_media_only: With media only
|
||||||
|
|
|
@ -1016,6 +1016,8 @@ ja:
|
||||||
keywords_hint: キーワードは1つあたり最低2文字です。キーワードによる絞り込みを指定した場合、検索許可に対応しているサーバーからの投稿は、検索許可が「公開」以外のものは掲載されなくなります
|
keywords_hint: キーワードは1つあたり最低2文字です。キーワードによる絞り込みを指定した場合、検索許可に対応しているサーバーからの投稿は、検索許可が「公開」以外のものは掲載されなくなります
|
||||||
keywords_raw: 絞り込むキーワード
|
keywords_raw: 絞り込むキーワード
|
||||||
list: 投稿配置先リスト
|
list: 投稿配置先リスト
|
||||||
|
stl: STL(ソーシャルタイムライン)モードを有効にする
|
||||||
|
stl_hint: STLモードが有効になったアンテナは、全てのフォロワーとローカルタイムラインの発言を流します。STLが有効になっていると、これより下の設定が例外なく全て何もかも無視されます。その代わり購読拒否設定は無視されます。
|
||||||
tags_raw: 絞り込むハッシュタグ
|
tags_raw: 絞り込むハッシュタグ
|
||||||
title: アンテナを編集
|
title: アンテナを編集
|
||||||
with_media_only: メディアのみ
|
with_media_only: メディアのみ
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue