about summary refs log tree commit diff
path: root/app/validators/disallowed_hashtags_validator.rb
blob: ee06b20f6b49bd03f5f71a86daafa4c5dda3a748 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# frozen_string_literal: true

class DisallowedHashtagsValidator < ActiveModel::Validator
  def validate(status)
    return unless status.local? && !status.reblog?

    @status = status
    tags    = select_tags

    status.errors.add(:text, I18n.t('statuses.disallowed_hashtags', tags: tags.join(', '), count: tags.size)) unless tags.empty?
  end

  private

  def select_tags
    tags = Extractor.extract_hashtags(@status.text)
    tags.keep_if { |tag| disallowed_hashtags.include? tag.downcase }
  end

  def disallowed_hashtags
    return @disallowed_hashtags if @disallowed_hashtags

    @disallowed_hashtags = Setting.disallowed_hashtags.nil? ? [] : Setting.disallowed_hashtags
    @disallowed_hashtags = @disallowed_hashtags.split(' ') if @disallowed_hashtags.is_a? String
    @disallowed_hashtags = @disallowed_hashtags.map(&:downcase)
  end
end