* Wip * Wip * Wip: History * Wip: テストコード作成 * Fix test * Wip * Wip * Wip * Fix test * Wip * Wip * Wip * Wip * なんとか完成、これから動作確認 * spell miss * Change ng rule timings * Fix test * Wip * Fix test * Wip * Fix form * 表示まわりの改善
This commit is contained in:
parent
0779c748a6
commit
7d96d5828e
56 changed files with 2062 additions and 42 deletions
|
@ -4,6 +4,7 @@ class PostStatusService < BaseService
|
|||
include Redisable
|
||||
include LanguagesHelper
|
||||
include DtlHelper
|
||||
include NgRuleHelper
|
||||
|
||||
MIN_SCHEDULE_OFFSET = 5.minutes.freeze
|
||||
|
||||
|
@ -74,7 +75,7 @@ class PostStatusService < BaseService
|
|||
@visibility = :limited if %w(mutual circle reply).include?(@options[:visibility])
|
||||
@visibility = :unlisted if (@visibility == :public || @visibility == :public_unlisted || @visibility == :login) && @account.silenced?
|
||||
@visibility = :public_unlisted if @visibility == :public && !@options[:force_visibility] && !@options[:application]&.superapp && @account.user&.setting_public_post_to_unlisted && Setting.enable_public_unlisted_visibility
|
||||
@visibility = Setting.enable_public_unlisted_visibility ? :public_unlisted : :unlisted unless Setting.enable_public_visibility
|
||||
@visibility = Setting.enable_public_unlisted_visibility ? :public_unlisted : :unlisted if !Setting.enable_public_visibility && @visibility == :public
|
||||
@limited_scope = @options[:visibility]&.to_sym if @visibility == :limited && @options[:visibility] != 'limited'
|
||||
@searchability = searchability
|
||||
@searchability = :private if @account.silenced? && %i(public public_unlisted).include?(@searchability&.to_sym)
|
||||
|
@ -148,6 +149,7 @@ class PostStatusService < BaseService
|
|||
@status = @account.statuses.new(status_attributes)
|
||||
process_mentions_service.call(@status, limited_type: @status.limited_visibility? ? @limited_scope : '', circle: @circle, save_records: false)
|
||||
safeguard_mentions!(@status)
|
||||
validate_status_ng_rules!
|
||||
validate_status_mentions!
|
||||
|
||||
@status.limited_scope = :personal if @status.limited_visibility? && !@status.reply_limited? && !process_mentions_service.mentions?
|
||||
|
@ -218,9 +220,35 @@ class PostStatusService < BaseService
|
|||
raise Mastodon::ValidationError, I18n.t('statuses.contains_ng_words') if (mention_to_stranger? || reference_to_stranger?) && Setting.stranger_mention_from_local_ng && Admin::NgWord.stranger_mention_reject?("#{@options[:spoiler_text]}\n#{@options[:text]}")
|
||||
end
|
||||
|
||||
def validate_status_ng_rules!
|
||||
result = check_invalid_status_for_ng_rule! @account,
|
||||
reaction_type: 'create',
|
||||
spoiler_text: @options[:spoiler_text] || '',
|
||||
text: @text,
|
||||
tag_names: Extractor.extract_hashtags(@text) || [],
|
||||
visibility: @visibility.to_s,
|
||||
searchability: @searchability.to_s,
|
||||
sensitive: @sensitive,
|
||||
media_count: (@media || []).size,
|
||||
poll_count: @options.dig(:poll, 'options')&.size || 0,
|
||||
quote: quote_url,
|
||||
reply: @in_reply_to.present?,
|
||||
mention_count: mention_count,
|
||||
reference_count: reference_urls.size,
|
||||
mention_to_following: !(mention_to_stranger? || reference_to_stranger?)
|
||||
|
||||
raise Mastodon::ValidationError, I18n.t('statuses.violate_rules') unless result
|
||||
end
|
||||
|
||||
def mention_count
|
||||
@text.gsub(Account::MENTION_RE)&.count || 0
|
||||
end
|
||||
|
||||
def mention_to_stranger?
|
||||
@status.mentions.map(&:account).to_a.any? { |mentioned_account| mentioned_account.id != @account.id && !mentioned_account.following?(@account) } ||
|
||||
(@in_reply_to && @in_reply_to.account.id != @account.id && !@in_reply_to.account.following?(@account))
|
||||
return @mention_to_stranger if defined?(@mention_to_stranger)
|
||||
|
||||
@mention_to_stranger = @status.mentions.map(&:account).to_a.any? { |mentioned_account| mentioned_account.id != @account.id && !mentioned_account.following?(@account) } ||
|
||||
(@in_reply_to && @in_reply_to.account.id != @account.id && !@in_reply_to.account.following?(@account))
|
||||
end
|
||||
|
||||
def reference_to_stranger?
|
||||
|
@ -228,12 +256,20 @@ class PostStatusService < BaseService
|
|||
end
|
||||
|
||||
def referred_statuses
|
||||
statuses = ProcessReferencesService.extract_uris(@text).filter_map { |uri| ActivityPub::TagManager.instance.local_uri?(uri) && ActivityPub::TagManager.instance.uri_to_resource(uri, Status, url: true) }
|
||||
statuses = reference_urls.filter_map { |uri| ActivityPub::TagManager.instance.local_uri?(uri) && ActivityPub::TagManager.instance.uri_to_resource(uri, Status, url: true) }
|
||||
statuses += Status.where(id: @reference_ids) if @reference_ids.present?
|
||||
|
||||
statuses
|
||||
end
|
||||
|
||||
def quote_url
|
||||
ProcessReferencesService.extract_quote(@text)
|
||||
end
|
||||
|
||||
def reference_urls
|
||||
@reference_urls ||= ProcessReferencesService.extract_uris(@text) || []
|
||||
end
|
||||
|
||||
def validate_media!
|
||||
if @options[:media_ids].blank? || !@options[:media_ids].is_a?(Enumerable)
|
||||
@media = []
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue